Apache 虚拟主机配置
1. Apache用户认证
将网站中的文件夹设置成需要账户、密码访问的方式;如访问"www.chenyu.com/abc/12.txt
"将abc文件夹内容设置成需要使用账户密码访问的方式;
1.1 创建路径、文件
创建abc/12.txt文件夹和内容
[root@CentOS-1 www]# mkdir abc
[root@CentOS-1 www]# cd abc
[root@CentOS-1 abc]# ls -a
. ..
[root@CentOS-1 abc]# cp /etc/passwd ./12.txt
[root@CentOS-1 abc]# ls -a
. .. 12.txt
1.2 设置虚拟主机配置文件
[root@CentOS-1 abc]#vim /usr/local/apache/conf/extra/httpd-vhosts.conf //虚拟主机配置文件
#### 添加相关配置参数内容
<VirtualHost *:80>
#ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/data/www"
ServerName www.chenyue.com
ServerAlias www.123qwe.com
#ErrorLog "logs/dummy-host.example.com-error_log"
#CustomLog "logs/dummy-host.example.com-access_log" common
<Directory /data/www/abc> //需要设置的文件夹路径,此项Directory内容为添加的内容
Allowoverride AuthConfig
AuthName "自定义的" //密码提示
AuthType Basic
AuthUserFile /data/.htpasswd //存放用户名和密码的文件位置
require valid-user
</Directory>
</VirtualHost>
1.3 Apache 扩展
将apache配置命令/usr/local/apache/bin/apachectl
缩写成apachectl
[root@CentOS-1 abc]# vim /etc/profile.d/path.sh
#!/bin/bash
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/apache/bin
[root@CentOS-1 abc]# !source
source /etc/profile.d/path.sh
1.4 创建文件夹访问的用户、密码文件
[root@CentOS-1 abc]# htpasswd -c /data/.htpasswd user1 //创建用户user1
New password: //创建密码
Re-type new password: //确认密码
Adding password for user user1
[root@CentOS-1 abc]# cat /data/.htpasswd
user1:$apr1$FM4Db9bq$dEpnyenuZeDqG1vdxO9Hm. //加密后的密码
#### 创建第二个用户的话,不用-c
[root@CentOS-1 abc]# htpasswd /data/.htpasswd user2 //然后根据提示输入密码即可,-c 会替换掉user1的文件的
New password: //创建用户user2 密码
Re-type new password:
Adding password for user user2 //确认用户密码
[root@CentOS-1 abc]# apachectl -t //查看配置是否有错
Syntax OK
[root@CentOS-1 abc]# apachectl graceful //重新加载apache配置
2. 设置默认虚拟主机
设置默认虚拟主机文件为空后,使用IP或其他 未定义的域名将会无法访问,只有使用定义的域名访问才可以的
[root@CentOS-1 ~]# mkdir /tmp/123
[root@CentOS-1 ~]# chmod 600 /tmp/123
[root@CentOS-1 ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
#### 在虚拟主机配置文件前,添加个不存在的虚拟主机;第一个主机虚拟主机为默认的。
<VirtualHost *:80>
DocumentRoot "/tmp/123"
ServerName 111.com
</VirtualHost>
#### 检查配置、重新启动Apache
[root@CentOS-1 ~]# apachectl -t
Syntax OK
[root@CentOS-1 htdocs]# apachectl restart
3. 域名301跳转
Pr 权重
修改配置虚拟主机中的配置文件,添加rewrite_module (shared)配置参数,实现301跳转
[root@CentOS-1 ~]# apachectl -M
rewrite_module (shared) //调用这个配置模块实现301跳转
[root@CentOS-1 ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerName www.chenyue.com
DocumentRoot "/data/www"
ServerAlias www.123qwe.com
#ErrorLog "logs/dummy-host.example.com-error_log"
#CustomLog "logs/dummy-host.example.com-access_log" common
<IfModule mod_rewrite.c> //由此配置文件实现跳转;
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.chenyue.com$ [OR] //OR 是“或者”的意思,没有这个OR 是指“并且”;
RewriteCond %{HTTP_HOST} ^www.chenyue.com$
RewriteRule ^/(.*)$ http://www.123qwe.com$1 [R=301,L] //^开始 R=301 指跳转类型,L 指结束;
</IfModule>
<Directory /data/www/abc>
Allowoverride AuthConfig
AuthName "自定义的"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</Directory>
</VirtualHost>
#### 检查配置、重新启动Apache
[root@CentOS-1 ~]# apachectl -t
Syntax OK
[root@CentOS-1 htdocs]# apachectl restart
跳转类型: 301永久重定向,对浏览器、搜索引擎是比较友好的,302临时跳转;
4. Apache 日志
4.1 预置日志格式
主配置文件中预置日志格式有combined、common两种,具体样式如下:
[root@CentOS-1 ~]# vim /usr/local/apache/conf/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
···
%u
用户 %t
时间 %r
动作 %{Referer}i\
被访问的地址 %{User-Agent}i\
浏览器的标识`
4.2 开启日志、并设置日志类型
开启ErrorLog 错误日志和CustomLog 访问日志 并将CustomLog日志设置成combined
类型
[root@CentOS-1 ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/www"
ServerName www.chenyue.com
ServerAlias www.123qwe.com
#ErrorLog "logs/dummy-host.example.com-error_log" // 错误日志
#CustomLog "logs/dummy-host.example.com-access_log" common // 访问日志
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.123qwe.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.cy-a.com$
RewriteRule ^(.*)$ http://www.chenyue.com$1 [R=301,L]
</IfModule>
<Directory /data/www/abc>
Allowoverride AuthConfig
AuthName "自定义的"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</Directory>
</VirtualHost>
[root@CentOS-1 ~]# apachectl -t
Syntax OK
[root@CentOS-1 ~]# apachectl graceful
[root@CentOS-1 ~]# cd /usr/local/apache/logs
[root@CentOS-1 logs]# ls -a
. .. access_log chenyue.com-error_log chneyua.com-access_log error_log httpd.pid
[root@CentOS-1 logs]#
4.3 tail 查看增加的内容
[root@CentOS-1 logs]# tail chenyue.com-access_log |grep -v static //不显示static内容的条目
[root@CentOS-1 logs]# wc -l chenyue.com-access_log //查看文件中有多少条内容
174 chenyue.com-access_log
4.4 切割日志文件
ErrorLog "logs/chenyue.com-error_log"
CustomLog "| /usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/chenyue.com-access_%Y%m%d_log 86400" combine
| /usr/local/apache/bin/rotatelogs -l
切割日志的工具,后面日志的路径;将相对路径改成绝对路径; 并添加日期%Y%m%d
、 86400 是时间(秒为单位),这里指一天切割一次。
4.4 不记录指定文件类型的日志
虚拟主机文件访问日志前,添加标记文件,如下:
ErrorLog "logs/chenyue.com-error_log"
SetEnvIf Request_URI ".*\.gif$" image-request //下列文件为允许的文件,最后使用 env=!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/apache/bin/rotatelogs -l /usr/local/apache/logs/chenyue.com-access_%Y%m%d_log 86400" combined env=!image-request
5. Apache 配置静态缓存
5.1 虚拟主机配置文件
日志条目下增加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 image/css "now plus 2 hours"
ExpiresByType application/x-javascript"now plus 1 days"
ExpiresByType application/x-shockwave-flash "now plus 1 days"
ExpiresDefault "now plus 0 min"
</IfModule>
5.2 验证方式
[root@CentOS-1 logs]# curl -x127.0.0.1:80 'http://www.chenyue.com/static/image/common/logo.png' -I
HTTP/1.1 200 OK
Date: Sat, 10 Dec 2016 08:31:30 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Last-Modified: Tue, 31 May 2016 03:08:36 GMT
ETag: "60a69-1149-5341ab0597500"
Accept-Ranges: bytes
Content-Length: 4425
Cache-Control: max-age=86400 // max-age=86400 是缓存时间
Expires: Sun, 11 Dec 2016 08:31:30 GMT
Content-Type: image/png
6. Apache 配置防盗链
虚拟主机中增加以下配置文件,即可开启防盗链;防止他人调用自己网站的图片等。(可以避免网站带宽过多被他人调用资源占用)
SetEnvIfNoCase Referer "^http://.*\.chenyue\.com" local_ref // '\'脱异符号,^使用的是正则表达式
SetEnvIfNoCase Referer "^.*\chenyue\.com" local_ref //允许调用的链接白名单,自己的域名一定要添加上
#SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)"> //限制调用的文件类型
Order Allow,Deny
Allow from env=local_ref //满足上面条件的允许
#Deny from all //全部禁用,网站本身也失效,这里关闭
</filesmatch>
7. Apache 访问控制
7.1 配置文件
主配置文件中获取模板,在虚拟主机配置文件中添加以下配置参数(Allow允许的、Deny不允许的)
<Directory "/data/www">
AllowOverride None
Options None
Order allow,deny //条件顺序:先 allow 、再 deny ,顺序可颠倒
Allow from all //允许所有的条件通过
deny from 127.0.0.1 //限制127.0.0.1 的Ip
</Directory>
7.2 测试验证
[root@CentOS-1 ~]# curl -x127.0.0.1:80 -I www.chenyue.com
HTTP/1.1 403 Forbidden // 403 说明配置已经生效了、301 跳转 正常、200 正常
Date: Sat, 10 Dec 2016 16:03:13 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Content-Type: text/html; charset=iso-8859-1
8. 白名单(Apache 访问控制)
可以设置网站的相关管理界面等,固定IP访问,提高安全性;
8.1 配置文件
添加以下配置文件,访问有admin
字符的链接,只有127.0.0.1的Ip允许访问
<FilesMatch "^(.*)admin(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1 //白名单中允许的IP
</FilesMatch>
8.2 测试验证
测试的是Discuz论坛的管理设置界面访问
[root@CentOS-1 ~]# curl -x192.168.0.106:80 -I http://www.chenyue.com/admin.php
HTTP/1.1 403 Forbidden
Date: Sat, 10 Dec 2016 16:16:58 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Content-Type: text/html; charset=iso-8859-1
[root@CentOS-1 ~]# curl -x127.0.0.1:80 -I http://www.chenyue.com/admin.php
HTTP/1.1 200 OK
Date: Sat, 10 Dec 2016 16:19:31 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
···
9. Apache 安全策略
9.1 Apache 禁止解析php
上传到服务器文件夹中的文件(如:论坛上传的图片等) 可能存在安全隐患(上传的文件中包含木马病毒等,可以获取服务器相关配置等),所以需要设置相关文件夹的php禁止解析等限制;
虚拟主机中添加以下配置文件,关闭php解析和控制访问路径
<Directory "/data/www/data"> //需要配置禁止解析的文件夹路径
php_admin_flag engine off //关闭php解析
<FilesMatch "^(.*)php"> //关闭data文件夹下的文件访问
Order deny,allow
Deny from all
Allow from 127.0.0.1 //这里是允许访问的IP 但是无法解析,测试使用,正常可以删除
</FilesMatch>
</Directory>
9.2 Apache 禁止指定user_agent
user_agent
指的是用户访问的浏览类型等(正常体现在访问日志中);这里禁用指定user_agent
可以用作禁止部分搜索引擎的爬虫访问,导致的带宽浪费,如禁用 360、搜狗、有道等搜索引擎;
在虚拟主机文件中添加下列配置内容即可
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.123qwe.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.cy-a.com$
RewriteRule ^(.*)$ http://www.chenyue.com$1 [R=301,L]
RewriteCond %{HTTP_USER_AGENT} ^.*curl.* [NC,OR] //这里添加user_agent 标识
RewriteCond %{HTTP_USER_AGENT} ^.*chrome* [NC]
RewriteRule ^.* - [F] //将符合标识的访问终止(拒绝)
</IfModule>
9.3 Apache通过rewrite限制某个目录
禁止访问网站域名链接下的某个文件夹,如某个文件夹中存放着非常重要的缓存文件,不愿意让别人访问;
虚拟主机IfModule mod_rewrite.c
配置文件中添加以下配置内容;如:条件^.*/tmp/.* [NC]
识别到tmp相关字符的文件夹,直接终止终止跳转;访问网站下的/tmp文件夹内容直接会403报错
RewriteCond %{REQUEST_URI} ^.*/tmp/.* [NC]
RewriteRule ^.* - [F]