11.5 httpd配置

LAMP环境搭建好之后,其实仅仅是安装上了软件,我们还有很多具体的配置工作要做。


默认虚拟主机

一台服务器上的httpd下,是能够跑多个网站、多个域名的。那么每一个网站就是一个虚拟主机。服务器上可以有多个虚拟主机,每个虚拟主机都会定义一个域名,也可以定义多个域名。

假设百度、谷歌都是在你的一台服务器上运行,那么百度是一个虚拟主机、谷歌是另外一个虚拟主机。httpd是支持多个虚拟主机的,,即可以在一个服务器上运行多个站点,标记多个域名。

但是,如果一个没有标记的域名也指向了服务器(域名可以做解析指向,域名解析服务器IP地址是由DNS服务器完成的),那总得有一个处理这个域名的虚拟主机吧,而这个虚拟主机就叫做默认虚拟主机

总之,任何一个域名指向这台服务器,只要是没有对应的虚拟主机,就会由这个默认虚拟主机来处理。 我们要做的是去配置默认虚拟主机。

  • 编辑配置文件httpd.conf(httpd的主配置文件):
# vim /usr/local/apache2.4/conf/httpd.conf# Virtual hosts
#Include conf/extra/httpd-vhosts.conf               #搜索httpd-vhosts,找到这行,删除行首 # 符号。这个是虚拟主机的配置文件
  • 保存主配置文件,然后编辑虚拟主机配置文件:
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf <VirtualHost *:80>ServerAdmin webmaster@dummy-host.example.comDocumentRoot "/usr/local/apache2.4/docs/dummy-host.example.com"ServerName dummy-host.example.comServerAlias www.dummy-host.example.comErrorLog "logs/dummy-host.example.com-error_log"CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost><VirtualHost *:80>ServerAdmin webmaster@dummy-host2.example.comDocumentRoot "/usr/local/apache2.4/docs/dummy-host2.example.com"ServerName dummy-host2.example.comErrorLog "logs/dummy-host2.example.com-error_log"CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>

该文件最后的两段就是虚拟主机的配置,一段对应一个虚拟主机,第一段就是默认虚拟主机的配置。

ServerAdmin      指定管理员邮箱;DocumentRoot     为该虚拟主机站点的根目录,网站的程序就在这个目录下面;ServerName     网站的域名,只能写一个;ServerAlias       网站的第二域名,后面可以写多个,用空格分隔;ErrorLog     站点的错误日志;CustomLog        站点的访问日志。

这里我们定义两个站点:111.com 和 123.com ,用做测试。

  • 修改虚拟主机的配置文件,作如下修改:
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf<VirtualHost *:80>ServerAdmin lzx@abc.comDocumentRoot "/data/wwwroot/abc.com"ServerName abc.comServerAlias www.abc.comErrorLog "logs/abc.com-error_log"CustomLog "logs/abc.com-access_log" common
</VirtualHost><VirtualHost *:80>ServerAdmin lzx@123.comDocumentRoot "/data/wwwroot/123.com"ServerName 123.comServerAlias www.123.comErrorLog "logs/123.com-error_log"CustomLog "logs/123.com-access_log" common
</VirtualHost>
  • 然后做一下其他配置:
# mkdir -p /data/wwwroot/abc.com /data/wwwroot/123.com# vim /data/wwwroot/abc.com/index.php
<?php
echo "abc.com";
?>               #这里最后一行可以省略# vim /data/wwwroot/123.com/index.php
<?php
echo "123.com";
?># /usr/local/apache2.4/bin/apachectl -t                #测试语法
Syntax OK# /usr/local/apache2.4/bin/apachectl graceful              #重新加载配置文件,避免重启;使用 ctrl+r 可以快速地匹配命令历史中的命令# curl -x127.0.0.1:80 www.abc.com                #127.0.0.1是环回地址,指本机
abc.com# curl -x127.0.0.1:80 www.123.com
123.com# curl -x127.0.0.1:80 www.111.com
abc.com

可以看出默认虚拟主机是 abc.com,不管是什么域名指向该服务器,只要配置文件中没有标记,就会访问到这个默认虚拟主机。

另外,如果我们想让真实Windows机器访问这两个网址,可以在Windows上修改hosts文件,该文件的路径是:C:\Windows\System32\drivers\etc\hosts,在hosts文件最下面增加一行:

192.168.100.140 www.123.com              #左边的IP地址为你的linux机器IP


用户认证

如何让没有被标记的域名不被访问呢?那就是在用户访问网站的时候,需要输入用户名密码才能顺利访问。

  • 首先,修改 123.com 这个虚拟主机的配置,如下:
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf<VirtualHost *:80>ServerAdmin lzx@123.comDocumentRoot "/data/wwwroot/123.com" ServerName 123.com<Directory /data/wwwroot/123.com>              #指定认证的目录  AllowOverride AuthConfig              #这个相当于打开认证的开关AuthName "123.com user auth"             #自定义认证的名字,作用不大AuthType Basic             #认证的类型,一般为BasicAuthUserFile /data/.htpasswd              #指定用户与密码文件所在位置require valid-user                #指定需要认证的用户为全部可用用户,即.htpasswd文件里设定的用户</Directory>
</VirtualHost>
  • 上面配置完后,还需要创建密码文件:
# /usr/local/apache2.4/bin/htpasswd -c -m /data/.htpasswd lzx                #htpasswd命令用于创建用户,-c选项是创建、-m选项是使用md5加密算法,lzx是认证用户名
New password:
Re-type new password:
Adding password for user lzx
  • 配置完成后,还需要到宿主机上面修改一下hosts文件,在最下面增加一行:
192.168.100.140 www.123.com
  • 重新加载配置,进行访问测试:
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK# /usr/local/apache2.4/bin/apachectl graceful
# curl -x127.0.0.1:80 123.com -I
HTTP/1.1 401 Unauthorized
Date: Sat, 30 Jun 2018 08:26:28 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.36
WWW-Authenticate: Basic realm="123.com user auth"
Content-Type: text/html; charset=iso-8859-1

直接访问报401错误,401状态码就是需要认证。

# curl -x127.0.0.1:80 -ulzx:1234567 123.com -I
HTTP/1.1 401 Unauthorized
Date: Sat, 30 Jun 2018 08:25:22 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.36
WWW-Authenticate: Basic realm="123.com user auth"
Content-Type: text/html; charset=iso-8859-1

指定用户与密码,故意将密码输入错,也报401错误。

# curl -x127.0.0.1:80 -ulzx:123456 123.com -I
HTTP/1.1 200 OK
Date: Sat, 30 Jun 2018 08:24:33 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.36
X-Powered-By: PHP/5.6.36
Content-Type: text/html; charset=UTF-8

指定用户与密码,密码正确,认证通过,就是报200码。

用浏览器访问是这样:

  • 如果是针对某个目录或者文件进行认证,以123.com为例,可以这样去配置虚拟主机的配置文件:
  1. 对于目录(比如/data/wwwroot/www.123.com/admin/):
将<Directory /data/wwwroot/www.123.com>  改为  <Directory /data/wwwroot/www.123.com/admin/>
  1. 对于文件(比如www.123.com/admin.php):
<VirtualHost *:80>ServerAdmin lzx@123.comDocumentRoot "/data/wwwroot/123.com"ServerName 123.com<FilesMatch admin.php>             #这里将Directory  改为 FilesMatch ,后面也改为要认证的文件AllowOverride AuthConfig   AuthName "123.com user auth"   AuthType Basic      AuthUserFile /data/.htpasswd  require valid-user  </FilesMatch>              #这里将Directory  改为 FilesMatch
</VirtualHost>

配置域名跳转

一个网站可能有多个域名,在这种情况下,我们需要用到域名跳转,这样有两个作用:

  1. 一个站点有多个域名对SEO有影响(百度搜索关键词排名);

  2. 如果之前的域名不再使用了,可以很方便地把老域名做个跳转即可。

  • 启用域名跳转 :是通过Apache的Rewrite模块来实现的(httpd.conf中启用该模块,httpd-vhosts.conf中定义跳转设置)
# /usr/local/apache2.4/bin/apachectl -M|grep -i rewrite              #没有任何输出,需要编辑配置文件# vim /usr/local/apache2.4/conf/httpd.confLoadModule alias_module modules/mod_alias.so
#LoadModule rewrite_module modules/mod_rewrite.so               #搜索rewrite,找到这行,删除行首 # 符号
LoadModule php5_module        modules/libphp5.so
#LoadModule php7_module        modules/libphp7.so# /usr/local/apache2.4/bin/apachectl -t
Syntax OK# /usr/local/apache2.4/bin/apachectl graceful# /usr/local/apache2.4/bin/apachectl -M|grep -i rewrite
rewrite_module (shared)             #有这行输出,就说明正常加载了rewrite模块
  • 做域名跳转需要去配置虚拟主机的配置文件:
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf<VirtualHost *:80>ServerAdmin lzx@123.comDocumentRoot "/data/wwwroot/123.com"ServerName 123.comServerAlias www.111.com ErrorLog "logs/123.com-error_log"CustomLog "logs/123.com-access_log" common# <FilesMatch admin.php>#  AllowOverride AuthConfig#  AuthName "123.com user auth"#  AuthType Basic#  AuthUserFile /data/.htpasswd#  require valid-user# </FilesMatch><IfModule mod_rewrite.c>             #编译Apache的时候,指定了mods=most,会自动加入该模块RewriteEngine on   //打开rewrite功能RewriteCond %{HTTP_HOST} !^123.com$                #定义rewrite条件,当主机名(域名)不是www.123.com 时满足条件(!表示取反)RewriteRule ^/(.*)$ http://123.com/$1 [R=301,L]              #定义rewrite规则,当满足上面的条件时,跳到 http://123.com去</IfModule>
</VirtualHost>

RewriteRule 后面由空格划分成三个部分:
第一部分为当前的URL(网址);
第二部分为要跳转的目标地址;
第三部分为一些选项,要用方括号括起来,301为状态码,表示“永久重定向”(还有一种是302,表示“临时重定向”),L表示“last”,表示跳转一次就结束。

  • 重新加载配置文件:
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK# /usr/local/apache2.4/bin/apachectl graceful
  • 验证跳转测试:
# curl -x127.0.0.1:80 123.com -I
HTTP/1.1 301 Moved Permanently
Date: Sat, 30 Jun 2018 09:08:50 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.36
X-Powered-By: PHP/5.6.36
Content-Type: text/html; charset=UTF-8

配置访问日志

访问日志作用很大,不仅可以记录网站的访问情况,还可以在网站有异常发生时帮助我们定位问题。

  • 要配置httpd访问日志,首先要在主配置文件中定义访问日志的格式,打开主配置文件:
# vim /usr/local/apache2.4/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%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<VirtualHost *:80>ServerAdmin lzx@123.comDocumentRoot "/data/wwwroot/123.com"ServerName 123.comServerAlias www.123.com # ErrorLog "logs/123.com-error_log"# CustomLog "logs/123.com-access_log" common# <FilesMatch admin.php>#  AllowOverride AuthConfig#  AuthName "123.com user auth"#  AuthType Basic#  AuthUserFile /data/.htpasswd#  require valid-user# </FilesMatch><IfModule mod_rewrite.c>   RewriteEngine on   RewriteCond %{HTTP_HOST} !^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
Syntax OK# /usr/local/apache2.4/bin/apachectl graceful# curl -x127.0.0.1:80 123.com -I# tail /usr/local/apache2.4/logs/123.com-access_log
127.0.0.1 - - [30/Jun/2018:22:38:52 +0800] "HEAD HTTP://123.com/ HTTP/1.1" 301 - "-" "curl/7.29.0"

已经生成了日志,并有相关的记录。


访问日志不记录静态文件

apache的访问日志会记录网站每个文件被获取的信息,这样日志信息量会很大,我们排查日志的时候不容易筛选有用的记录。我们可以把静态文件的日志设置为不记录,提高我们排查日志信息的效率。

  • conf/extra/httpd-vhosts.conf配置文件下进行编辑:
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf<VirtualHost *:80>ServerAdmin lzx@123.comDocumentRoot "/data/wwwroot/123.com"ServerName 123.comServerAlias www.123.comSetEnvIf Request_URI ".*\.gif$" img              #定义元素为imgSetEnvIf Request_URI ".*\.jpg$" imgSetEnvIf Request_URI ".*\.png$" imgSetEnvIf Request_URI ".*\.bmp$" imgSetEnvIf Request_URI ".*\.swf$" imgSetEnvIf Request_URI ".*\.js$" imgSetEnvIf Request_URI ".*\.css$" imgErrorLog "logs/123.com-error_log"CustomLog "logs/123.com-access_log" common env=!img             # !表示取反,指定非img的文件才记录日志。
</VirtualHost>
  • 重新加载配置文件:
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK# /usr/local/apache2.4/bin/apachectl graceful

这样再访问访问网站下的图片文件,查看日志就不会再记录图片的访问日志了。


访问日志切割

随着网站访问量的增大,我们网站的访问日志文件也会变得很大,为了保持磁盘空间,方便访问日志的管理(备份、删除历史日志等。),我们可以进行日志切割,每天的访问日志独立切割出来。

  • conf/extra/httpd-vhosts.conf配置文件下进行编辑:
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf<VirtualHost *:80>ServerAdmin lzx@123.comDocumentRoot "/data/wwwroot/123.com"ServerName 123.comServerAlias www.123.comSetEnvIf Request_URI ".*\.gif$" imgSetEnvIf Request_URI ".*\.jpg$" imgSetEnvIf Request_URI ".*\.png$" imgSetEnvIf Request_URI ".*\.bmp$" imgSetEnvIf Request_URI ".*\.swf$" imgSetEnvIf Request_URI ".*\.js$" imgSetEnvIf Request_URI ".*\.css$" imgErrorLog "logs/123.com-error_log"
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%y%m%d.log 86400" common env=!img             #%y%m%d以年月日命名,86400秒即1天切割一次,rotatelogs是apache自带的切割日志工具。
</VirtualHost>

配置静态元素过期时间

浏览器访问网站,获取的图片、css等静态元素会保存在本地电脑缓存文件夹里,我们可以在服务器端设置这些静态元素的过期时间,可以降低服务器的资源消耗,还可以提升用户访问网站的速度
,而这个就涉及到了一个静态文件缓存时长的问题,也叫作“缓存过期时间”。

  • 编辑虚拟主机配置文件(在上面配置的条件下增加下面内容):
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf<IfModule mod_expires.c>
ExpiresActive on                #打开该功能的开关
ExpiresByType image/gif "access plus 1 days"              #gif类型文件的失效时间是1天
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>

上面用到了mod_expires模块。

  • 重新加载配置文件:
# /usr/local/apache2.4/bin/apachectl -M|grep -i expires              #没有任何输出,需要编辑配置文件# vim /usr/local/apache2.4/conf/httpd.confLoadModule env_module modules/mod_env.so
#LoadModule expires_module modules/mod_expires.so               #搜索expires,找到这行,删除行首 # 符号
LoadModule headers_module modules/mod_headers.so# /usr/local/apache2.4/bin/apachectl -t
Syntax OK# /usr/local/apache2.4/bin/apachectl graceful# /usr/local/apache2.4/bin/apachectl -M|grep -i rewrite
rewrite_module (shared)             #有这行输出,就说明正常加载了rewrite模块

更多资料参考:

Apache配置详解

Linux curl命令详解

LAMP环境搭建与配置(二)相关推荐

  1. LAMP环境搭建与配置

    1. 安装MySQL 下载源码包:mysql-5.6.43-linux-glibc2.12-x86_64.tar解压后移动到/usr/local/mysql目录下 #cd /usr/local/src ...

  2. LAMP环境搭建与配置(一)

    LAMP是Linux Apache MySQL PHP的简写,即把Apache.MySQL以及PHP安装在Linux系统上,组成一个环境来运行PHP的脚本语言,通常是网站. Apache是最常用的we ...

  3. LAMP攻略: LAMP环境搭建,Linux下Apache,MySQL,PHP安装与配置

    之前写过一个red hat 9下的LAMP环境的配置,不过由于版本比较旧,很多不适用了. 所以决定写一个新的LAMP环境搭建与配置教程.本配置是在 CentOS-5.3 下 httpd-2.2.11. ...

  4. mysql slave 详细配置_进击的MysqlSlave环境搭建及配置

    一)环境拓扑今天讨论的是mysql集群这一块,资源如下所示:二)Mysql安装配置这里不一一赘述,可以选择源代码编译安装,也可以参考我之前的一篇博文"懒人"速成 一)环境拓扑 二) ...

  5. [网站上线]Lamp环境及其后续配置

    防火墙配置 下面是云天河在腾讯云上配置防火墙的过程, 目前只配置INPUT.OUTPUT和FORWORD都是ACCEPT的规则 一.检查iptables服务状态 首先检查iptables服务的状态 s ...

  6. LAMP环境搭建教程

    这里介绍一下LAMP环境的搭建,即Linux.Apache.MySQL.PHP环境. 一.首先安装操作系统 操作系统:centos6.3       (Linux平台的系统均可尝试) IP地址: 网关 ...

  7. LAMP环境搭建之编译安装指南(php-5.3.27.tar.gz)

    测试环境:CentOS release 6.5 (Final) 软件安装:httpd-2.2.27.tar.gz   mysql-5.1.72.tar.gz   php-5.3.27.tar.gz 1 ...

  8. 生产环境下的LAMP环境搭建

    生产环境下的LAMP环境搭建 V20 学习猿地  ww.lmonkey.com 一.LAMP环境介绍 Web服务器的主要功能是提供网上信息浏览服务.所有网页的集合被称为网站,网站也只有发布到网上才能被 ...

  9. 17. LAMP环境搭建和LNMP环境搭建

    目录 17.1 Linux LAMP环境搭建的前期准备 获取源码包 把软件包传送到Linux服务器上 安装编译工具 关闭RPM包安装的apache和mysql 关闭防火墙和SELinux 关闭不必要的 ...

最新文章

  1. Permission denied
  2. Stringtie进行转录本组装和定量
  3. 内外兼备的企业blog
  4. Elasticsearch之集群脑裂
  5. LeetCode-剑指 Offer 27. 二叉树的镜像
  6. SpringMVC中@GetMapping和@RequestMapping的区别
  7. php正则表达式,数组,函数
  8. Guava的Collections2:过滤和转换Java集合
  9. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
  10. python入门——P34异常处理:你不可能总是对的2
  11. 查看oracle的service name
  12. 压箱底的Android UI开源库(一)
  13. [AMV-GCNs Neurocomputing2021] Adaptive multi-view graph convolutional networks for skeleton-based ac
  14. 虚无世界java路_[AoA3]虚无世界3 (Advent of Ascension 3)
  15. docker-compose的nginx重启失败: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address alread
  16. mysql mtq_Mysql 入门学习指南
  17. (19年最新,操作极简)linux下使用xmind zen破解版
  18. h5 虚拟服务器,h5制作选择虚拟主机还是服务器
  19. java虚拟机内存查看相关命令
  20. NLP Learning | 初识NLP

热门文章

  1. UE4 材质 制作噪声图
  2. 私密计算机,‎加密相册 - 保密计算机私密云相册 on the App Store
  3. 投影、映像(关于直线的对称点)
  4. javascript 向数组添加元素执行效率
  5. JVM详解——内存结构
  6. MySQL基础(八):模糊查询的SQL语句、where条件查询、比较运算符查询、逻辑运算符查询、模糊查询、范围查询、空判断查询
  7. 简约手绘竞聘通用PPT-朴尔PPT
  8. 系统背景描述_2021年申请第一枪!CA系统公布2020-2021文书题目!
  9. javascript实现简单的收藏功能
  10. python如何写二进制乘法_Python二进制乘法。分裂与征服