Apache默认虚拟主机
一台服务器能够访问多个网站,每一个网站都是一个虚拟主机
任何一个域名解析到这台机器,均可以访问的虚拟主机就是默认虚拟主机
这里安装的apache版本为2.4,安装目录为/usr/local/apache2.4/,Apache的主配置文件为javascript
/usr/local/apache2.4/conf/httpd.conf
apache网站的根目录默认在/usr/loca/apache2.4/htdocs下,这个是由apache的主配置文件httpd.conf定义的,能够自行修改,打开apache的主配置文件httpd.conf搜索DocumentRoot字段,能够看到php
DocumentRoot "/usr/local/apache2.4/htdocs"
主机域名在httpd.conf里面由ServerName字段定义,默认是注释掉的,打开它,也能够自定义域名css
ServerName www.example.com:80
可是,这样就有一个问题,一个配置了LAMP的linux服务器,只能跑一个网站。
要想跑多个网站,只能关闭主配置文件下的主机域名和网站文件后,作多个虚拟主机,而多个虚拟主机中的第一个被默认为默认虚拟主机。html
在主配置文件下打开虚拟主机配置文件,主配置文件就失效了java
在主配置文件下找到如下字段,把Include conf/extra/httpd-vhosts.conf注释去掉,打开虚拟主机配置文件linux
[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 )
打开虚拟主机配置文件就能配置多个网站域名web
[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都表示一个虚拟主机,每个虚拟主机都对应一个域名算法
对虚拟主机配置文件作配置:apache
<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,ServerNamevim
写虚拟主机配置文件:
<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