nginx的優化
1. gzip壓縮優化
2. expires緩存有還
3. 網絡IO事件模型優化
4. 隐藏軟體名稱和版本号
5. 防盜鍊優化
6. 禁止惡意域名解析
7. 禁止通過IP位址通路網站
8. HTTP請求方法優化
9. 防DOS攻擊單IP并發連接配接的控制,與連接配接速率控制
10. 嚴格設定web站點目錄的權限
11. 将nginx程序以及站點運作于監牢模式
12. 通過robot協定以及HTTP_USER_AGENT防爬蟲優化
13. 配置錯誤頁面根據錯誤碼指定網頁回報給使用者
14. nginx日志相關優化通路日志切割輪詢,不記錄指定元素日志、最小化日志目錄權限
15. 限制上傳到資源目錄的程式被通路,防止木馬入侵系統破壞檔案
16. FastCGI參數buffer和cache配置檔案的優化
17. php.ini和php-fpm.conf配置檔案的優化
18. 有關web服務的Linux核心方面深度優化(網絡連接配接、IO、記憶體等)
19. nginx加密傳輸優化(SSL)
20. web伺服器磁盤挂載及網絡檔案系統的優化
21. 使用nginx cache
1、基本安全優化
1.1 隐藏版本資訊
一般來說,軟體的漏洞都和版本相關,是以我們要隐藏或消除web服務對通路使用者顯示的各種敏感資訊。
1 [root@db01 rpm]# curl -I 10.0.0.8
2 HTTP/1.1 401 Unauthorized
3 Server: nginx #隐藏版本号
4 Date: Thu, 21 Jul 2016 03:23:38 GMT
5 Content-Type: text/html
6 Content-Length: 188
7 Connection: keep-alive
8 WWW-Authenticate: Basic realm="oldboy training"
9 過程:
10 vim /application/nginx/conf/nginx.conf
11 在http子產品下加入:
12 server_tokens off;
13 /application/nginx/sbin/nginx -t
14 /application/nginx/sbin/nginx -s reload
1.2 隐藏nginx要修改源代碼

要修改内容的路徑:
第一路徑:
1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行
2 #define NGINX_VERSION "1.6.2" 修改為想要的版本号如2.4.3
3 #define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改為想要修改的軟體名稱,如Apache。
第二路徑
1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行
2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic
3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c
第三路徑
/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行
"<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF
"<hr><center>OWS</center>" CRLF
然後重新編譯
1.3 更改nginx服務的預設使用者
第一種方法:
直接更改配置檔案nginx.conf.default參數,将預設的#user nobody;改為user nginx.nginx;
第二種方法:
直接在編譯nginx的時候指定使用者和使用者組指令如下:
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
1.4 降級啟動nginx
1 useradd inca
2 cd /home/inca/
3 mkdir conf logs www
4 echo inca >www/index.html
5 chown -R inca.inca *
6 ln -s /application/nginx/conf/mime.types conf/mime.types #mime.types媒體類型檔案
egrep -v "#|^$" /application/nginx/conf/nginx.conf.default >conf/nginx.conf
nginx.conf配置檔案
worker_processes 1;
error_log /home/inca/logs/error.log;
pid /home/inca/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
location / {
root /home/inca/www;
index index.html index.htm;
}
access_log /home/inca/logs/access.log main;
}
}
su - inca -c "/application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf" #啟動nginx服務
重點強調:
1.nginx.conf裡面的相關路徑都要更改
2.普通使用者的端口問題
2、 根據參數優化nginx服務性能
2.1 優化nginx程序個數的政策
在高并發、高通路量的web服務場景,需要事先啟動好更多的nginx程序,以保證快速響應并處理大量并發使用者的請求。
worker_processes 1;一般調整到與CPU的顆數相同
(1)檢視LInux可檢視CPU個數及總核數
grep processor /proc/cpuinfo|wc -l
(2)檢視CPU總顆數
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
(3)通過執行top指令,然後按數字1,即可顯示所有的CPU核數
top 按1鍵就會顯示第一個的資訊
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0
2.2 優化綁定不同的nginx程序到不同的CPU上
預設情況下,nginx的程序跑在某一個CPU或CPU的某一個核上,導緻nginx程序使用硬體的資源不均,本節的優化是不同的nginx程序給不同的CPU處理,充分有效的利用有效的硬體資源
四核cpu配置
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
雙核配置
worker_processes 2;
worker_cpu_affinity 0101 1010;
還有一個指令taskset -c用來配置設定服務給CPU
2.3 nginx事件處理模型優化
nginx的連接配接處理機制在于不同的作業系統會采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路複用模型,在freebsd使用kqueue的IO多路複用模型,在solaris使用/dev/pool方式的IO多路複用模型,在windows使用的icop等等。
要根據系統類型不同選擇不同的事務處理模型,選擇有“use [ kqueue | rtsig |epool |dev/pool |select
|pllo ];”我們使用的是Centos6.5的linux,是以将nginx的事件處理模型調整為epool模型。
events {
worker_connections 1024;
use epoll;
}
官方說明:在不指定事件處理模型時,nginx預設會自動的選擇最佳的事件處理模型服務
2.4 調整nginx單個程序允許的用戶端最大連接配接數
參數文法:worker_connections number
預設配置:worker_connections 512
放置位置:events 标簽
events {
worker_connections 1024; #一個worker程序的并發
}
總并發= worker_processes* worker_connections
2.5 配置nginx worker程序最大打開檔案數
參數文法:worker_rlimit_nofile number
放置位置:主标簽段
說明:作用是改變worker processes能打開的最大檔案數
worker_rlimit_nofile 65535;
這各參數受系統檔案的最大打開數限制,解決方法:
[root@admin nginx]# cat /proc/sys/fs/file-max
8192
檔案系統最大可打開檔案數
[root@admin nginx]# ulimit -n
1024
程式限制隻能打開1024個檔案
使用# ulimit -n 8192調整一下
或者永久調整打開檔案數 可在啟動檔案/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx無效)
2.6 開啟高效檔案傳輸模式
設定參數 sendfile on;
sendfile參數用于開啟檔案的高效傳輸模式。同時将tcp_nopush和tcp_nodelay兩個指令設定為on,可防止網絡及磁盤i/o阻塞,提升nginx工作效率。
http {
sendfile on; #放在http,server,location都可以
}
設定參數tcp_nopush;
激活tcp_nopush參數可以允許把httpresponse header和檔案的開始放在一個檔案裡釋出,積極的作用是減少網絡封包段的數量(隻有sendfile on開啟才生效)
例:
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
server_names_hash_bucket_size 128;
server_names_hash_max_size 512;
keepalive_timeout 65;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 60s;
2.7 FastCGI相關參數調優
fastcgi參數是配合nginx向後請求PHP動态引擎服務的相關參數。
fastcgi_connect_timeout 240;
fastcgi_send_timeout 240;
fastcgi_read_timeout 240;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
2.8 配置nginx gzip壓縮實作性能優化
nginx壓縮功能的介紹:
nginx gzip壓縮子產品提供了壓縮檔案内容的功能,使用者請求的内容在發送給用戶端之前,nginx伺服器會根據一些具體的政策實施壓縮,以節省網站出口帶寬,同時加快了資料傳輸效率,提升了使用者的通路體驗。
2.8.1 壓縮的優點:
提升網站使用者體驗:由于發給使用者的内容小了,是以使用者通路機關大小的頁面就快了,使用者體驗就提升了
節約網站帶寬成本:由于資料時壓縮傳輸的,是以,會消耗一些cpu資源
2.8.2 壓縮的對象:
純文字内容壓縮比很高,是以,純文字的内容最好要壓縮
被壓縮的純文字檔案必須要大于1KB,由于壓縮算法的特殊原因,極小的檔案壓縮反而變大
圖檔、視訊(流媒體)等檔案盡量不要壓縮,因為這些檔案大多都是經過壓縮的,如果再壓縮很可能不會減小或減小很少,或者有可能增大,而在壓縮時還會消耗大量的CPU、記憶體資源
2.8.3 參數介紹及配置說明:
gzip on; #表示開啟壓縮功能
gzip_min_length 1k; #表示允許壓縮的頁面最小位元組數,頁面位元組數從header頭的Content-Length中擷取。預設值是0,表示不管頁面多大都進行壓縮,建議設定成大于1K。如果小于1K可能會越壓越大
gzip_buffers 4 32k; #壓縮緩存區大小
gzip_http_version 1.1; #壓縮版本
gzip_comp_level 9; #壓縮比率
gzip_types text/css text/xml application/javascript; #指定壓縮的類型
gzip_vary on; #vary header支援
完美配置:
nginx.conf http子產品
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
2.9 nginx expires功能
為使用者通路網站的内容設定一個過期時間,當使用者第一次通路到這些内容時,會把這些内容存儲在使用者浏覽器本地,這樣使用者第二次及之後繼續通路該網站,浏覽器就會檢查已經緩存在使用者浏覽器本地的内容,就不會去浏覽器下載下傳了,直到緩存的内容過期或者被清除為止。
2.9.1 expires作用和優點:
expires可以降低網站的帶寬,節約成本
加快使用者通路網站的速度,提升了使用者通路體驗
伺服器通路量降低,伺服器壓力就減輕了,伺服器的成本也會降低,甚至可以節約人力成本
幾乎對于所有web服務來說,這是非常重要的功能之一,apache服務也有此功能。
2.9.2 nginx expires 配置詳解:
## Add expires header according to URI(path or dir).
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
2.9.3 expire缺點及解決辦法:
當網站被緩存的頁面或資料更新了,此時使用者端看到的可能還是舊的已經緩存的内容,這樣就會影響使用者體驗,那麼如何解決這個問題呢?
第一:對于經常需要的變動圖檔等檔案,可以縮短對象緩存時間,例如,百度、谷歌等網站的首頁圖檔經常會換成一些節日的圖,這裡可以将緩存期修改為1天
第二:當網站改版或更新内容時,可以在伺服器将緩存的對象改名(網站代碼程式)
對于網站的圖檔、附件,一般不會被使用者直接修改,使用者層面上的修改圖檔,實際上是重新傳到伺服器,雖然内容一樣但是一個新的圖檔名了
網站改版更新會修改JS、CSS元素,若改版的時候對這些元素改了名,會使得前端的CDN以及使用者端需要重新緩存内容
3. nginx日志的優化
3.1 編寫腳本實作日志輪詢
編寫腳本實作nginx access日志輪詢
使用者咋請求一個軟體時,絕大多數軟體都會記錄使用者的通路情況,nginx軟體目前沒有類似apache通過cronolog或者rotatelog對日志分隔處理的功能,但是,運維人員可以通過利用腳本開發、nginx的信号控制功能或reload重新加載,來實作日志的自動切割、輪詢。
操作步驟:
寫一個定時任務
mv www_access.log www_access_$(date +F -d -1day).log
/applocation/nginx/sbin/nginx -s reload
3.2 不記錄不需要的日志
在實際工作中,對于負載均衡器健康檢查節點或某些特定的檔案(圖檔、JS、CSS)的日志,一般不需要記錄下來,因為在統計PV時是按照頁面計算的,而且日志寫入的太頻繁會消耗磁盤i/o,降低服務的性能
具體配制方法:
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
3.3通路日志的權限設定
假如日志目錄為/app/logs,則授權方法為:
chown -R root.root /app/logs
chmod -R 600 /app/logs
不需要在日志目錄上給nginx使用者讀寫或者讀寫許可,很多人都沒有注意這個問題,這就稱為了安全隐患。
4. nginx站點目錄及檔案URL通路控制
4.1 根據擴充名限制程式和檔案通路
web2.0時代,絕大多數網站都是以使用者為中心的,這些産品有一些共同點,就是不允許使用者釋出内容到伺服器,還允許使用者發圖檔甚至附件上傳到伺服器上,給使用者開啟了上傳的功能。帶來了很大的安全隐患。
下面将利用nginx配置禁止通路上傳資源目錄下的PHP,SHELL,PERL,PYTHON程式檔案,這樣就算是使用者上傳了木馬檔案也沒辦法執行
1 location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$
2 {
3 deny all;
4 }
5 location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$
6 {
7 deny all;
8 }
9 location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
10 {
11 deny all;
12 }
對于上述目錄的限制必須寫在nginx處理PHP服務配置的前面
4.2 禁止通路指定目錄下的所有檔案和目錄
配置禁止通路指定的單個或多個目錄
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
禁止通路目錄并且傳回代碼404
server {
listen 80;
server_name www.etiantian.org etiantian.org;
root /data0/www/www;
index index.html index.htm;
access_log /app/logs/www_access.log commonlog;
location /admin/ { return 404; }
location /templates/ { return 403; }
}
4.3 限制網站來源的IP通路
使用ngx_http_access_module限制網站來源IP通路。
範例1:禁止外界通路,但允許某個IP通路該目錄
location ~ ^/oldboy/ {
allow 202.111.12.211;
deny all;
}
範例2:限制及指定IP或IP段通路。
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
4.4 配置nginx禁止非法域名解析通路企業網站
問題:nginx如何防止使用者IP通路網站(惡意域名解析,相當于直接使用IP通路網站)
方法1:直接報錯,使用者體驗不好
server {
listen 80 default_server;
server_name _;
return 501;
}
方法2:通過301跳轉到首頁
server {
listen 80 default_server;
server_name _;
rewrite ^(.*) http//:blog.etiantian.org/$1 permanent;
}
5. nginx圖檔防盜鍊解決方案。
簡單的說,沒有經過你的允許在自己網站嵌入你的圖檔。
5.1 常見的防盜鍊解決方案的基本原理
- 根據HTTP referer實作防盜鍊
- 根據cookie防盜鍊
5.2 防盜鍊實戰
被盜鍊的網站配置
1 #Preventing hot linking of images and other file types
2
3 location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {
4
5 valid_referers none blocked *.etiantian.org etiantian.org;
6
7 if ($invalid_referer) {
8
9 rewrite ^/ http://bbs.etiantian.org/img/nolink.gif;
10
11 }
12
13 root html/www;
14
15 }
6. nginx錯誤頁面的優雅顯示
範例:當出現403錯誤會跳轉到403.html頁面
error_page 403 /403.html;
7. nginx站點目錄檔案及目錄權限優化
8. 部署網站程式權限設定
(1)wordpress站點目錄權限設定
方案1:推薦方案
目錄:755
檔案:644
所有者:root
圖檔及上傳目錄設定所有者為www
cd /application/apache/html/
chown -R root.root blog
find ./blog/ -type f|xargs chmod 644
find ./blog/ -type d|xargs chmod 755
9. nginx防爬蟲優化
配置
if ($http_user_agent ~* LWP:Simple|BBBike|wget) {
return 403 ;
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}
10. 利用nginx限制HTTP的請求方法
配置:
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
}
配置上傳伺服器限制HTTP的GET的配置
#Only allow these request methods ##
if ($request_method ~*(GET)$ ) {
return 501;
}
11. 使用CDN做網站内容加速
cdn特點
本地Cache加速 提高了企業站點(尤其含有大量圖檔和靜态頁面站點)的通路速度,并大大提高以上性質站點的穩定性
鏡像服務 消除了不同營運商之間互聯的瓶頸造成的影響,實作了跨營運商的網絡加速,保證不同網絡中的使用者都能得到良好的通路品質。
遠端加速 遠端通路使用者根據DNS負載均衡技術智能自動選擇Cache伺服器,選擇最快的Cache伺服器,加快遠端通路的速度
帶寬優化 自動生成伺服器的遠端Mirror(鏡像)cache伺服器,遠端使用者通路時從cache伺服器上讀取資料,減少遠端通路的帶寬、分擔網絡流量、減輕原站點WEB伺服器負載等功能。
叢集抗攻擊 廣泛分布的CDN節點加上節點之間的智能備援機制,可以有效地預防黑客入侵以及降低各種D.D.o.S攻擊對網站的影響,同時保證較好的服務品質 。
12. 使用普通使用者啟動Nginx(監牢模式)
解決方案
給Nginx服務降級,用普通使用者跑Nginx服務,給開發及運維設定普通賬号
開發人員使用普通賬号即可管理nginx服務及站點下的程式和日志
責任劃分:網絡問題:運維責任,網站打不開開發責任。(共同承擔)
實戰配置:
useradd inca
cd /home/inca
mkdir conf www log
echo inca >www/index.html
修改配置檔案
error_log /home/inca/log/error.log
pid /home/inca/log/nginx.pid
13. 控制Nginx并發連接配接數量
ngx_http_limit_conn_module這個子產品用于限制每個定義key值得連接配接數,特别是單個TP的連接配接數。
不是所有的連接配接數都會被計算。一個符合計數要求的連接配接是整個請求頭已經被讀取的連接配接。
控制Nginx并發連接配接數量參數的說明
1)limit_conn_zone參數:
文法:limit_conn_zone key zone=name:size;
上下文:http
用于設定共享記憶體區域,key可以是字元串、Nginx自帶變量或前兩個組合。name為記憶體區域的名稱,size為記憶體區域的大小。
2)limit_conn參數
文法:limit_conn zone number;
上下文:http、server、location
用于指定key設定最大連接配接數。當逾時最大連接配接數時,伺服器會傳回503報錯。
14. 控制用戶端請求Nginx的速率
ngx_http_limit_req_module子產品用于限制每個IP通路每個定義key的請求速率。
limit_req_zone參數說明如下。
文法:limit_req_zone
key zone=name:size rate=rate;
用于設定共享記憶體區域,key可以是字元串,Nginx自帶變量或前兩個組合。name為記憶體區域的名稱,size為記憶體區域的大小,rate為速率,機關為r/s,每秒一個請求。
limit_req參數說明如下:
文法:limit_req
zone=name [burst-number] [nobelay]
這裡運用了令牌桶原理,burst=num,一個有num快令牌,令牌發完後,多出來的那些請求就會傳回503。
nodelay預設在不超過burst值得前提下會排隊等待處理,如果使用此參數,就會處理完num+1次請求,剩餘的請求為逾時,傳回503。
相關連接配接:
http://mp.weixin.qq.com/s?__biz=MzAxOTE5NjQwOA==&mid=2650112750&idx=1&sn=28a6b0cdfa2615cc5e52ca6260b221b3&scene=23&srcid=0722sKyHmKIKp0tDUKSyz97u#rd