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  隱藏版本信息

    通常來講,軟件的漏洞都和版本相關,因此咱們要隱藏或消除web服務對訪問用戶顯示的各類敏感信息。javascript

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

要修改內容的路徑:php

第一路徑:css

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。

第二路徑html

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

而後從新編譯java

1.3  更改nginx服務的默認用戶

第一種方法:node

    直接更改配置文件nginx.conf.default參數,將默認的#user nobody;改成user nginx.nginx;linux

第二種方法:nginx

  直接在編譯nginx的時候指定用戶和用戶組命令以下:web

  ./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.普通用戶的端口問題

二、  根據參數優化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 常見的防盜鏈解決方案的基本原理

  1. 根據HTTP referer實現防盜鏈
  2. 根據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; 
    上下文:http 
    用於設置共享內存區域,key能夠是字符串,Nginx自帶變量或前兩個組合。name爲內存區域的名稱,size爲內存區域的大小,rate爲速率,單位爲r/s,每秒一個請求。 
  limit_req參數說明以下: 
    語法:limit_req zone=name [burst-number] [nobelay]     上下文:http、server、location     這裏運用了令牌桶原理,burst=num,一個有num快令牌,令牌發完後,多出來的那些請求就會返回503。   nodelay默認在不超過burst值得前提下會排隊等待處理,若是使用此參數,就會處理完num+1次請求,剩餘的請求爲超時,返回503。

相關文章
相關標籤/搜索