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;
… …
}