隐藏源码中版本信息
在编译安装之前编辑vim httpd-2.4.34/include/ap_release.h
修改为自定义内容:
隐藏系统类型和模块的版本号
修改httpd.conf
文件:
修改/conf/extra/httpd-default.conf
文件:
设置为随机启动
在设置Apache开机启动时,还要在启动脚本文件的头部的注释中加上chkconfig:2345 64 36
:
修改运行apache的默认用户
通过修改apache的默认用户可以提升apache的安全性,即使apache服务被攻破,黑客拿到普通用户也不会对其它应用造成破坏。
设置安装目录权限
在生产环境我们应该把资源文件的权限合理分配好,但不能给777权限。还应该设置用户上传的文件进行隔离,方便授权,保证服务和服务器的安全。
设置服务日志权限
由于Apache日志的记录是有apache的主进程进行操作的,而apache的主进程又是 root用户启动的所以这样不影响日志的输出,因此把日志目录设置为root权限才是日志记录最安全的办法。
日志切割
apache的日志默认是不切割的,如果整个日志堆在一起不易于管理和分析统计。使用cronolog工具对apache的日志进行切割。cronolog 是一个简单的过滤程序,它读取日志文件条目从标准输入和输出的每个条目并写入指定的日志文件的文件名模板和当前的日期和时间。这里设置按天轮询:
下载cronolog工具:yum install -y cronolog
设置错误页面、开启压缩和缓存功能
优雅显示错误页面,以404页面为例:
修改完成后在添加一个404.html文件,内容可以自定义。当用户访问网站将404错误直接转到该页面。还有一个方法就是直接跳转到指定的一个http链接:ErrorDocument 404 http://www.nidaye.com
启用压缩模块
随着用户访问量和内容量的增加,网站的贷款会不断的增加,随之就是网站成本的增加,并且当内容量增大的时候,客户端如果带宽小,就会影响用户的体验,此时就应该启动压缩功能对某一些内容经过压缩之后再传给用户,这样不仅能节省带宽还能提高用户的体验效果。apache的压缩需要启用mode_deflate模块,该模块提供了deflate输出过滤器,允许服务器在将输出内容发送到客户端之前进行压缩,以节约带宽。它的核心思想就是把文件先在服务器进行压缩,然后再进行传输,这样可以显著减少文件传输的大小。当传输完毕后,客户端游览器会重新对压缩过的内容进行解压缩。如果没特殊情况的话,所有的文本内容都应该能被 gzip 压缩,例如:html(php),js,css, xml,txt等。特殊情况就是像一些广告投放的代码则不会进行压缩。
查看是否安装并启用了mod_deflate模块:
如果没安装执行以下命令安装:
#切到 apache 源码包mod_deflate 所在的目录下
cd /root/httpd-2.4.41/modules/filters
#以dso的方式编译安装到apache中
/usr/local/apache/bin/apxs -c -i -a /root/httpd-2.4.41/modules/filters/mod_deflate.c
#安装成功则显示该文件
ll /usr/local/apache/modules/mod_deflate.so
#查看是否安装了模块
/usr/local/apache/bin/apachectl -M|grep 'deflate'
报错:
httpd: Syntax error on line 105 of /usr/local/apache/conf/httpd.conf: Cannot load modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so: undefined symbol: inflate
解决:
- 压缩模块配置:
配置完成后确保LoadModule deflate_module modules/mod_deflate.so
在httpd.conf文件中是取消注释的状态。
配置文件详解:
DeflateCompressionLevel 9
压缩等级(1~9),越大效率越高,消耗CPU 也越高。 一般设置为6或8。
SetOutputFilter DEFLATE
启用压缩
DeflateFilterNote Input instream
声明输入流的byte数量
DeflateFilterNote Output outstream
声明输出流的byte数量
DeflateFilterNote Ratio ratio
声明压缩的百分比
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
仅压缩,限制特定的MIME类型文件
注
:
- 如果是虚拟主机则在<VirtualHost*:80>中添加配置即可启用压缩
- 图片和视屏一般不建议压缩。
设置网页缓存时间
随着时间的增长,越来越多的图片、脚本、css和flush被嵌入到页面中,用户访问站点势必会做很多次的http请求,因此我们还可以通过mod_expire
缓存模块来设置ExpiresHeader来缓存这些文件。
Expires是通过header报文来指定特定类型的文件在浏览器中的缓存时间的,像一些图片等是不需要经常修改的就可以做缓存,浏览器第一次从服务器下载之后下次就不需要再我从服务器请求了,直接从浏览器缓存中读取,使得用户访问页面的速度大大加快,企业带宽也得到了缓解。
如果没安装执行以下命令安装:
#检查模块是否已经安装并启用
/usr/local/apache/bin/apachectl -M|grep mod_expires
--- 如果没安装执行安装
#切到 apache 源码包mod_deflate 所在的目录下
cd /root/httpd-2.4.41/modules/metadata/
#以dso的方式编译安装到apache中
/usr/local/apache/bin/apxs -c -i -a /root/httpd-2.4.41/modules/matadata/mod_expires.c
#安装成功则显示该文件
ll /usr/local/apache/modules/mod_expires.so
#查看是否安装了模块
/usr/local/apache/bin/apachectl -M|grep 'expires'
#在httpd.conf启用该模块
缓存的方法有三种:
- 针对全局
在httpd.conf中加入以下配置参数:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
- 针对目录
在httpd.conf文件中的<Directory></Directory>
标签内加入参数:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
- 针对虚拟主机
编辑conf/extra/httpd-vhosts.conf
文件
<VirtualHost *:80>
ServerAdmin baba@163.com
DocumentRoot "/www/html"
ServerName www.baba.com
ServerAlias bab.com
CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined
ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
</VirtualHost>
开启长连接
长连接会减少三次握手,但是会消耗内存,一个连接有多次请求的建议打开长连接功能,并适当调整KeepAliveTimeout时间。KeepAlive受KeepAliveTimeout限制,如果第二次请求和第一次请求之间超过KeepAliveTimeout时间第一次连接就会中断,重新建立第二个连接。KeepAliveTimeout如果设置的过小则apache会频繁建立连接,过大则有很多无用的连接占据服务器资源,一般根据网站的流量和服务器的配置而定。
KeepAlive On
KeepAliveTimeout 30
MaxKeepAliveRequests 100 //启用KeepAlive后时每个连接允许的请求数量
运行模式优化
apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式:
prefork(进程模式)
:prefork是基于多进程的模式,它实现了一个非线程的、预派生的web服务器,它在apache启动之前就预派生一些子进程用于等待用户的连接,从而减少频繁创建和销毁进程的开销,每个进程只有一个线程,在一个时间内只能处理一个请求。
优点: 稳定、一个进程坏了也不影响其它进程。
缺点: 每一个进程占用资源较高,不适合高并发场景。
worker(线程模式)
:和prefork模式相比,worker使用了多进程和多线程的混合模式,它同样也会预先派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听进程,每个请求都会分配到一个线程来服务。
优点: 线程比进程占用的内存较少,因为线程是通过共享父进程的内存空间来工作的,在高并发场景下比prefork模式有更多可用的线程。
缺点: 存在线程安全问题,如果一个进程下的线程出现了问题那么其他线程也会出现问题,在长连接中即使中间没有请求也要等到超时才会被释放。
event(事件模式)
:apache最新的工作模式,它解决了长连接的时候占用线程资源被浪费的问题,在该模式下,会有一些专门的线程来管理KeepAlive类型的线程,当有真实请求过来的时候,它将这些请求传递给服务器的线程,执行完毕后会自动释放,不受超时时间约束,当一个连接没有请求时会自动关闭连接。
查看apache运行模式:
导入httpd-mpm.conf 配置文件到apache主文配置件中:
Include conf/extra/httpd-mpm.conf //去掉该行注释
prefork常用配置参数解释:
<IfModule mpm_prefork_module>
StartServers 5 启动apache时创建的进程数量
MinSpareServers 5 最小空闲进程数
MaxSpareServers 10 最大空闲进程数
MaxRequestWorkers 250 最大连接进程数
MaxConnectionsPerChild 0 最大连接限制,0表示无限制
</IfModule>
MinSpareServers
:指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进 程。如果当前空闲子进程数少于MinSpareServers ,那么apache 将以第一秒一个,第二秒两个,第三 秒四个,按指数递增个数的速度产生新的子进程。如此按指数级增加创建的进程数,最多达到每秒 32个, 直到满足 MinSpareServers设置的值为止;这就是预派生(prefork)的由来;这种模式可以不必在请 求到来时再产生新的进程,从而减小了系统开销以增加性能。
MaxSpareServers
:指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进 程。如果当前有超过MaxSpareServers 数量的空闲子进程,那么父进程将杀死多余的子进程。
MaxRequestWorkers
:最大同时处理请求的进程数量,也是最大的同时连接数,表示了 Apache 的最大请求并发能力,超过该数目后的请求,将排队。
MaxConnectionsPerChild
: 进程生命周期内,处理的最大请求数目。达到该数目后,进程将死掉。 如果设置为 0,表示没有限制。该参数的意义在于,避免了可能存在的内存泄露带来的系统问题。 将MaxRequestsPerChild 设置成非零值有两个好处:
- 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
- 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
注:开启长链接时,发送的请求在MaxRequestsPerChild 里面只算一 个,不管这个连接发送了多少个请求。
对 worker 模式性能优化
apache2.0以后的版本在性能方面最明显的变化就在于使用 worker模式。
<IfModule mpm_worker_module>
StartServers 3 最初建立的子进程
MinSpareThreads 75 基于整个服务器监视的最小空闲线程数,如果空闲的线程小于设定值,apache会自动建立线程,如果服务器负载大的话,可以考虑加大此参考值。
MaxSpareThreads 250 基于整个服务器监视的最大空闲线程数,如果空闲的线程大于 设定值,apache会自动kill掉多余的线程,如果服务器负载大的话,可以考虑加大此参考值。
ThreadsPerChild 25 表示每个进程包含的线程数,如果是并发量比较大,可以考虑加大这个值。此参数在worker模式中,是影响最大的参数。
MaxRequestWorkers 400 所有线程数量的最大值,通常表示了一个web 服务的最大并 发值。MaxRequestWorkers必须是ThreadsPerChild 的整数倍,否则Apache 会提示调整到一个相 近的值。MaxRequestWorkers=StartServers* ThreadsPerChild
MaxConnectionsPerChild 0 每个子进程可以处理的最大请求数。达到该数目后,进程将死 掉。如果设置为 0,表示没有限制。
</IfModule>
例如:64G内存的服务器,apache 可以使用 56G内存,假如每个work进程稳定运行时,平均使用56M内存。最大work进程数为:56*1024/56=1024 个。
<IfModule mpm_worker_module>
StartServers 1024
MinSpareThreads 750
MaxSpareThreads 2500
ThreadsPerChild 250
MaxRequestWorkers 25000
MaxConnectionsPerChild 25000
</IfModule>
对event模式性能优化
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
event 模式调优和worker 模式一样的,不同的是在于它解决了keep-alive 长连接的时候占用线程资源被浪费的问题。所以理伦上event 模式比worker 模式好。
总结:生产环境下对于要求更高伸缩性的站点可以选择使用worker 或 event模式; 需要可靠性或 者与旧软件兼容的站点可以使用 prefork模式。现在网站使用worker模式比较多。worker也比较成熟。 event 模式从apache2.4版本才开始有。
禁止浏览目录
由于开启目录浏览会让我们整个目录下的内容全部都暴露到外面,因此我们必须要禁止目录浏览功能。 如果是下载服务器则忽略该优化选项。
在主配置文件httpd.conf 中的<Directory></Directory>
标签内的 Options 选项参数来实现禁用目录浏览。
禁止解析php文件
企业的站点有时会提供用户进行上传操作,比如让用户上传一个文件或头像图片,而用户上传文件的存放目录,我们是不能给php的解析权限的,否则会对apache 服务和系统造成危害。
在站点目录下添加:
<Files ~ ".php">
Order allow,deny
Deny from all
</Files>
效果: