文章目录

  • 一、讲在 Apache 之前
  • 二、Apache 详解
    • 2.1 概述
    • 2.2 工作模式
      • 修改方式:
    • 2.3 相关文件保存位置
    • 2.4 配置文件详解
    • 2.5 Apache 实验
      • 2.5.1 Apache 的目录别名
      • 2.5.2 Apache 的用户认证
      • 2.5.3 虚拟主机(重点)
        • 实验准备:
        • 试验步骤:
      • 2.5.4 域名跳转
      • 2.5.5 Apache+openssl 实现 https(重点)
      • 2.5.6 Apache 日志切割
      • 2.5.7 不记录指定文件类型的日志
      • 2.5.8 Apache 配置静态缓存
      • 2.5.8 Apache 禁止解析 PHP

一、讲在 Apache 之前

  • HTML语言: 超文本标记语言,使用html语言编写的文本叫超文本,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
  • HTTP协议: 超文本传输协议HTTP使用统一资源标识符(URL)来建立连接和传输数据。是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议。
  • URL: 统一资源定位符,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
    格式:
    http://www.baidu.com:80/image/a.jpg

URI:统一资源标志符,URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。

二、Apache 详解

2.1 概述

  • Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python/php等解释器编译到服务器中。
  • Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。

2.2 工作模式

Apache一共有3种稳定的MPM模式(MPM:多进程处理模块),它们分别是 prefork、worker、event

  • prefork 工作模式
    Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
    优点: 成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
    缺点: 一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。

  • worker 工作模式
    使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
    优点: 占据更少的内存,高并发下表现更优秀。
    缺点: 必须考虑线程安全的问题。
  • event 工作模式
    它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能
    力。

    HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的,但不能在HTTPS访问下工作。

查看方式:

[root@localhost ~]$ httpd -V | grep -i "server mpm"

指定方式:
在编译时,在选项中指定,--with-mpm=工作模式
修改的话:在configure时,可以通过指定参数,将工作模式设置为worker模式或prefork模式。
使用命令:./configure –with-mpm=worker

修改方式:

[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
Include conf/extra/httpd-mpm.conf (去掉该行前面的注释符号"#")[root@localhost ~]$ vim /usr/local/apache2/etc/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>#服务器启动时建立的子进程数量StartServers          5 #空闲子进程的最小数量,默认5;如果当前空闲子进程数少于MinSpareServers ,那么Apache将会产生新的子进程。此参数不要设的太大。MinSpareServers       5  #空闲子进程的最大数量,默认10;如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程会杀死多余的子进程。此参数也不需要设置太大,如果你将其设置比 MinSpareServers 小,Apache会自动将其修改为MinSpareServers+1。MaxSpareServers      10#限定服务器同一时间内客户端最大接入的请求数量,默认是150;任何超过了该限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务。MaxClients          150#每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。若该值设置为非0值,可以防止运行PHP导致的内存泄露。MaxRequestsPerChild   0
</IfModule>####################################################<IfModule mpm_worker_module>#服务器启动时建立的子进程数量StartServers          2#限定服务器同一时间内客户端最大接入的请求数量,默认是150;任何超过了该限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务。MaxClients          150#空闲子进程的最小数量MinSpareThreads      25#空闲子进程的最大数量MaxSpareThreads      75 #每个子进程产生的线程数量ThreadsPerChild      25#每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。将该值设置为非0值,可以防止运行PHP导致的内存泄露。MaxRequestsPerChild   0
</IfModule>####################################################<IfModule mpm_worker_module>#服务器启动时建立的子进程数量StartServers             3#空闲子进程的最小数量MinSpareThreads         75#空闲子进程的最小数量MaxSpareThreads        250#每个子进程产生的线程数量ThreadsPerChild         25#限定服务器同一时间内客户端最大接入的请求数量,默认是150;任何超过了该限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务。MaxRequestWorkers      400#每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。将该值设置为非0值,可以防止运行PHP导致的内存泄露。MaxRequestsPerChild   0
</IfModule>

2.3 相关文件保存位置

配置文件位置:
  源码包安装: PREFIX/etc/httpd.conf(主配置文件)
         PREFIX/etc/extra/*.conf(子配置文件)
  rpm包安装: /etc/httpd/conf/httpd.conf

网页文件位置:
  源码包安装: PREFIX/htdocs/
  rpm包安装: /var/www/html/

日志文件位置:
  源码包安装:PREFIX/logs/
  rpm包安装:/var/log/httpd/

2.4 配置文件详解

注意:apache配置文件严格区分大小写

针对主机环境的基本配置参数

ServerRoot /usr/local/apache2    #apache主目录
Listen :80                       #监听端口
LoadModule php7                  #加载的相关模块
User
Group                  #用户和组
ServerAdmin            #管理员邮箱
ServerName             #服务器名(没有域名解析时,使用临时解析。默认不开启)
ErrorLog "logs/error_log"             #服务器错误日志
CustomLog "logs/access_log" common    #访问记录日志
DirectoryIndex index.html index.php   #默认网页文件名,优先级顺序
Include etc/extra/httpd-vhosts.conf   #子配置文件中内容也会加载生效

主页目录及权限

DocumentRoot "/usr/local/apache2/htdocs"
#网页文件存放目录(默认)
<Directory "/usr/local/apache2/htdocs">#定义指定目录的权限Options Indexes FollowSymLinksNone            #没有任何额外权限All             #所有权限(除去MultiViews以外)Indexes         #浏览权限(当此目录下没有默认网页文件时,显示目录内容)FollowSymLinks  #准许软连接到其他目录MultiViews      #准许文件名泛匹配(需要手动开启模块才有效negotiation)AllowOverride None#定义是否允许目录下.htaccess文件中的权限生效None           #.htaccess中权限不生效All            #文件中所有权限都生效AuthConfig     #文件中,只有网页认证的权限生效Require all granted(denied) #访问控制列表
</Directory><IfModule dir_module> #此标签用来指定访问到指定目录时自动加载哪个页面文件DirectoryIndex index.php index.html #可以写多个,但是有优先级之分
</IfModule>

2.5 Apache 实验

实验环境: 建议使用之前搭建好的 lamp 环境进行试验测试

2.5.1 Apache 的目录别名

当 apache 接受请求时,在默认情况下会将 DocumentRoot 目录中的文件送到客户端,如果想将某一不在 DocumentRoot 目录中的文件共享到网站上,并希望将它们留在本来位置而不需要进行移动的话,处理这种情况可以通过建立别名的方式将 URL 指向特定的目录

  1. 编辑主配置文件
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.confInclude etc/extra/httpd-autoindex.conf    #去掉注释,开启调用子配置文件
  1. 编辑子配置文件
[root@localhost ~]$ vim /usr/local/apache2/etc/extra/httpd-autoindex.confalias /a/ "/a/b/c/"#结构:别名           "真实目录"                #真实目录的结尾要有/,否则报错<Directory "/a/b/c/">Options Indexes FollowSymLinksAllowOverride NoneRequire all granted</Directory>
#可以根据模板编写一个自己需要的目录别名[root@localhost ~]$ mkdir -p /a/b/c/  && echo "www.a.com" > /a/b/c/a.html[root@localhost ~]$ /usr/local/apache2/bin/apachectl -t  #检查配置文件是否有问题[root@localhost ~]$ /usr/local/apache2/bin/apachectl restart  #重启服务

2.5.2 Apache 的用户认证

有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户身 份认证。

  1. 编辑配置文件
[root@localhost ~]$ cd /usr/local/apache2/htdocs/
[root@localhost ~]$ mkdir admin  && echo "www.a.com" > admin/index.html[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
#在需要进行登录认证的目录标签中加入如下配置:
<Directory "/usr/local/apache2/htdocs/admin"> #声明被保护目录Options Indexes FollowSymLinksAllowOverride All #开启权限认证文件.htaccessRequire all granted
</Directory>
  1. 在指定目录下创建权限文件

切换到/usr/local/apache2/htdocs/admin,创建 .htaccess 文件,并添加下面的内容

[root@localhost ~]$ ln -s /usr/local/apache2/bin/* /usr/local/bin/
[root@localhost ~]$ cd /usr/local/apache2/htdocs/admin
[root@localhost ~]$ vim .htaccess
AuthName "Welcome to apache" #提示信息
AuthType basic       #加密类型AuthUserFile /usr/local/apache2/htdocs/admin/apache.passwd
#密码文件,文件名自定义。(使用绝对路径)require valid-user
#允许密码文件中所有用户访问
  1. 建立密码文件,加入允许访问的用户。(此用户和系统用户无关)
[root@localhost ~]$ /usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/admin/apache.passwd test1
#-c 建立密码文件,只有添加第一个用户时,才能-c
New password:
Re-type new password:
Adding password for user test1[root@localhost ~]$ /usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/admin/apache.passwd test2
#-m 再添加更多用户时,使用-m 参数
New password:
Re-type new password:
Adding password for user test2

注意: htpasswd 该命令是 httpd 的命令,需要绝对路径

  1. 重启 apache 服务
[root@localhost ~]$ /usr/local/apache2/bin/apachectl -t[root@localhost ~]$ /usr/local/apache2/bin/apachectl restart

先检查配置是否正确,然后通过浏览器输入要访问的资源时就会提示输入密码了。

2.5.3 虚拟主机(重点)

虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。

虚拟主机的分类:

基于 IP 的虚拟主机:一台服务器,多个 ip,搭建多个网站
基于端口的虚拟主机:一台服务器,一个 ip,搭建多个网站,每个网络使用不同端口访问
基于域名的虚拟主机:一台服务器,一个 ip,搭建多个网站,每个网站使用不同域名访问

实验准备:
  1. 域名解析:准备两个域名
    www.sohu.com
    www.sina.com

    使用本地 hosts 文件进行解析
[root@localhost ~]$ vim /etc/hosts
www.sohu.com
www.sina.com
  1. 网站主页目录规划 在/htdocs/目录下分别创建 sohu 和 sina 两个目录,并在新建目录内创建 index.html 文件(分别写不一样的内容)
[root@localhost ~]$ cd /usr/local/apache2/htdocs
[root@localhost ~]$ mkdir sina && echo "aaa" > sina/index.html
[root@localhost ~]$ mkdir sohu && echo "bbb" > sohu/index.html
试验步骤:
  1. 修改主配置文件开启文件关联
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.confInclude etc/extra/httpd-vhosts.conf  #此行取消注释
  1. 编辑子配置文件,编写虚拟主机标签
[root@localhost ~]$ vim /usr/local/apache2/etc/extra/httpd-vhosts.conf#添加下方内容,有几个虚拟主机就写几组(添加之前先把原先存在的示例删除掉)
<Directory "/usr/local/apache2/htdocs/sina">Options Indexes FollowSymLinksAllowOverride NoneRequire all granted
</Directory>#目录权限标签根据需要自行添加
<VirtualHost 192.168.88.10:80>   #虚拟主机标签,可以写*ServerAdmin webmaster@sina.com   #管理员邮箱DocumentRoot "/usr/local/apache2/htdocs/sina"   #网站主目录ServerName www.sina.com   #完整域名ErrorLog "logs/sina-error_log"   #错误日志CustomLog "logs/sina-access_log" common   #访问日志
</VirtualHost><VirtualHost *:80>ServerAdmin webmaster@sohu.comDocumentRoot "/usr/local/apache2/htdocs/sohu"ServerName www.sohu.comErrorLog "logs/sohu-error_log"CustomLog "logs/sohu-access_log" common
</VirtualHost>
  1. 重启服务,验证结果
[root@localhost ~]$ apachectl restart

Windows 下: 浏览器下输入两个不同的域名验证网页内容(提前修改 windows 的 hosts 文件)C:\Windows\System32\drivers\etc
Linux 下: 通过 elinks/curl 命令验证:elinks/curl URL 地址(提前修改 windows 的 hosts 文件)

2.5.4 域名跳转

一个站点难免会有多个域名,而多个域名总得有一个主次,比如我的网站可以用两个域名访问:www.sina.com 和 www.sohu.cn 但大家发现不管我用哪个域名访问,最终都会跳转到 www.sina.com 上来。这个行为就叫做域名跳转,状态码:301 是永久跳转,302 是临时跳转,网站上一定要设置为 301,这样对搜索引擎是比较友好的。

实验条件:

  1. 虚拟主机能正常访问
  2. 打开主配置文件开启重写模块
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so #取消注释

实验步骤:

  1. 修改虚拟主机配置文件
[root@localhost ~]$ vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/sohu">Options Indexes FollowSymLinksAllowOverride AllRequire all granted
</Directory>
  1. 创建规则匹配文件
[root@localhost ~]$ vim /usr/local/apache2/htdocs/sohu/.htaccess
#在指定的网站目录下创建文件,并添加以下内容
RewriteEngine on
# 开启rewrite功能
RewriteCond %{HTTP_HOST} ^www.sohu.com
# 把以www.sina.com 开头的内容赋值给HTTP_HOST变量
RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L]
# ^(.*)$ 指代客户端要访问的资源
# $1 把 .* 所指代的内容赋值到$1变量中
# R=permanent 永久重定向 = 301
# L 指定该规则为最后一条生效的规则,以后的不再生效
  1. 重启服务器并测试
[root@localhost ~]$ apachectl -t
[root@localhost ~]$ apachectl restart

通过上述测试,发现无论是 sina 或 sohu 最终都是访问到 www.sina.com 域名上来则试验成功

2.5.5 Apache+openssl 实现 https(重点)

HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的 HTTP通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,用于安全的 HTTP 数据传输。这个系统被内置于浏览器中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

  1. 准备工作
    检查 Apache 是否支持 SSL,检查相应模块是否安装,若安装则将模块启用模块存放目录:/usr/local/apache2/modules

检查模块是否启用

[root@localhost ~]$ apachectl -M
  1. CA 证书申请
    生产环境需要去证书厂商购买
[root@localhost ~]$ cd /usr/local/apache2/
[root@localhost ~]$ mkdir cert && cd cert[root@localhost ~]$ openssl genrsa -out ca.key 2048
#建立服务器私钥,生成 RSA 密钥[root@localhost ~]$ openssl req -new -key ca.key -out demo.csr
#需要依次输入国家,地区,城市,组织,组织单位,Email 等信息。最重要的是有一个 common name,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。生成的 csr 文件交给 CA 签名后形成服务端自己的证书[root@localhost ~]$ openssl x509 -req -days 365 -sha256 -in demo.csr -signkey ca.key -out demo.crt
#使用 CA 服务器签发证书,设置证书的有效期等信息

注意 1:生成完秘钥和证书文件后,将文件存放在 Apache 的安装目录下的 cert 目录下
注意 2:在生产环境中必须要在 https证书厂商注册(否则浏览器不识别)

  1. 配置文件修改
    调用 ssl 模块,并启用 ssl 独立配置文件
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule ssl_module modules/mod_ssl.so #取消注释
Include etc/extra/httpd-ssl.conf #取消注释

修改 extra/httpd-ssl.conf 配置文件,调用证书等文件

[root@localhost ~]$ vim /usr/local/apache2/etc/extra/httpd-ssl.conf
#原本的注释掉#添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol all -SSLv2 -SSLv3#修改加密套件如下
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on#证书公钥配置(签字的)
SSLCertificateFile cert/demo.crt#证书私钥配置
SSLCertificateKeyFile cert/ca.key

修改主配置文件,添加虚拟主机

[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
<VirtualHost _default_:443># DocumentRoot 目录位置要和 httpd.conf 里面的一致DocumentRoot "/usr/local/apache2/htdocs"ServerName localhost:443SSLCertificateFile cert/demo.crtSSLCertificateKeyFile cert/ca.keySSLCertificateChainFile cert/demo.crt
</VirtualHost>
  1. 结果验证
[root@localhost ~]$ apachectl -t #检查配置文件语法
[root@localhost ~]$ apachectl restart  #重启 apache,并测试是否可以使用 https 访问

报错提示: AH00526: Syntax error on line 78 of /usr/local/apache2/etc/extra/httpd-ssl.conf:SSLSessionCache: ‘shmcb’ session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).

解决方案: 要么不调用此模块,要么让调用的模块加载上

[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#取消注释即可
  1. 强制跳转 https:
    有些时候为了安全,网站不允许使用 http 访问,仅允许使用 https 访问,目的是为了更加安全在 http 部分的目录权限标签中添加一下内容
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
<Directory "/usr/local/apache2/htdocs">...RewriteEngine on #开启转发规则RewriteCond %{SERVER_PORT} !^443$ #检查访问端口只要目标不是443的RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L] #全都使用https重新访问
</Directory>

在做后面实验时为了更加方便理解,我们可以先把 https 关闭掉
需要关闭:跳转&虚拟主机&ssl 配置文件调用

[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf#跳转
#RewriteEngine on
#RewriteCond %{SERVER_PORT} !^443$
#RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]#虚拟主机
#<VirtualHost _default_:443>
#       #DocumentRoot 目录位置要和 httpd.conf 里面的一致
#       DocumentRoot "/usr/local/apache2/htdocs"
#       ServerName localhost:443
#       SSLCertificateFile cert/demo.crt
#       SSLCertificateKeyFile cert/ca.key
#       SSLCertificateChainFile cert/demo.crt
#</VirtualHost>#配置文件调用
#Include etc/extra/httpd-ssl.conf
#Include etc/extra/httpd-vhosts.conf

2.5.6 Apache 日志切割

我们每访问一次网站,那么就会记录若干条日志。如果日志不去管理,时间长了日志文件会越来越大,如何避免产生大的日志文件?其实 apache 有相关的配置,使日志按照我们的需求进行归档,比如每天一个新日志,或者每小时一个新的日志。

  1. 首先简单设置日志的路径名称
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
#编辑添加内容如下:
ErrorLog "logs/error.log"
CustomLog "logs/access.log" combined#指定了日志存放在/usr/local/apache2/logs 目录下分别为 error.log 和 access.log,combined 为日志显示的格式,日志格式可以参考配置文件 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

2.设置 apache 日志分割

[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400"CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined#注意 1:以上仅为两条命令(一条错误日志,一条访问日志),路径太长写不开
#注意 2:若开启了 https,则需要修改 http-ssl.conf 配置文件中的日志记录条目 [root@localhost ~]$ apachectl -t
[root@localhost ~]$ apachectl restart

ErrorLog 是错误日志CustomLog 是访问日志。|就是管道符,意思是把产生的日志交给 rotatelog这个工具,而这个工具就是 apache 自带的切割日志的工具。-l 的作用是校准时区为 UTC,也就是北京时间。86400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的 combined 为日志的格式,在 httpd.conf 中有定义

2.5.7 不记录指定文件类型的日志

如果一个网站访问量特别大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有 js、css 等静态对象。而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用,那么如何忽略不记录这些日志呢?

配置日志不记录图片的访问

[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
<Directory "/usr/local/apache2/htdocs">#相关配置为:SetEnvIf Request_URI ".*\.gif$" image-requestSetEnvIf Request_URI ".*\.jpg$" image-requestSetEnvIf Request_URI ".*\.png$" image-requestSetEnvIf Request_URI ".*\.bmp$" image-requestSetEnvIf Request_URI ".*\.swf$" image-requestSetEnvIf Request_URI ".*\.js$" image-requestSetEnvIf Request_URI ".*\.css$" image-request</Directory>CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" common env=!image-request[root@localhost ~]$ apachectl -t
[root@localhost ~]$ apachectl restart

说明: 在原来的访问日志配置基础上,增加了一些 image-request 的定义,比如把 gif、jpg、bmp、swf、js、css 等结尾的全标记为 image-request,然后在配置日志后加一个标记 env=!image-request,表示取反。

2.5.8 Apache 配置静态缓存

所说的静态文件指的是图片、js、css 等文件,用户访问一个站点,其实大多数元素都是图片、js、css 等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。

  1. 配置静态缓存
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule expires_module modules/mod_expires.so  #取消注释<IfModule mod_expires.c> #此模块默认未启用,请手动启用ExpiresActive onExpiresByType 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 hours"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_headers 模块实现:该模块默认启用

[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
#直接添加即可
<IfModule mod_headers.c># htm,html,txt 类的文件缓存一个小时<filesmatch "\.(html|htm|txt)$">header set cache-control "max-age=3600"</filesmatch># css, js, swf 类的文件缓存一个星期<filesmatch "\.(css|js|swf)$">header set cache-control "max-age=604800"</filesmatch># jpg,gif,jpeg,png,ico,flv,pdf 等文件缓存一年<filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">header set cache-control "max-age=29030400"</filesmatch>
</IfModule>

说明: 这里的时间单位可以 days、hours 甚至是 min,两种不同的方法,上面使用的是 mod_expires,而下面用的是 mod_headers,要想使用这些模块,必须要事先已经支持。如何查看是否支持,使用命令:


[root@localhost ~]$ apachectl -t
[root@localhost ~]$ apachectl restart

验证:

[root@localhost ~]$ curl -x192.168.88.10:80 'http://192.168.88.10/image/a.jpg' -I
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2016 03:51:26 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Last-Modified: Tue, 31 May 2016 03:08:36 GMT
ETag: "46891b-16b-5341ab0597500"
Accept-Ranges: bytes
Content-Length: 363
Cache-Control: max-age=86400  #缓存
Expires: Thu, 27 Oct 2016 03:51:26 GMT
Content-Type: image/jpg

2.5.8 Apache 禁止解析 PHP

某个目录下禁止解析 PHP,这个很有作用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件,为了避免上传的文件有木马,所以我们禁止这个目录下面的访问解析 PHP。
配置禁止解析 php

[root@localhost ~]$ mkdir /usr/local/apache2/htdocs/data && echo "<?php echo 'hello';" > /usr/local/apache2/htdocs/data/a.php
[root@localhost ~]$ vim /usr/local/apache2/etc/httpd.conf
#直接添加即可
<Directory /usr/local/apache2/htdocs/data>php_admin_flag engine off <filesmatch "(.*)php">Order deny,allowDeny from all </filesmatch>
</Directory>

Web 服务器-Apache详解相关推荐

  1. ajax nginx 转发 sessionid_百度、京东、网易、腾讯、淘宝等大厂都在用的Web服务器Nginx详解

    Nginx背景和概述 Nginx(发音同 engine x)是一款基于异步框架的轻量级/高性能由C语言的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,并在一个B ...

  2. Web服务器基础详解

    Web服务器,也称为"WWW服务器"主要功能是"提供网上信息浏览服务" 目前最常用的Web服务器是: Apache (阿帕奇)和Microsoft(微软)的互联 ...

  3. asp.net尚未在web服务器上注册_最新版Web服务器项目详解 00 项目概述

    点 击 关 注 上 方"两猿社" 设 为"置 顶 或 星 标",干 货 第 一 时 间 送 达. 互 联 网 猿 | 两 猿 社 TineyWebServer Linux下C++轻量级Web服务器,助 ...

  4. 关于windows server 2003 web服务器搭建详解(内涵步骤)

    关于windows server 2003 web服务器搭建 实验环境:windows server 2003(设置两个网卡),win 7或xp系统,都在同一网段下测试 我的服务器和客户机均为NAT模 ...

  5. oracle 监听程序当前无法识别连接描述符中请求的服务_最新版Web服务器项目详解 04 http连接处理(上)...

    点 击 关 注 上 方"两猿社" 设 为"置 顶 或 星 标",干 货 第 一 时 间 送 达. 互 联 网 猿 | 两 猿 社 本文内容 在服务器项目中,http请求的处理与响应至关重要,关系到用户 ...

  6. cwinthread*线程指针怎么销毁结束_最新版Web服务器项目详解 01 线程同步机制封装类...

    点 击 关 注 上 方"两猿社" 设 为"置 顶 或 星 标",干 货 第 一 时 间 送 达. 互 联 网 猿 | 两 猿 社 基础知识 RAII RAII全称是"Resource Acq ...

  7. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  8. Java web之web.xml配置详解

    什么是web.xml web.xml是web项目的配置文件,一般的web工程都会用到web.xml来配置,方便大型开发.web.xml主要用来配置Filter,Listener,Servlet等.但是 ...

  9. JavaWeb web.xml配置详解

    参考: XML 教程 Java web之web.xml配置详解 Javaweb三大组件是:Servlet,Filter,Listener. 1.Servlet Servlet作为中转处理的容器,连接了 ...

最新文章

  1. 算法之【仿竖式算法】
  2. An error occurred during the file system check
  3. Operator Overloading
  4. 数据库中Schema(模式)概念的理解
  5. 串口不通或乱码,排查方法
  6. 《Pytorch - RNN模型》
  7. 浅谈Entity Framework中的数据加载方式
  8. hadoop输出统计
  9. 补:关于man关于SEE ALSO(参见)中代号与vim下常用命令
  10. 蓝桥杯训练--官网真题训练
  11. Task08 word2vec;词嵌入进阶;文本分类 学习笔记
  12. 数据治理——如何处理“脏数据”
  13. 用 QT实现拖放(drag-drop)功能
  14. python苹果手机照片导入电脑_通过python获取苹果手机备份文件中的照片,视频等信息采集...
  15. layui 模板使用
  16. 特征工程(Feature Engineering)
  17. 弹性盒子(flex)
  18. 6、春节到了,小明期盼收到压岁钱。他想:如果收到的钱超过1000元,那么捐助失学儿童;收到的钱在500~1000之间,那么购买航模;如果收到的钱不足500元,那么购买百科全书。
  19. Oracle表的管理命令
  20. vue 声明周期函数_Vue 生命周期详解

热门文章

  1. R语言修改dataframe的列名(column name)实战
  2. Python偏相关(Partial Correlation)或者部分相关性系数计算实战:偏相关性(Partial Correlation)计算及结果解读
  3. R语言dim函数返回NULL
  4. html表格立体效果,用HTML实现凸(凹)起的立体效果的表格
  5. Pacbio三代基因组组装简介
  6. c语言中的常用函数的使用,C语言的常用库函数使用方法分析及用途
  7. linux内核驱动识别过程,转载_ARM-Linux内核驱动加载过程思路
  8. ajax上传等待效果,ajax等待服务器响应添加等待效果
  9. 保存ip地址和计算机名称,批量设置IP地址和计算机名
  10. c语言main的作用是什么意思,c语言intmain()是什么意思