#apache服务器优化 [TOC] ## 配置cronolog进行日志轮询 ### 下载并安装cronolog工具 ~~~ cd /usr/local/src/ wget http://cronolog.org/download/cronolog-1.6.2.tar.gz tar xf cronolog-1.6.2.tar.gz cd cronolog-1.6.2 ./configure make && make install pwd ~~~ ### 配置日志轮询 #### 编辑虚拟配置文件 `vim httpd-vhosts.conf` #### 加入如下内容 `CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/assess_sitename%Y%m%d.log" combined` * * * * * ## 错误页面优雅显示   可以将404 500等的错误信息页面重定向到网站首页或其他页面,提升用户体验。    ### 编辑apache主配置文件 `vim httpd.conf` ### 修改如下内容 `ErrorDocument 404 http://www.domain.com` >[info] **注意:**重定向地址支持URL和具体文件 * * * * * ## `mod_defalte` 文件压缩功能   gzip是把文件先在服务器端进行压缩然后再传输,传输完毕后浏览器会重新对压缩过得内容进行解压缩。这样可以显著减少文件传输的大小,没有特殊情况,所有的文本内容都应该被gzip压缩(html,css,js,xml,txt..)   添加如下内容到httpd.conf或者vhost.conf中 ~~~ <ifmodule mod_deflate.c> DeflateCompressionLevel 9 SetOutputFilter DEFLATE AddOutputFilterByType DEFLATE text/html text/plain text/xml AddOutputFilterByType DEFLATE application/javscript AddOutputFilterByType DEFLATE text/css </ifmodule> ~~~ * * * * * ## mod_expires 缓存功能 添加`Expires:`和`Cache-Control:`头 ## 更改apache的默认用户 ### 创建apache用户,用于子进程和线程 `useradd -M -s /sbin/nologin webadmin` ### 编辑apache的主配置文件 添加或者修改如下内容 ~~~ User webadmin Group webadmin ~~~ >[info] **提示**:最好使用不被人猜出来的用户,提高安全性。 * * * * * ## worker模式提高并发数 (可以达到2k~5k) 编译安装时,使用worker模式 ./configure \ --with-mpm=worker \ >[info] **提示**:worker和prefork两种模式各有优缺点,细节请查看"apache常用的两种worker/prefork模式" ## 屏蔽apahce版本等敏感信息 ### 1. 修改配置文件 1. 修改httpd.conf文件,打开httpd-default.conf模块 >[info] vi /usr/local/apache2/conf/httpd.Conf //找到httpd-default.conf,删除includes前面的“#”,改成如下 Include conf/extra/httpd-default.conf 2. 修改httpd-default.conf文件中的`ServerSignature Off` 以及 `ServerTokens Prod` 之后 使用`apachectl graceful`重载配置文件,使设置生效。 > 下面是`ServerTokens`的一些可能的赋值: ServerTokens Prod 显示“Server: Apache” ServerTokens Major 显示 “Server: Apache/2″ ServerTokens Minor 显示“Server: Apache/2.2″ ServerTokens Min 显示“Server: Apache/2.2.17″ ServerTokens OS 显示 “Server: Apache/2.2.17 (Unix)” ServerTokens Full 显示 “Server: Apache/2.2.17 (Unix) PHP/5.3.5″ ### 测试结果 #### **修改前** ![](https://box.kancloud.cn/2015-12-23_567ac1a04997b.png) ![](https://box.kancloud.cn/2015-12-23_567ac1aad902e.png) #### **修改后** ![](https://box.kancloud.cn/2015-12-23_567ac1aae6a53.png) ![](https://box.kancloud.cn/2015-12-23_567ac1ab3056a.png) **提示:**设置完上述两个参数后,还是会在响应头中显示`Server:Apache`,要想完全去除这个显示可以使用下面的方式。 ### 2. 重新编译安装apache前修改源文件   进入Apache的源码目录下的include目录,然后编辑ap_release.h这个文件,你会看到有如下变量: ~~~ #define AP_SERVER_BASEVENDOR “Apache Software Foundation” #define AP_SERVER_BASEPROJECT “Apache HTTP Server” #define AP_SERVER_BASEPRODUCT “Apache” #define AP_SERVER_MAJORVERSION_NUMBER 2 #define AP_SERVER_MINORVERSION_NUMBER 2 #define AP_SERVER_PATCHLEVEL_NUMBER 15 #define AP_SERVER_DEVBUILD_BOOLEAN 0 ~~~   可以根据自己需求,修改或隐藏版本号与名字,然后再编译能够完全去掉apache等字样。 * * * * * ## apache目录文件权限设置(root.root 目录755 文件644)   apache的网站目录属组是root,权限是755,文件属组是root,权限是644 ~~~ ls -l /var/www/html/ 总用量 17752 drwxr-xr-x 2 root root 4096 12月 12 19:12 bbs drwxr-xr-x 2 root root 4096 12月 13 11:23 blog -rw-r--r-- 1 root root 22 12月 11 22:15 index.html -rw-r--r-- 1 root root 17 12月 11 23:32 index.php ~~~ >[info] **提示:**在网站构架中,应当把资源文件,包括用户上传的图片,附件等和程序分离,最好把上传程序也分离,这样就可以从容授权了。 * * * * * ## 开启apache主配置文件中的httpd-mpm.conf 增加连接数 1. 修改httpd.conf文件,打开http-mpm.conf模块配置文件 1.1 apache服务为worker模块的配置 ~~~ [root@luo.centos6.5 /usr/local/apache/conf] # vim extra/httpd-mpm.conf <IfModule mpm_worker_module> StartServers 5 MaxClients 2000 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadsLimit 200 ThreadsPerChild 100 MaxRequestsPerChild 0 </IfModule> ~~~ >[info] **注意:** `MaxClients <= ServerLimit*ThreadsPerChild`   1.2. apache服务为prefork模式,连接数配置 ~~~ <IfModule mpm_prefork_module> StartServers 10 MinSpareServers 10 MaxSpareServers 15 ServerLimit 2000 MaxClients 2000 MaxRequestsPerChild 10000 </IfModule> ~~~ * * * * * ## 开启apache防盗链功能 ### 主配置文件中增加如下配置 ~~~ <IfModule rewrite_module> RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://domain.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.domain.com/.*$ [NC] RewriteRule .*\.(gif|jpg|swf)$ http://www.domain.com [R,NC] # RewriteRule .*\.(gif|jpg|swf)$ http://www.domain.com/about/no.png [R,NC] </IfModule> ~~~ * * * * * ## 禁止目录Index ~~~ <Directory "/var/www/html"> Options -Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> 或者 <Directory "/var/www/html"> Options FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> ~~~ * * * * * ## 禁止用户覆盖(重载)配置文件 ~~~ <Directory "/var/www/html"> Options FollowSymLinks AllowOverride None # 禁止用户覆盖(重载)配置文件 Order allow,deny Allow from all </Directory> ~~~ >[info] 加快服务器速度,因为它不再为每个请求寻找每个目录访问控制文件**.htaccess** * * * * * ## 关闭CGI(Common Gateway Interface 通用网关接口) ~~~ <IfModule alias_module> ScriptAlias /cgi-bin/ "/application/apache2.2.31/cgi-bin/" </IfModule> <Directory "/application/apache2.2.31/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> ~~~ * * * * * ## 避免使用.htaccess文件(分布式配置文件) **默认选项:**`AccessFileName .htaccess` 改为 `# AccessFileName .htaccess`   首先考虑性能,如果AllowOverride启用了.haccess文件,则apache需要在每个目录中查找.htaccess文件,因此无论是否真正用到启用.htaccess文件都会导致服务器性能的下降。   另外对于每一个请求,都需要读取一次.htaccess文件。   其次是安全考虑,这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应道给予用户这样的特权。 * * * * * ## apache 的安全模块 `mod_evasive20`( 防DDOS攻击) `mod_limittipconn`(针对单站点)配置 `mod_security`(防止SQL注入) * * * * * ## 正确途径获取源代码,勤打apache补丁 ## apache日志授予root 700权限   **不需要在日志目录给apache用户读或者写权限许可,因为apache的初始进程用户为root** * * * * * ## 禁止PHP解析指点站点目录 ~~~ <Directory "/var/www/html/bbs/Uploads"> Options FollowSymLinks AllowOverride None Order allow,deny Allow from all php_flag engine off # 注意这行 </Directory> ~~~ * * * * * ## 尽可能减少HTTP请求数   http请求是需要服务器开销的,想办法减少请求自然可以提高网页速度。   常用的方法是合并css,js(将一个页面的css和js文件分别合并)以及Image maps和css sprites等,这样对于浏览器而言依然是一个请求,但是开发适合仍然能还原成多个,方便管理和重复引用,yahoo甚至建议将首页的css和js直接写在页面文件里,而不是外部就引用,因为首页的访问量实在是太大了,这样做可以减少两个请求数,而事实上国内的很多门户都是这样做的。   而css sprites是指将页面上的背景图合并成一张,然后通过css的background-position属性定义不同的值来取得他们的背景,一些门户网站都是这样做的。 * * * * * ## 使用CDN做网站加速   简单的讲,通过在现有的Internet中增加一层新的网络哦构架,将网站的内容发布到最接近用户的cache服务器内,通过DNS负载均衡技术,判断用户来源就近访问cache服务器获取所需的内容,例如杭州的用户访问杭州服务器的内容,北京的用户访问北京服务器的内容。   这样可以有效的减少数据在网络上传输的时间,提高速度。 ## apache程序架构优化 1. 程序页面服务器 2. 图片附件服务器 3. 上传服务器 三者的功能尽量分离。 * 分离最佳方式是分别使用独立的服务器(需要程序支持) * 次选方案在前段负载均衡器通过 haproxy / nginx 根据目录或拓展名请求后面对应的服务器。 **例如:** * 请求 `http://www.domain.com/Uploads/2015-12-13/a.jpg` 就转发给图片服务器(CDN最好) [根据拓展名分发] * 请求 `http://www.domain.com/upload/index.php/xxxPath`就转发给上传服务器(CDN最好) [根据URL路径分发] * 不符合上述两个条件的默认都给web服务器。 >[info] **提示:** 此构架也适合nginx、tomcate等构架。