#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″
### 測試結果
#### **修改前**


#### **修改后**


**提示:**設置完上述兩個參數后,還是會在響應頭中顯示`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等構架。