Apache默认虚拟主机
一台服务器可以访问多个网站,每个网站都是一个虚拟主机
任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机
这里安装的apache版本为2.4,安装目录为/usr/local/apache2.4/,Apache的主配置文件为
/usr/local/apache2.4/conf/httpd.conf
apache网站的根目录默认在/usr/loca/apache2.4/htdocs下,这个是由apache的主配置文件httpd.conf定义的,可以自行修改,打开apache的主配置文件httpd.conf搜索DocumentRoot字段,可以看到
DocumentRoot "/usr/local/apache2.4/htdocs"
主机域名在httpd.conf里面由ServerName字段定义,默认是注释掉的,打开它,也可以自定义域名
ServerName www.example.com:80
但是,这样就有一个问题,一个配置了LAMP的linux服务器,只能跑一个网站。
要想跑多个网站,只能关闭主配置文件下的主机域名和网站文件后,做多个虚拟主机,而多个虚拟主机中的第一个被默认为默认虚拟主机。
在主配置文件下打开虚拟主机配置文件,主配置文件就失效了
在主配置文件下找到以下字段,把Include conf/extra/httpd-vhosts.conf注释去掉,打开虚拟主机配置文件
[root@localhost ~]# vim /usr/local/apache2.4/conf/httpd.conf
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
打开后主配置文件失效,我们可以在虚拟主机配置文件里面定义多个主机
虚拟主机配置文件(/usr/local/apache2.4/conf/extra/httpd-vhosts.conf )
打开虚拟主机配置文件就能配置多个网站域名
[root@localhost ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache2.4/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/usr/local/apache2.4/docs/dummy-host2.example.com"
ServerName dummy-host2.example.com
ErrorLog "logs/dummy-host2.example.com-error_log"
CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>
每一个VirtualHost都表示一个虚拟主机,每一个虚拟主机都对应一个域名
对虚拟主机配置文件做配置:
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com //管理员的邮箱
DocumentRoot "/usr/local/apache2.4/docs/dummy-host.example.com" //网站根目录
ServerName dummy-host.example.com //网站的域名
ServerAlias www.dummy-host.example.com //网站的别名
ErrorLog "logs/dummy-host.example.com-error_log" //错误日志
CustomLog "logs/dummy-host.example.com-access_log" common //访问日志
</VirtualHost>
定义一个网站的主要的两个参数DocumentRoot,ServerName
写虚拟主机配置文件:
<VirtualHost *:80>
DocumentRoot "/data/www/abc.com"
ServerName abc.com
ServerAlias www.abc.com www.123.com
ErrorLog "logs/abc.com-error_log"
CustomLog "logs/abc.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/www/111.com"
ServerName 111.com
ServerAlias www.111.com www.222.com
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
创建目录
[root@localhost ~]# mkdir /data/www/
[root@localhost ~]# mkdir /data/www/abc.com
[root@localhost ~]# mkdir /data/www/111.com
编写索引面的内容
[root@localhost ~]# vim /data/www/abc.com/index.php
<?php
echo "abc.com";
?>
[root@localhost ~]# vim /data/www/111.com/index.php
<?php
echo "111.com";
?>
检查配置文件有没有出错
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
重新加载配置文件
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful
用curl命令测试
-x 指定代理IP地址
[root@localhost ~]# curl -x192.168.66.131:80 abc.com
abc.com
[root@localhost ~]# curl -x192.168.66.131:80 111.com
111.com
在配置之前先要了解htpasswd
命令描述
htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。
命令语法
htpasswd [option] [参数]
命令选项
-c:=create,创建一个加密文件
-n:不更新加密文件,只将更新后的用户名密码显示在屏幕上
-m:使用MD5算法对密码进行加密(默认)
-d:使用CRYPT算法对密码进行加密
-p:不对密码进行加密,即明文密码
-s:使用SHA算法对密码进行加密
-b:在命令行一并输入用户名和密码,而不是根据提示输入密码
-D:删除指定用户
需求,针对网站的某个目录做用户验证:
1,编辑虚拟主机配置文件
[root@localhost ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/www/111.com"
ServerName 111.com
ServerAlias www.111.com www.222.com
<Directory /data/www/111.com> //指定认证的目录
AllowOverride AuthConfig //这个相当于打开认证的开关
AuthName "111.com user auth" //自定义认证的名字,作用不大
AuthType Basic //认证的类型,一般为Basic
AuthUserFile /data/.htpasswd //指定密码文件所在位置
require valid-user //指定需要认证的用户为全部可用用户
</Directory>
ErrorLog "logs/111.com-error_logo"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
说明:在配置的时候最好把说明去除,以防报错
2,用apache自带的htpasswd命令创建“httpd-vhosts.conf”中指定的密码文件
[root@localhost ~]# /usr/local/apache2.4/bin/htpasswd -c -m /data/.htpasswd luo
New password:
Re-type new password:
Adding password for user luo
[root@localhost ~]# cat /data/.htpasswd
luo:$apr1$Z/ftoVQB$r6HudDUUmv4StGfSmOyYM/
说明:在“/data/.htpasswd”为用户luo创建一个使用MD5算法加密的密码文件。
3,重新加载
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful
4,测试
使用curl进行测试
[root@localhost ~]# curl -x192.168.66.131:80 111.com
HTTP/1.1 401 Authorization Required //说明:因为生成了密码,所以在不指定用户名和密码的情况下会报401错误
Date: Thu, 28 Jun 2018 14:48:52 GMT
Server: Apache/2.4.27 (Unix) DAV/2 PHP/5.6.30
WWW-Authenticate: Basic realm="111.com user auth"
Content-Type: text/html; charset=UTF-8
[root@localhost ~]# curl -x192.168.66.131:80 -luo:luo 111.com -I //使用-u指定用户名和密码再次输入
HTTP/1.1 200 OK
Date: Thu, 28 Jun 2018 14:50:21 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
说明:输入用户名和密码之后即可访问。
需求:针对单个文件进行认证,更改如下
[root@localhost ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwr/111.com"
ServerName 111.com
ServerAlias www.111.com www.222.com
<FilesMatch admin.php> //针对admin.php文件进行认证
AllowOverride AuthConfig
AuthName "111.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</FilesMatch>
ErrorLog "logs/111.com-error_logo"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
域名跳转分类及区别
种类
301表示永久跳转;302表示临时跳转
区别
使用效果不同
302跳转是暂时的跳转,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。
301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。
SEO使用方式不同 在搜索引擎优化中302跳转被众多黑帽SEO优化人员追求,对网站进行恶意302跳转至非用户目标访问网站,因此搜索引擎对于网站的302跳转通常是比较不友好,所以要慎用302跳转!
SEO
SEO(Search Engine
Optimization)搜索引擎优化,在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中的关键词自然排名,获得更多流量,从而达成网站销售及品牌建设的预期目标。
具体步骤如下
需求,把111.com域名跳转到www.222.com,配置如下:
1,先检查httpd有没有加载rewrite_module模块,若无该模块,需要编辑配置文件httpd.conf,删除rewrite_module (shared) 前面的#
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -M|grep -i rewrite
rewrite_module (shared)
2,编辑虚拟主机配置文件
[root@localhost ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/www/111.com"
ServerName 111.com
ServerAlias www.111.com
<IfModule mod_rewrite.c> //需要mod_rewrite模块支持
RewriteEngine on //打开rewrite功能
RewriteCond %{HTTP_HOST} !^www.222.com$ //定义rewrite的条件,如果主机名(域名)不是111.com
RewriteRule ^/(.*)$ http://www.222.com/$1 [R=301,L] //定义rewrite规则,当满足上面的条件时,跳转到www.222.com,301表示永久跳转;302表示临时跳转。
</IfModule>
ErrorLog "logs/111.com-error_logo"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
注:把说明去掉
3,重新加载并检查系统配置
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful
4,测试
[root@localhost ~]# curl -x192.168.66.131:80 111.com -I
HTTP/1.1 301 Moved Permanently
Date: Thu, 28 Jun 2018 08:48:07 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Location: http://www.222.com/
Content-Type: text/html; charset=iso-8859-1
可以看到已经跳转111.com已经跳转到了www.222.com
apache的日志默认是在安装目录的logs目录下
[root@localhost ~]# ls /usr/local/apache2.4/logs/
access_log error_log httpd.pid
可以看到有访问日志、错误日志、pid
访问日志记录用户的每一个请求,在主配置文件httpd.conf定义了两种日志格式,combined和common两种格式,默认使用common格式
[root@localhost ~]vim /usr/local/apache2.4/conf/httpd.conf //搜索LogFormat
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 使用identd时才会有信息,一般情况下都是-
%u 远程用户(从验证获取到的)
%t 收到请求时的时间
%r 请求的首行
%s 服务器端返回的状态码
%b 除HTTP头以外的返回的字节数
%{Referer}i 从那个页面链接跳转到的此页面
%{User-agent}i 用户的User-Agent
把虚拟主机配置中定义访问日志和格式
改成如下:
<VirtualHost *:80>
DocumentRoot "/data/111"
ServerName www.111.com
ServerAlias 111.com
CustomLog "logs/111.com-access_log" combined
</VirtualHost>
重新加载配置文件 -t,graceful
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful
用curl访问下,再查看下日志
[root@localhost ~]# curl -x192.168.66.131:80 -I 111.com
HTTP/1.1 200 OK
Date: Thu, 28 Jun 2018 09:24:49 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=GBK
[root@localhost ~]# tail /usr/local/apache2.4/logs/111.-access_log
192.168.66.131 - - [28/Jun/2018:17:24:49 +0800] "HEAD HTTP://111.com/ HTTP/1.1" 200 - "-" "curl/7.29.0
网站大多为静态网页,网页内部的图片、css文件等同样有其网址链接,如果不设置,这些无效的信息也将被存入访问日志中,会导致访问日志文件大小快速增加,占用大量存储空间。我们可以通过设置不记录某些文件来减少无效信息,节省内存资源。
步骤如下,编辑虚拟主机配置文件,增加下面的信息:
[root@localhost ~]# vi /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/111"
ServerName www.111.com
ServerAlias 111.com
SetEnvIf Request_URI ".*\.gif$" img
SetEnvIf Request_URI ".*\.jpg$" img
SetEnvIf Request_URI ".*\.png$" img
SetEnvIf Request_URI ".*\.bmp$" img
SetEnvIf Request_URI ".*\.swf$" img
SetEnvIf Request_URI ".*\.js$" img
SetEnvIf Request_URI ".*\.css$" img
CustomLog "logs/111.com-access_log" combined env=!img
</VirtualHost>
重新加载配置文件 -t, graceful
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful
创建images目录,并在这目录下上传一个图片
[root@localhost ~]# mkdir /data/111/images
[root@localhost ~]# ll !$
ll /data/111/images
total 76
-rw-r--r-- 1 root root 76730 Jun 28 17:38 123.jpg
用curl访问这个图片,再查看日志
[root@localhost ~]# curl -x192.168.66.131:80 -I 111.com/images/123.jpg
HTTP/1.1 200 OK
Date: Thu, 28 Jun 2018 09:40:28 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Last-Modified: Thu, 28 Jun 2018 09:38:32 GMT
ETag: "12bba-56fb07e9a7dc4"
Accept-Ranges: bytes
Content-Length: 76730
Content-Type: image/jpeg
[root@localhost ~]tail /usr/local/apache2.4/logs/111.com-access_log
可以看到并没有记录日志
日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件,使用apache自带的rotatelogs命令可以做日志切割
把虚拟主机配置文件改成如下:
<VirtualHost :80>
DocumentRoot "/data/111"
ServerName www.111.com
ServerAlias 111.com
SetEnvIf Request_URI "..gif$" img
SetEnvIf Request_URI "..jpg$" img
SetEnvIf Request_URI "..png$" img
SetEnvIf Request_URI "..bmp$" img
SetEnvIf Request_URI "..swf$" img
SetEnvIf Request_URI "..js$" img
SetEnvIf Request_URI "..css$" img
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
重新加载配置文件 -t, graceful
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful
用curl测试并查看日志有没有切割
[root@localhost ~]# curl -x192.168.66.131:80 -I 111.com
HTTP/1.1 200 OK
Date: Thu, 28 Jun 2018 09:45:23 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=GBK
[root@localhost ~]# ls /usr/local/apache2.4/logs/
111.-access_log 111.com-access_log error_log
111.com-access_20180628.log access_log httpd.pid
可以看到有个带日期的日志,说明日志已经做了切割
浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了
在虚拟主机增加配置
<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 hour"
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>
需要expires_module
curl测试,看cache-control: max-age
扩展
apache虚拟主机开启php的短标签 http://ask.apelearn.com/question/5370
apache日志记录代理IP以及真实客户端IP http://ask.apelearn.com/question/960
apache只记录指定URI的日志 http://ask.apelearn.com/question/981
apache日志记录客户端请求的域名 http://ask.apelearn.com/question/1037
apache 日志切割问题 http://ask.apelearn.com/question/566
原文:http://blog.51cto.com/13736286/2133840