1. 程式人生 > >Nginx 相關優化

Nginx 相關優化

1.併發量 1)nginx引數

# vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes  2;                    //與CPU核心數量一致,起多少程序
events {
worker_connections 65535;        //每個worker最大併發連線數
use epoll;                       //用epoll處理I/O,效率高
}

2)優化linux核心引數

# ulimit -a                        //檢視所有屬性值
# ulimit -Hn 100000                //設定硬限制(臨時規則)
# ulimit -Sn 100000 //設定軟限制(臨時規則) # vim /etc/security/limits.conf //永久修改 .. .. * soft nofile 100000 * hard nofile 100000 #該配置檔案分4列,分別如下: #使用者或組 硬限制或軟限制 需要限制的專案 限制的值 #硬限制是最後限制,只有root可以修改,軟限制普通使用者可以調整

3)優化後測試伺服器併發量

# ab -n 2000 -c 2000 http://127.0.0.1/

2.優化Nginx資料包頭快取

# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size    1k;        //預設請求包頭資訊的快取    
large_client_header_buffers  4 4k;        //大請求包頭部資訊的快取個數與容量
.. ..
}

3.定義對靜態頁面的快取時間

# vim /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index
index.html index.htm; } location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 30d; //針對特定檔案,定義客戶端快取時間為30天 } }

4.資料包頭部快取大小調整

# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size    1k;        //預設請求包頭資訊的快取    
large_client_header_buffers  4 4k;        //大請求包頭部資訊的快取個數與容量
}

5.對頁面進行壓縮處理

# cat /usr/local/nginx/conf/nginx.conf
http {
.. ..
gzip on;                            //開啟壓縮
gzip_min_length 1000;                //小檔案不壓縮
gzip_comp_level 4;                //壓縮比率,1~9分別是速度與效率的選擇,數字越大效果越好,但速度越慢
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
                                    //對特定檔案壓縮,型別參考**mime.types**,多媒體檔案不要壓縮比如jpg、mp4、mp3等

.. ..
}

6.伺服器記憶體快取 如果需要處理大量靜態檔案,可以將檔案快取在記憶體,提高訪問速度。

http { 
open_file_cache  max=2000  inactive=20s;        //設定伺服器最大快取2000個檔案控制代碼,關閉20秒內無請求的檔案控制代碼
        open_file_cache_valid    60s;           //檔案控制代碼的有效時間是60秒,60秒後過期
        open_file_cache_min_uses 5;             //只有訪問次數超過5次會被快取
        open_file_cache_errors   off;           //快取檔案錯誤不報錯
} 

7.檢視伺服器狀態資訊 1)編譯安裝時使用–with-http_stub_status_module開啟狀態頁面模組 2)修改Nginx配置檔案,定義狀態頁面

# cat /usr/local/nginx/conf/nginx.conf
… …
location /status {
                stub_status on;
        }
… …

3)檢視狀態頁面資訊

Active connections
server accepts handled requests
 10 10 3 
Reading: 0 Writing: 1 Waiting: 0
--------------------------------------------------------------------------------------------
Active connections:當前活動的連線數量。
Accepts:已經接受客戶端的連線總數量。
Handled:已經處理客戶端的連線總數量(一般與accepts一致,除非伺服器限制了連線數量)。
Requests:客戶端傳送的請求數量。
Reading:當前伺服器正在讀取客戶端請求頭的數量。
Writing:當前伺服器正在寫響應資訊的數量。
Waiting:當前多少客戶端在等待伺服器的響應。

8.刪除不需要的模組 Nignx是模組化設計的軟體,需要什麼功能與模組以及不需要哪些模組,都可以在編譯安裝軟體時自定義,使用–with引數可以開啟某些模組,使用–without可以禁用某些模組。最小化安裝永遠都是對的方案! 下面是禁用某些模組的案例:

# tar -xf nginx-1.12.tar.gz
# cd nginx-1.12
# ./configure \
>--without-http_autoindex_module \            //禁用自動索引檔案目錄模組
>--without-http_ssi_module
# make
# make install

9.修改版本資訊,並隱藏具體的版本號 預設Nginx會顯示版本資訊以及具體的版本號,這些資訊給攻擊者帶來了便利性,便於他們找到具體版本的漏洞。 如果需要遮蔽版本號資訊,執行如下操作,可以隱藏版本號。 1)修改配置檔案

# vim /usr/local/nginx/conf/nginx.conf
… …
http{
     server_tokens off;                            //在http下面手動新增這麼一行
     … …
}

2)修改ngx_http_header_filter_module.c原始碼

# vim +48 src/http/ngx_http_header_filter_module.c
//注意:vim這條命令必須在nginx-1.12原始碼包目錄下執行!!!!!!
//該檔案修改前效果如下:
static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;
//下面是我們修改後的效果:
static u_char ngx_http_server_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_full_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_build_string[] = "Server: Jacob" CRLF;
//修改完成後,再去編譯安裝Nignx,版本資訊將不再顯示為Nginx,而是Jacob
# ./configure
# make && make install

10.限制併發量 DDOS攻擊者會發送大量的併發連線,佔用伺服器資源(包括連線數、頻寬等),這樣會導致正常使用者處於等待或無法訪問伺服器的狀態。 Nginx提供了一個ngx_http_limit_req_module模組,可以有效降低DDOS攻擊的風險,操作方法如下:

# vim /usr/local/nginx/conf/nginx.conf
… …
http{
… …
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        listen 80;
        server_name localhost;
        limit_req zone=one burst=5;
            }
}
//備註說明:
//limit_req_zone語法格式如下:
//limit_req_zone key zone=name:size rate=rate;
//上面案例中是將客戶端IP資訊儲存名稱為one的共享記憶體,記憶體空間為10M
//1M可以儲存8千個IP資訊,10M可以儲存8萬個主機連線的狀態,容量可以根據需要任意調整
//每秒中僅接受1個請求,多餘的放入漏斗
//漏斗超過5個則報錯

11.拒絕非法的請求 網站使用的是HTTP協議,該協議中定義了很多方法,可以讓使用者連線伺服器,獲得需要的資源。但實際應用中一般僅需要get和post。

# vim /usr/local/nginx/conf/nginx.conf
http{
       server {
                 listen 80;
#這裡,!符號表示對正則取反,~符號是正則匹配符號
#如果使用者使用非GET或POST方法訪問網站,則retrun返回444的錯誤資訊
              if ($request_method !~ ^(GET|POST)$ ) {
                     return 444;
               }    
        }
}

12.防止buffer溢位 當客戶端連線伺服器時,伺服器會啟用各種快取,用來存放連線的狀態資訊。 如果攻擊者傳送大量的連線請求,而伺服器不對快取做限制的話,記憶體資料就有可能溢位(空間不足)。 修改Nginx配置檔案,調整各種buffer引數,可以有效降低溢位風險。

# vim /usr/local/nginx/conf/nginx.conf
http{
client_body_buffer_size  1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
 … …
}