虚拟主机是一种在单一主机或主机群上,实现多网域服务的方法,可以运行多个网站或服务的技术。
虚拟主机使用特殊的软硬件技术,把一台计算机主机分成一台台“虚拟”的主机,每一台虚拟主机都具有独立的域名和IP地址(或共享的IP地址),具有完整的Internet服务器功能。好比把一座房子分为了若干房间
虚拟主机的关键技术在于,即使在同一台硬件、同一个操作系统上,运行着为多个用户打开的不同的服务器程式,也互不干扰。而各个用户拥有自己的一部分系统资源(文档存储空间、内存、CPU等)。
各个虚拟主机之间完全独立,在外界看来,每一台虚拟主机和一台单独的主机的表现完全相同。所以,这种被虚拟化的逻辑主机被形象地称为“虚拟主机”也叫网站空间。
编辑配置文件 httpd.conf
#vim /usr/local/apache2.4/conf/httpd.conf //搜索关键词httpd.vhost ,找到这行把井号删除
保存主配置文件,然后编译虚拟机配置文件:
# vim /usr/local/apache2.4/conf/extra/hpptd-vhsts.conf
//这个配置文件就是主配置文件了,后面操作都是在这个里面完成的
<VirtualHost *:80>
ServerAdmin admin@aminglinux.com
DocumentRoot “ /data/wwwroot/aming.com”
ServerName aming.com
ServerAlias www.aming.com
Errorlog “/logs/aming.com-error_log”
CustomLog “ logs/aming.com-access_log ”common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot “/data/wwwroot/www.123.com”
ServerName www.123.com
</VirtualHost>
# mkdir -p /data/wwwroot/aming.com /data/wwwroot/www.123.com
#echo “aming.com” > /data/wwwroot/aming.com/index.html //网页默认主页就是index.html
# echo “123.com” > /data/wwwroot/123.com/index.html
#/usr/local/apache2.4/bin/apachectl -t
#/usr/local/apache2.4/bin/apachectl graceful //这个操作是重新加载httpd服务,避免重启
#curl -x127.0.0.1:80 aming.com
Aming.com
#curl -x127.0.0.1:80 www.123.com
123.com
#curl -x127.0.0.1:80 www.abc.com
Aming.com
#vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot “ /data/wwwroot/www.123.com”
ServerName www.123.com
<Directory /data/wwwroot/www.123.com> //指定认证目录
AllowOverride AuthConfig //这个相当于打开认证的开关
AuthName “123.com user auth” //自定义认证名字 ,作用不大
AuthType Basic //认证的类型,一般为Basic
AuthUserFile /data/.htpasswd //指定密码文件所在位置
Require valid-user //指定需要认证的用户为全部可用用户
</Directory>
</VirtualHost>
配置文件完成,但还需要创建密码文件。
#/usr/local/apache2.4/bin/htpasswd -cm /data/.htpasswd aming
// htpasswd命令为创建用户的工具, -c为create -m指定密码加密方式为MD5
// /data/.htpasswd为密码文件,aming为要创建的用户,第一次执行该命令需要加-c
// 第二次创建新用户时,就不用加-c了
否则/data/.htpasswd文件就会被重置,之前的用户被清空
# /usr/local/apache2.4/bin/apachectl -t
//验证没有问题后才能重启或者重新加载
# /usr/local/apache2.4/bin/apachectl graceful
配置完成后需要到宿主机上去修改一下hosts文件,类似linux上的/etc/hosts 把www.123.com域名指向你的这台linux机器 这样才能通过浏览器访问到www.123.com
#192.168.195.135 www.123.com
//左边的ip地址为你的linux IP ,
保存hosts文件后,就可以用浏览器进行访问 www.123.com。
输入用户和密码将会进入www.123.com 。上面操作是针对整个站点做的认证,其实也可以针对某个目录或者某个文件进行认证,比如要对www.123.com/admin目录进行认证,只需要修改一个地方,把<Directory /data/wwwroot/www.123.com>改为<Directory /data/wwwroot/www.123.com/admin>。如果是一个文件,比如www.123.com/admin.php
<VirtualHost *:80>
DocumentRoot “ /data/wwwroot/www.123.com”
ServerName www.123.com
<FilesMatch admin.php>
AllowOverride AuthConfig
AuthType Basic
AuthName “123.com user auth”
AuthUserFile /data/.htpasswd
require valid-user
</FileMatch>
</VirtualHost>
但这样会有一个问题 ,网址中带有admin.php的链接都会弹出认证窗口
2.3域名跳转
把 123.com 域名跳转到www.123.com 下, 配置如下 :
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#<VirtualHost *:80>
# DocumentRoot "/data/wwwroot/www.123.com"
# ServerName www.123.com
#ServerAlias 123.com
#<IfModule mod_rewrite.c> //需要mod_rewrite模块支持
# RewriteEngine on //打开rewrite
# RewriteCond %{HTTP_HOST} !^www.123.com$
//定义rewrite的条件,当主机名(域名)不是www.123.com时满足条件
# RewriteRule ^/(.*)$ http://123.com/$1 [R=301,L]
//定义rewrite规则,当满足上面条件时,这条规矩才会执行
# </IfModule>
#</VirtualHost>
# /usr/local/apache2.4/bin/apachectl -M|grep -i rewrite
//如果没有任何输出,则需要编译配置文件
# vim /usr/local/apache2.4/conf/httpd.conf
//搜索rewrite ,找到那行把前面的#删除
# /usr/local/apache2.4/bin/apachectl graceful
#/usr/local/apache2.4/bin/apachectl graceful -M |grep -i rewrit
配置完后,进行测试,在这里用curl就可以看到效果
#curl -x127.0.0.1:80 -I 123.com
2.4访问日志
#vim /usr/local/apache2.4/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
%h为访问网站ip;%l为远程登录名,这个字段上基本为-;%u为用户名,当使用用户认证时,这个字段为认证的用户名;%t为时间;%r为请求的动作(比如curl -I时九尾HEADE);%s为请求的状态码,写成%>s为最后的状态码;%b为传输数据大小;%{Referer}i为referer信息(请求本地上一次的地址就为referer);%{User-Agent}i为浏览器标识
#vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把123.com虚拟主机改写如下
#<VirtualHost *:80>
# DocumentRoot "/data/wwwroot/www.123.com"
# ServerName www.123.com
#ServerAlias 123.com
#<IfModule mod_rewrite.c>
# RewriteEngine on
# RewriteCond %{HTTP_HOST} !^www.123.com$
# RewriteRule ^/(.*)$ http://123.com/$1 [R=301,L]
# </IfModule>
# CustomLog "logs/123.com-access_log" combined
#</VirtualHost>
# /usr/local/apache2.4/bin/apachectl -t
# /usr/local/apache2.4/bin/apachectl graceful
#curl -x127.0.0.1:80 -I 123.com
#tail /usr/local/apache2.4/logs/123.com-access_log
发现生成日志并且有相关日志
限制图片js css 等静态文件写入到日志中,防止日志文件过大
#vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#<VirtualHost *:80>
# DocumentRoot "/data/wwwroot/www.123.com"
# ServerName www.123.com
# ServerAlias 123.com
#<IfModule mod_rewrite.c>
# RewriteEngine on
# RewriteCond %{HTTP_HOST} !^www.123.com$
# RewriteRule ^/(.*)$ http://123.com/$1 [R=301,L]
#</IfModule>
#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.4/bin/rotatelogs -l logs/123.com-access_%Ym%d.log 86400"combined env=!image-request
</VirtualHost>
先定义了一个image-request环境变量,把gif、jpg、 png、bmp. swf、js、 Css等格式的文件全部归
类到image- request里,后面的env=!image-request有用到- -个"!", 这相当于取反了,意思是把image . request以外的类型文件记录到日志里。
# /usr/local/apache2.4/bin/apachectl -t
# /usr/local/apache2.4/bin/apachectl graceful
#curl -x127.0.0.1:80 /logs/ //再次访问 才会生成新的日志
# ls /usr/local/apache2.4/logs
#touch /data/wwwroot/www.123.com/aming.jpg
#touch /data/wwwroot/www.123.com/aming.txt
# curl -x127.0.0.1:80 www.123.com/aming.jpg
# curl -x127.0.0.1:80 www.123.com/aming.txt
# cat /usr/local/apache2.4/logs/132.com-access_20170318.log //查看日志
2.5访问日记不记录静态文件
2.6访问日记切割
静态元素过期时间
配置防盗链
#vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#<VirtualHost *:80>
# DocumentRoot "/data/wwwroot/www.123.com
# ServerName www.123.com
# ServerAlias 123.com
# CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Ym%d.log 86400"combined
# <Directory /data/wwwroot/www.123.com>
# SetEnvIfNoCase Referer "http://www.123.com" local_ref
# SetEnvIfNoCase Referer "http://123.com " local_ref
# SetEnvIfNoCase Referer "^$" local_ref
# <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
# Order Allow,Deny
# Allow from env=local_ref
# </filesmatch>
# </Directory>
#</VirtualHost>
# /usr/local/apache2.4/bin/apachectl -t
# /usr/local/apache2.4/bin/apachectl graceful
# curl -x127.0.0.1:80 -I -e “http:// www.123.com/123.txt ”http://www.123.com/aming.jpg
# curl -x127.0.0.1:80 -I -e “http://www.1234.com/1.txt” http://www.123.com/aming.jpg
# curl -x127.0.0.1:80 -I -e “http://www.1234.com/1.txt” http://www.123.com/index.html
访问控制Diretory
访问控制Diretory\FileMatch
限制某个目录禁止解析PHP
也可以单独针对某个文件来做限制:
<Directory /data/wwwroot/www.123.com>
<Filesmatch “admin.php(.*)”>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Filesmatch>
</Directory>
为了避免让黑客拿到服务器权限,我们需要把能上传文件的目录直接禁止解析PHP代码(不用担心会影响网站访问,若这种目录也需要解析PHP,那说明程序员不合格)配置如下
#<VirtualHost *:80>
# DocumentRoot "/data/wwwroot/www.123.com
# ServerName www.123.com
# ServerAlias 123.com
# CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Ym%d.log 86400"combined
# <Directory /data/wwwroot/www.123.com/upload>
# php_admin_flag engine off
# </Directory>
#</virtualHost>
# /usr/local/apache2.4/bin/apachectl -t
# /usr/local/apache2.4/bin/apachectl graceful
#cp /usr/local/apache2.4/htdocs/1.php /data/wwwroot/www.123.com/upload/
#curl -x127.0.0.1:80 www.123.com/upload/1.php
这说明1.php是不能正常解析的
多台电脑同时访问一个网站会耗尽服务器资源,从而使之不能正常工作。我们可以通过限制user_agent发挥防攻击作用。
修改user_agent
#vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //编辑虚拟主机配置文件
//内容改为如下
#<VirtualHost *:80>
# DocumentRoot "/data/wwwroot/www.123.com"
# ServerName www.123.com
# ServerAlias 123.com
# CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400"combined
# <IfModule mod_rewrite.c>
# RewriteEngine on
# RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
# RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
# RewriteRule .* - [F]
# </IfModule>
#</VirtualHost>
# /usr/local/apache2.4/bin/apachectl -t
# /usr/local/apache2.4/bin/apachectl graceful
# curl -I -x127.0.0.1:80 www.123.com/ipload/1.php
#curl -A “123123” -I -x127.0.0.1:80 www.123.com/upload/1.php
Curl -A 选项指定user_agent 第一个请求,user_agent“curl/7.29”匹配了第一个条件,所以会403;杜尔哥请求,user_agent以自定义的“123123”没有匹配任何条件,所以状态码为200
原文:https://www.cnblogs.com/y0620/p/12107977.html