#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等构架。