Web服务器-Apache

Web服务器-Apache

web服务简介

# HTML语言:
	超文本标记语言,使用html语言编写的文本叫超文本,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
# HTTP协议:超文本传输协议
	HTTP使用统一资源标识符(URL)来建立连接和传输数据。是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议。
# URL:统一资源定位符
	统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
# 格式:
	http://www.kernel.com:80/image/a.jpg
# 知识拓展:
	URI:统一资源标志符,URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。

Apache详解

概述

	Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python/php等解释器编译到服务器中。

	Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。

工作模式

Apache一共有3种稳定的MPM模式(MPM:多进程处理模块),它们分别是 'prefork'、'worker'、'event'.

prefork 工作模式

# 一个主进程 多个工作进程 一个工作进程一个线程 一个线程维持一个连接
	Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求,。
# 预加载进程:
	有用户请求直接处理,减少创建进程上时间的浪费,缩短进程创建时间,减少用户等待时间
# 优点:
	成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
# 缺点:
	一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。

worker 工作模式

# 一个主进程 多个工作进程 一个工作进程管理多个线程 一个线程维持一个连接
	使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
# keep-alive功能:
	连接成功后,保证仍然持续连接的时间
	减少重复创建TCP连接的次数,针对频繁连接服务器的客户端
# 优点:
	占据更少的内存,高并发下表现更优秀。
# 缺点:
	必须考虑线程安全的问题。

event 工作模式

	它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

	HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的。

apache工作模式查看:

$ httpd -V | grep -i "server mpm"

指定工作模式方式:

在编译时,在选项中指定,--with-mpm=xxx

相关文件保存位置(有报错尝试看日志分析)

配置文件位(主配置文件include调用子配置文件)

# 源码包安装:
	/usr/local/apache2/etc/httpd.conf(主配置文件) 	
	/usr/local/apache2/etc/extra/*.conf(子配置文件)
# rpm包安装: 
	/etc/httpd/conf/httpd.conf
httpd-autoindex.conf             # 别名                  
httpd-dav.conf 
httpd-default.conf 
httpd-info.conf
httpd-languages.conf 
httpd-manual.conf httpd-mpm.conf		     #预先开启多少个子进程 
httpd-multilang-errordoc.conf httpd-ssl.conf 
httpd-userdir.conf 
httpd-vhosts.conf proxy-html.conf

网页文件位置

# 源码包安装: 
	/usr/local/apache2/htdocs/ 
# rpm包安装:
	/var/www/html/

日志文件位置:

# 源码包安装:
	/usr/local/apache2/logs/ 
# rpm包安装: 
	/var/log/httpd/

配置文件详解

注意:apache配置文件严格区分大小写
$ vim /usr/local/apache2/etc/httpd.conf

针对主机环境的基本配置参数

ServerRoot /usr/local/apache2        #apache主目录 
Listen :80                    #监听端口 
Listen 192.168.190.111:80          # 监听本机的某个网卡 
LoadModule php7                 #加载的相关模块 
User Group                     #用户和组 
ServerAdmin                     #管理员邮箱 
ServerName           #服务器名(没有域名解析时,使用临时解析。默认不开启) 
ErrorLog "logs/error_log"           # 服务器错误日志 
CustomLog "logs/access_log" common(日志格式)       #访问记录日志 DirectoryIndex index.html index.php      #默认网页文件名,优先级顺序 
Include  etc/extra/httpd-vhosts.conf      #子配置文件中内容也会加载生效

主页目录及权限

DocumentRoot "/usr/local/apache2/htdocs"     #网页文件存放目录(默认)
<Directory "/usr/local/apache2/htdocs">      #定义指定目录的权限    
	Options Indexes FollowSymLinks       
    	None           #没有任何额外权限        
    	All            #所有权限(除去MultiViews以外)        
    	Indexes      #浏览权限(当此目录下没有默认网页文件时,显示目录内容)
    	FollowSymLinks     #准许软链接到其他目录    
	MultiViews        #准许文件名泛匹配(需要手动开启模块才有效negotiation)
	AllowOverride None         #定义是否允许目录下.htaccess文件中的权限生效
		None                       #.htaccess中权限不生效
      All                        #文件中所有权限都生效
      AuthConfig                 #文件中,只有网页认证的权限生效
      Require all granted(denied #访问控制列表 
</Directory>
<IfModule dir_module>     #此标签用来指定访问到指定目录时自动加载哪个页面文件
	DirectoryIndex index.php index.html       #可以写多个,但是有优先级之分
</IfModule>

准许文件名泛指:(去掉后缀)

(https://img2020.cnblogs.com/blog/2268716/202103/2268716-20210320104409087-1843003803.png)

取消注释:重启apache服务

在abc目录下添加

编辑内容

不需要写zhangsan.html就可以,只需写zhangsan就行

FollowSymLinks可以使用软链接

/下创建一个目录,并软链接到网页文件存放目录下,建立一个文件

证明 FollowSymLinks准许软链接到其他目录

拒绝所有允许某个

<Directory "/data/www/xxoo"> 
Options All AllowOverride None 
Order Deny,Allow 
Deny From all 
Allow From 192.168.0.0/24 
Allow From 127.0.0.1 Allow 
From xx.xx.xx.xx/28 
</Directory>

Apache实验

实验环境:建议使用之前搭建好的lamp环境进行试验测试

Apache的目录别名

	当apache接受请求时,在默认情况下会将DocumentRoot目录中的文件送到客户端,如果想将某一不在DocumentRoot目录中的'文件共享到网站上',并希望将它们'留在本来位置'而不需要进行移动的话,处理这种情况可以通过'建立别名的方式将URL指向特定的目录'.

编辑主配置文件

$ vim /usr/local/apache2/etc/httpd.conf  
	Include etc/extra/httpd-autoindex.conf  #去掉注释,开启调用子配置文件

编辑子配置文件添加别名

# 创建/wyy1目录,并在目录内添加一个1.jpg图片,修改自配置文件,添加别名
$ vim /usr/local/apache2/etc/extra/httpd-autoindex.conf  
	alias /icons/ "/usr/local/apache2/icons/"  
	alias /wyy/ "/wyy1/"
	结构:别名 "真实目录" 	# 真实目录的结尾要有/,否则报错  
	<Directory "/usr/local/apache2/icons"> 
		Options Indexes FollowSymLinks 
		AllowOverride None 
		Require all granted  
	</Directory>
	
	<Directory "/wyy1/"> 
		Options Indexes FollowSymLinks 
		AllowOverride None 
		Require all granted
	</Directory>

# 可以根据模板编写一个自己需要的目录别名

重启 服务apache

$ service apache restart

浏览器查看:

192.168.66.11/wyy/1.jpg

Apache的用户认证

	有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户身份认证。

编辑配置文件

$ vim /usr/local/apache2/etc/httpd.conf

在需要进行登录认证的目录标签中加入如下配置:(在主配置文件末尾处添加)

<Directory "/usr/local/apache2/htdocs/blog/admin">  # 声明被保护目录 
Options Indexes FollowSymLinks 
AllowOverride All            # 开启权限认证文件.htaccess 
Require all granted: 
</Directory>

在指定目录下创建权限文件

# 切换到需要保护的目录下,创建 .htaccess文件,并添加下面的内容
$ cd /usr/local/apache2/htdocs/blog/admin
$ vim .htaccess 
AuthName "Welcome to blog" # 提示信息 
AuthType basic # 加密类型 
AuthUserFile /usr/local/apache2/etc/blog.passwd # 密码文件,文件名自定义。(使用绝对路径) 
require valid-user # 允许密码文件中所有用户访问

建立密码文件,加入允许访问的用户。(此用户和系统用户无关)

$ /usr/local/apache2/bin/htpasswd -c /usr/local/apache2/etc/blog.passwd zhangsan # -c  建立密码文件,只有添加第一个用户时,才能-c 
$ /usr/local/apache2/bin/htpasswd -m /usr/local/apache2/etc/blog.passwd lisi 
# -m  再添加更多用户时,使用-m 参数
注意: htpasswd 该命令是httpd的命令,需要绝对路径

重启apache服务

$ /usr/local/apache2/bin/apachectl -t 
$ /usr/local/apache2/bin/apachectl stop 
$ /usr/local/apache2/bin/apachectl start
# 先检查配置是否正确,然后通过浏览器输入要访问的资源时就会提示输入密码了。
$ http://192.168.66.11/blog/admin

虚拟主机(重点)

	虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。
# 虚拟主机的分类:
	'基于IP的虚拟主机':一台服务器,多个ip,搭建多个网站
	'基于端口的虚拟主机':一台服务器,一个ip,搭建多个网站,每个网络使用不同端口访问
	'基于域名的虚拟主机':一台服务器,一个ip,搭建多个网站,每个网站使用不同域名访问

基于域名的虚拟主机

实验准备:
# 域名解析:准备两个域名
ww.sohu.com
www.sina.com
#使用本地hosts文件进行解析
$ etc/hosts
C:\Windows\System32\drivers\etc\hosts
192.168.190.111 www.sohu.com
192.168.190.111 www.sina.com
192.168.190.111	blog.hfxx.com
192.168.190.111	bbs.hfxx.com
# 网站主页目录规划
在/htdocs/目录下分别创建sohu 和 sina 两个目录,并在新建目录内创建index.html文件(分别写不一样的内容)
实验步骤:
修改主配置文件开启文件关联
$ vim /usr/local/apache2/etc/httpd.conf  
	Include etc/extra/httpd-vhosts.conf #此行取消注释
编辑子配置文件,编写虚拟主机标
$ vim /usr/local/apache2/etc/extra/httpd-vhosts.conf  
添加下方内容,有几个虚拟主机就写几组(添加之前先把原先存在的示例删除掉)  <Directory "/usr/local/apache2/htdocs/sina">        
	Options Indexes FollowSymLinks        
	AllowOverride None        
	Require all granted  
</Directory>  
#目录权限标签根据需要自行添加  
<VirtualHost 192.168.88.10:80>    #虚拟主机标签       
	ServerAdmin webmaster@sina.com  #管理员邮箱        
	DocumentRoot "/usr/local/apache2/htdocs/sina"  #网站主目录 
	ServerName www.sina.com                  #完整域名 
	ErrorLog "logs/sina-error_log"           #错误日志       
	CustomLog "logs/sina-access_log" common   #访问日志 
</VirtualHost>
<Directory "/usr/local/apache2/htdocs/sina">        
	Options Indexes FollowSymLinks        
	AllowOverride None        
	Require all granted 
</Directory> 
<VirtualHost 192.168.190.111:80>         
	ServerAdmin webmaster@sina.com         
	DocumentRoot "/usr/local/apache2/htdocs/sina"         
	ServerName www.sina.com         
	ErrorLog "logs/sina-error_log"         
	CustomLog "logs/sina-access_log" common 
</VirtualHost>
重启服务,验证结果
$ /usr/local/apache2/bin/apachectl -t

Windows 下:浏览器下输入两个不同的域名验证网页内容(提前修改windows的hosts文件
Linux下:通过elinks/curl命令验证:elinks/curl URL地址(提前修改Linux的hosts文件)
	192.168.190.111 www.sohu.com   sohu
	192.168.190.111 www.sina.com  sina
	192.168.190.111	blog.hfxx.com  blog
	192.168.190.111	bbs.hfxx.com bbs

域名跳转

一个站点难免会有多个域名,而多个域名总得有一个主次,比如我的网站可以用两个域名访问:www.sina.com 和 www.sohu.cn 但大家发现不管我用哪个域名访问,最终都会跳转到www.sina.com 上来。这个行为就叫做域名跳转,状态码:301是永久跳转,302是临时跳转,网站上一定要设置为301,这样对搜索引擎是比较友好的。
192.168.190.111 www.sohu.com   sohu
192.168.190.111 www.sina.com  sina
192.168.190.111	blog.hfxx.com  blog
192.168.190.111	bbs.hfxx.com bbs

实验条件

(基础就是虚拟主机的配置要配好才能做下面的实验)

虚拟主机能正常访问
# 打开主配置文件搜索关键词mod_rewrite开启重写模块
$ vim /usr/local/apache2/etc/httpd.conf LoadModule rewrite_module modules/mod_rewrite.so #取消注释

实验步骤:

修改子配置文件的虚拟主机配置文件(开启Sohu的 .htaccess配置文件的开关)
$ vim /usr/local/apache2/etc/extra/httpd-vhosts.conf <Directory "/usr/local/apache2/htdocs/sohu">      		Options Indexes FollowSymLinks      				AllowOverride All  # 开启跳转规则    
	Require all granted 
</Directory>
创建规则匹配文件(去sohu的网页根目录下创建跳转文件)
$ vim /usr/local/apache2/htdocs/sohu/.htaccess
# 在指定的网站目录下创建文件,并添加以下内容
	RewriteEngine on
# 开启rewrite功能:
	RewriteCond %{HTTP_HOST} ^www.sohu.com
# 把以www.sina.com 开头的内容赋值给HTTP_HOST变量
	RewriteRule  ^(.*)$  http://blog.hfxx.com/$1 [R=permanent,L]
# ^(.*)$ 指代客户端要访问的资源
# $1 把 .* 所指代的内容赋值到$1变量中
# R=permanent 永久重定向 = 301
# L 指定该规则为最后一条生效的规则,以后的不再生效
重启服务器并测试
$ /usr/local/apache2/bin/apachectl -t 
$ /usr/local/apache2/bin/apachectl stop 
$ /usr/local/apache2/bin/apachectl start
# 通过上述测试,发现无论是sina或sohu最终都是访问到www.sina.com域名上来则试验成功
关于blog网站域名跳转后网站内容不显示样式问题的解决方案
\1. 打开下面页面登录到后台的管理界面

\2. 点击设置,点击基本

\3. 将站点地址内容修改为目前hosts文件中解析的域名保存即可

\4. 然后重新使用浏览器测试 新旧域名的访问是否能跳转 , 并且能正常加载样式

Apache+openssl实现https(重点)

	HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,用于安全的HTTP数据传输。这个系统被内置于浏览器中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
# HTTPS 分类:
	单向认证:
		非对称加密:
			证书:认证服务器域名是否合法,加密堆成加密秘钥
			秘钥:解密证书,得到对称加密秘钥
		对称加密:
			加密算法:明文传递
			加密密钥:证书加密
	双向认证:

准备工作:

# 检查Apache是否支持SSL,检查相应模块是否安装,若安装则将模块启用
模块存放目录:/usr/local/apache2/modules
检查模块是否启用:apachectl -M (过滤不到,说明模块没有启用)
$ /usr/local/apache2/bin/apachectl -M | grep -i ssl
1.查看所有可用模块,可以看到mod_ssl.so文件
$ cd /usr/local/apache2/modules ls *ssl*
2.打开主配置文件搜索mod_ssl.so,取消注释,打开ssl模块的调用
$ vim /usr/local/apache2/etc/httpd.conf

CA证书申请:(放在指定目录下)

$ cd /usr/local/apache2/etc mkdir ssl cd ssl
# 在指定的目录内生成私钥,证书等。
$ openssl genrsa -out httpd.key 1024
# 建立服务器私钥,生成RSA私钥
$ openssl req -new -key httpd.key -out httpd.csr
# 需要依次输入国家,地区,城市,组织,组织单位,Email等信息。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书
注意:common name 要写你的域名(bbs.hfxx.com)
$ openssl x509 -req -days 365 -sha256 -in httpd.csr -signkey httpd.key -out httpd.crt
#使用CA服务器签发证书,设置证书的有效期等信息
注意1:生成完秘钥和证书文件后,将文件存放在Apache的安装目录下的ssl目录下
注意2:在生产环境中必须要在https证书厂商注册(否则浏览器不识别

配置文件修改:

# 打开主配置文件调用ssl模块,并启用ssl独立配置文件
$ vim /usr/local/apache2/etc/httpd.conf 
	LoadModule ssl_module modules/mod_ssl.so   #取消注释 
	Include etc/extra/httpd-ssl.conf           #取消注释
# 修改conf/extra/httpd-ssl.conf配置文件,调用证书等文件
$ vim /usr/local/apache2/etc/extra/httpd-ssl.conf
# 添加 SSL 协议支持协议,去掉不安全的协议
	SSLProtocol all -SSLv2 -SSLv3
# 修改加密套件如下(搜索mod_ssl,将原有的注释掉,添加下面的)
	SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM    		SSLHonorCipherOrder on
#证书公钥配置(签字的)
	SSLCertificateFile /usr/local/apache2/etc/ssl/httpd.crt
#证书私钥配置
	SSLCertificateKeyFile /usr/local/apache2/etc/ssl/httpd.key

修改主配置文件,添加虚拟主机

原图

修改为:

结果验证

$ /usr/local/apache2/bin/apachectl -t        #检查配置文件语法
# 报错提示
	AH00526: Syntax error on line 78 of /usr/local/apache2/etc/extra/httpd-ssl.conf:
	SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).
# 解决方案
要么不调用此模块,要么让调用的模块加载上
调用模块进入主配置文件,'搜索mod_socache_shmcb,取消注释调用'
$ vim /usr/local/apache2/etc/httpd.conf

# apachectl restart #重启apache,

$ /usr/local/apache2/bin/apachectl stop 
$ /usr/local/apache2/bin/apachectl start

测试:

http://bbs.hfxx.com # 测试是否可以使用https访问
https://bbs.hfxx.com
http 端口80   https 端口443

强制跳转https

	有些时候为了安全,网站不允许使用http访问,仅允许使用https访问,目的是为了更加安全
在http部分的目录权限标签中添加一下内容
$ vim /usr/local/apache2/etc/extra/httpd-vhosts.conf  # 在bbs标签中添加一下3条

<Directory "/usr/local/apache2/bbs">
	Options Indexes FollowSymLinks        
	AllowOverride None        
	Require all granted   
	RewriteEngine on       #开启转发规则    
	RewriteCond %{SERVER_PORT} !^443$  #检查访问端口只要目标不是443的
	RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L] #全都使用https重新访问 
</Directory>

语法检查

$ /usr/local/apache2/bin/apachectl -t        #检查配置文件语法

重启服务

$ /usr/local/apache2/bin/apachectl stop 
$ /usr/local/apache2/bin/apachectl start

测试

http://bbs.hfxx.com
直接从http 跳到https

Apache日志切割

RPM安装包的日志轮替机制:

yum -y install httpd安装后在/etc/logrotate.d的目录下,会出现一个httpd的文件,是rpm包安装的httpd的日志轮替机制。

设置日志的路径名

$ vim /usr/local/apache2/etc/httpd.conf
# 编辑添加内容如下:
	ErrorLog "logs/error.log" CustomLog "logs/access.log" combined
# 指定了日志存放在/usr/local/apache2/logs目录下分别为error.log和access.log,combined为日志显示的格式,日志格式可以参考配置文件httpd.conf中格式的指定,如下:
	LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" 		combined LogFormat "%h %l %u %t \"%r\" %>s %b" common

设置apache日志分割

$ vim /usr/local/apache2/etc/httpd.conf
# 错误日志修改
	ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400" 
# 正确日志修改
	CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined

可以修改日志生成时间,重启服务,进行测试

日志轮替管理脚本:

#!/bin/bash #确定轮替周期 
crontab -e  0 4 * * 1 /bin/bash httpd-logrotate.sh #每星期 一的4点 
#!/bin/bash #切换目录 
cd /usr/local/apache2/logs/ #改将日志文件改名保存
mv access_log access-%Y%m%d_log 
#热重启: 
pkill -HUP httpd

不记录指定文件类型的日志

配置日志不记录图片的访问

$ vim /usr/local/apache2/etc/httpd.conf
# 相关配置为:(在正确日志上面添加)
SetEnvIf Request_URI ".*\.gif$" image-request 
SetEnvIf Request_URI ".*\.jpg$" image-request 
SetEnvIf Request_URI ".*\.png$" image-request 
SetEnvIf Request_URI ".*\.bmp$" image-request 
SetEnvIf Request_URI ".*\.swf$" image-request 
SetEnvIf Request_URI ".*\.js$" image-request 
SetEnvIf Request_URI ".*\.css$" image-request 
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined env=!image-request
说明:在原来的访问日志配置基础上,增加了一些image-request的定义,比如把gif、jpg、bmp、swf、js、css等结尾的全标记为image-request,然后在配置日志后加一个标记env=!image-request,表示取反。

Apache配置静态缓存

静态文件指的是图片、js、css等文件,用户访问一个站点,其实大多数元素都是图片、js、css等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。

配置静态缓

$ vim /usr/local/apache2/etc/httpd.conf
#搜索mod_expires.c文件 取消注释并启用,然后将下面的内容粘贴到文件末尾
<IfModule mod_expires.c> #此模块默认未启用,请手动启用   
	ExpiresActive on   
	ExpiresByType image/gif "access plus 1 days"   
	ExpiresByType image/jpeg "access plus 24 hours"   
	ExpiresByType image/png "access plus 24 hours"   
	ExpiresByType text/css "now plus 2 hours"   
	ExpiresByType application/x-javascript "now plus 2 hours"   
	ExpiresByType application/javascript "now plus 2 hours"   
	ExpiresByType application/x-shockwave-flash "now plus 2 hours"   				ExpiresDefault "now plus 0 min" 
</IfModule>

或者使用 mod_headers 模块实现:该模块默认启用

<IfModule mod_headers.c>
  # htm,html,txt 类的文件缓存一个小时
  <filesmatch "\.(html|htm|txt)$">
		 header set cache-control "max-age=3600"
  </filesmatch>
  # css, js, swf 类的文件缓存一个星期
  <filesmatch "\.(css|js|swf)$">
  header set cache-control "max-age=604800"
  </filesmatch>
  # jpg,gif,jpeg,png,ico,flv,pdf 等文件缓存一年
  <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
    header set cache-control "max-age=29030400"
  </filesmatch>
</IfModule>
说明:这里的时间单位可以 days、 hours 甚至是 min,两种不同的方法,上面使用的是mod_expires,而下面用的是 mod_headers,要想使用这些模块,必须要事先已经支持。
# 查看是否支持,使用命令:
$ /usr/local/apache2/bin/apachectl -M

重启服务器并验证

$ /usr/local/apache2/bin/apachectl -t 
$ /usr/local/apache2/bin/apachectl stop 
$ /usr/local/apache2/bin/apachectl start
# 验证:
$ curl -x127.0.0.1:80 'http://www.sohu.com/image/a.jpg' -I 
$ curl -x127.0.0.1:80 'http://192.168.190.111/a.jpg' -I 修改后
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2016 03:51:26 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Last-Modified: Tue, 31 May 2016 03:08:36 GMT
ETag: "46891b-16b-5341ab0597500"
Accept-Ranges: bytes
Content-Length: 363
Cache-Control: max-age=86400
Expires: Thu, 27 Oct 2016 03:51:26 GMT
Content-Type: image/jpg

禁止解析PHP

	某个目录下禁止解析PHP,这个很有作用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件,为了避免上传的文件有木马,所以我们禁止这个目录下面的访问解析PHP。

配置禁止解析php(在主配置文件内添加)

举例:

$ cd /usr/local/apache2/htdocs
$ mkdir imgupload 
$ vim imgupload/a.php

写入数据测试

$ vim /usr/local/apache2/etc/httpd.conf
# 添加下列内容
<Directory /usr/local/apache2/htdocs/imgupload>  (imgupload为目录名)   			php_admin_flag engine off   
	<filesmatch "(.*)php">     
	Order deny,allow  # deny在allow前表示拒绝所有,否则为允许     
	Deny from all   
	</filesmatch> 
</Directory>

重启httpd测试。

192.168.66.11

拓展:将自己的文件传到虚拟主机的网页根目录下。(ftp本地身份登录验证模式)

安装vsftp

$ yum -y install vsftpd

创建用户指定家目录(会有提示已存在,直接回车就行)

useradd -s /sbin/nologin -d /usr/local/apache2/htdocs/sohu/ sohu 
useradd -s /sbin/nologin -d /usr/local/apache2/htdocs/sina/ sina 
useradd -s /sbin/nologin -d /usr/local/apache2/htdocs/blog/ blog 
useradd -s /sbin/nologin -d /usr/local/apache2/htdocs/bbs/ bbs
当提示家目录已存在,不用管

查看/etc/passwd文件,可以看到已经有了4个用户

$ tail /etc/passwd

打开主配置文件/etc/vsftpd/vsftpd.conf

$ vim /etc/vsftpd/vsftpd.conf

取消chroot_local_user=YES 选项注释

启动vsftpd,并设置文开机自启

$ service vsftpd start 
$ chkconfig vsftpd on

添加用户密码

echo "123456" | passwd --stdin sohu 
echo "123456" | passwd --stdin sina 
echo "123456" | passwd --stdin blog 
echo "123456" | passwd --stdin bbs

利用windows直接测试能否登陆,

可以看出权限有问题

修改网页根目录下

(/usr/local/apache2/htdocs)所有的文件www有权限,其次利用acl权限让各个用户对自己的家目录拥有写的权限。

cd /usr/local/apache2/htdocs 
chown -R www.www * 
setfacl -m u:sohu:rwx sohu/ 
setfacl -m u:sina:rwx sina/ 
setfacl -m u:blog:rwx blog/ 
setfacl -m u:bbs:rwx bbs/

windows重新测试,可以进入自己的网页根目录下,进行上传修改下载文件。

授权某一账户远程登录数据库(phpmyadmin数据库)

将/usr/local/apache2/htdoc/phpmyadmin移动到sina目录下(相当于变成xina的某一个项目)

cd /usr/local/apache2/htdocs/ 
mv phpmyadmin/ sina/

用浏览器登录:


posted @ 2020-04-22 01:04  候你已久  阅读(160)  评论(0)    收藏  举报