天天看點

nginx的優化

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要修改源代碼

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動态引擎服務的相關參數。

nginx的優化
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;      
nginx的優化

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功能

  為使用者通路網站的内容設定一個過期時間,當使用者第一次通路到這些内容時,會把這些内容存儲在使用者浏覽器本地,這樣使用者第二次及之後繼續通路該網站,浏覽器就會檢查已經緩存在使用者浏覽器本地的内容,就不會去浏覽器下載下傳了,直到緩存的内容過期或者被清除為止。

nginx的優化

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;
}      
nginx的優化

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圖檔防盜鍊解決方案。

簡單的說,沒有經過你的允許在自己網站嵌入你的圖檔。

nginx的優化
nginx的優化

5.1 常見的防盜鍊解決方案的基本原理

  1. 根據HTTP referer實作防盜鍊
  2. 根據cookie防盜鍊
nginx的優化

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站點目錄檔案及目錄權限優化

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