Nginx常見優化項和優化參數設置詳解

優化Ngxin提高安全性實現高併發
通過對Nginx的優化設置,使Nginx提高安全性的同時支持更多併發請求
過通對Nginx所在宿主機Linux內核參數進行調整,使其更符合用於支持高併發訪問的Web服務器
Nginx配置優化
編輯nginx.conf配置文件
設置nginx多進程
通過設置nginx工作進程數量,可以實現更⾼的併發量
worker_processes 8; #啓動工作進程數數量,建議設置成cpu邏輯核數相同值
設置nginx單個工作進程最大併發連接數
worker_connections 65536; #設置單個nginx工作進程可以接受的最大併發,默認1024,更改爲10240或更高

設置nginxCPU親緣性綁定(1.9版本以後纔可以設爲auto)
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ; #將Nginx工作進程綁定到指定的CPU核心

設置nginx進程打開文件數上限
實際的併發連接數不能超過系統級別的最大打開文件數的限制.與ulimit -n 或者limits.conf的值保持一致
worker_rlimit_nofile 65536; #所有worker進程能打開的文件數量上限,
開啓零拷貝
sendfile on; #作爲web服務器的時候打開sendfile加快靜態文件傳輸,俗稱零拷貝,內核空間交換文件

設置長連接超時時長
keepalive_timeout 300; #長連接超時時間,單位是秒,超時時間設得長一些
keepalive_requests number; #在一次長連接上所允許請求的資源的最大數量,默認爲100次,建議適當調大,比如:500

設置開啓使用epoll模型
use epoll; #使用epoll事件驅動

設置開啓防驚羣
accept_mutex on; #on爲同一時刻一個請求輪流由work進程處理

設置開啓同進程接受多連接
multi_accept on; #on時Nginx服務器的每個工作進程可以同時接受多個新的網絡連接

設置啓用Gzip壓縮,加快文件傳輸
gzip on; #開啓文件壓縮,來自默認模塊ngx_http_gzip_module
gzip_static on ;#開啓預壓縮,來自於ngx_http_gzip_static_module模塊

設置虛擬主機時修改默認字符集爲utf-8
charset koi8-r; #設置編碼格式,默認是俄語格式,建議改爲utf-8

開啓ssl功能支持https,配置rewrite實現http跳轉到https
nginx 的https 功能基於模塊ngx_http_ssl_module
單域名
server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /apps/nginx/certs/www.sunmy.pro.pem;
    ssl_certificate_key /apps/nginx/certs/www.sunmy.pro.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    root /data/nginx/html;
}
1
2
3
4
5
6
7
8
9
自動跳轉
server {
    listen 80 default_server;
    server_name blog.sunmy.pro;
    rewrite ^(.*)$ https://$server_name$1 permanent;
}
server {
    listen 443 ssl;
    server_name blog.sunmy.pro;
    ssl_certificate /apps/nginx/certs/blog.sunmy.pro.pem;
    ssl_certificate_key /apps/nginx/certs/blog.sunmy.pro.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    location / {
        root "/data/nginx/html/mobile";
    }
    location /mobile_status {
        stub_status;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /apps/nginx/conf/conf.d/www.sunmy.pro.crt;
    ssl_certificate_key /apps/nginx/conf/conf.d/www.sunmy.pro.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    server_name www.sunmy.pro;
    error_log /apps/nginx/logs/sunmy.pro_error.log notice;
    access_log /apps/nginx/logs/sunmy.pro_access.log main;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"
    always;
    location / {
        root /data/nginx/html/pc;
    if ( $scheme = http ) {
    rewrite ^/(.*)$ https://www.sunmy.pro/$1 redirect;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
設置開啓IP透傳
配置文件中添加客戶端IP和反向代理服務器IP到請求報文頭部,實現反向代理客戶端 IP 透傳
#proxy_set_header X-Real-IP $remote_addr; #只添加客戶端IP到請求報文頭部,轉發至後端服務器
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客戶端IP和反向代理服務器IP到請求報文頭部
1
2
開啓並隱藏狀態頁
基於nginx 模塊 ngx_http_stub_status_module 實現
location /nginx_status {
    stub_status;
    auth_basic "auth login";
    auth_basic_user_file /apps/nginx/conf/.htpasswd;
    allow 192.168.0.0/16;
    allow 127.0.0.1;
    deny all;
}
1
2
3
4
5
6
7
8
後期可以通過編寫腳本實現zabbix自定義監控項
curl http://sun:[email protected]/nginx_status 2>/dev/null |awk '/Reading/{print $2,$4,$6}'
3 27 185
1
2
隱藏nginx版本號
server_tokens off; #是否在響應報文的Server首部顯示nginx版本

開啓防盜鏈
nginx支持通過ngx_http_referer_module模塊,檢查訪問請求的referer信息是否有效實現防盜鏈功能
server {
    index index.html;
    valid_referers none blocked server_names *.sunmy.pro
    ~\.google\. ~\.baidu\. ~\.bing\. ~\.so\. ~\.dogedoge\. ; #定義有效的referer
    if ($invalid_referer) { #假如是使用其他的無效的referer訪問
        return 403 "Forbidden Access"; #返回狀態碼403
    }
......
}
1
2
3
4
5
6
7
8
9
配置location,根據請求文件後綴判斷,實現動靜分離
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {
root /data/nginx/static;
index index.html;
}
1
2
3
4
配置404頁面自動跳轉到主頁
#404轉爲302
#error_page 404 /index.html;
error_page 404 =302 /index.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
##或者自動檢測不存在的頁面跳轉到指定頁面
location / {
    root /data/nginx/html/pc;
    index index.html;
    #try_files $uri $uri.html $uri/index.html /about/default.html;
    try_files $uri $uri/index.html $uri.html =489;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
設置放寬用戶上傳文件限制
client_max_body_size 100m; ##設置允許客戶端上傳單個文件的最大值,默認值爲1m,上傳文件超過此值報413錯誤
client_body_buffer_size 1024k;用於接收每個客戶端請求報文的body部分的緩衝區大小;默認16k;
client_body_temp_path /apps/nginx/client_body_temp/ 1 2 2; #上傳時臨時存儲路徑及子目錄結構和數量,Nginx會自動創建相關目錄
1
2
3
設置下載限速
避免大量下載佔滿帶寬
location / {
    limit_rate_after 500k;
    limit_rate 50k;
}
1
2
3
4
設置開啓文件緩存
open_file_cache on; #是否緩存打開過的文件信息
open_file_cache max=10000 inactive=60s; #最大緩存10000個文件,非活動數據超時時長60s
open_file_cache_valid 60s; #每間隔60s檢查一下緩存數據有效性
open_file_cache_min_uses 5; #60秒內至少被命中訪問5次才被標記爲活動數據
open_file_cache_errors on; #緩存錯誤信息
1
2
3
4
5
優化日誌
禁用頁面資源請求的日誌記錄
location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
access_log off;#做動靜分離時禁用訪問成功日誌
}
1
2
3
將nginx日誌轉換爲json日誌,然後配合使用ELK做日誌收集,統計和分析
  #注意:此指令只支持http塊,不支持server塊
  log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,' #總的處理時間
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",' #後端應用服務器處理時間
'"http_host":"$host",'
'"uri":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
access_log /apps/nginx/logs/access_json.log access_json;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Nginx1.9.5 及更高版啓用 HTTP2 協議
listen 443 ssl http2;
1
Nginx宿主機內核優化
主要是對Nginx所在宿主機進程打開文件數量和tcp連接關參數進行優化
fs.file-max = 1000000
#表示單個進程較大可以打開的句柄數
net.ipv4.tcp_tw_reuse = 1
#參數設置爲 1 ,表示允許將TIME_WAIT狀態的socket重新用於新的TCP鏈接,這對於服務器來說意義重大,因爲總有大量TIME_WAIT狀態的鏈接存在
net.ipv4.tcp_keepalive_time = 600
#當keepalive啓動時,TCP發送keepalive消息的頻度;默認是2小時,將其設置爲10分鐘,可更快的清理無效鏈接
net.ipv4.tcp_fin_timeout = 30
#當服務器主動關閉鏈接時,socket保持在FIN_WAIT_2狀態的較大時間
net.ipv4.tcp_max_tw_buckets = 5000
#表示操作系統允許TIME_WAIT套接字數量的較大值,如超過此值,TIME_WAIT套接字將立刻被清除並打印警告信息,默認爲8000,過多的TIME_WAIT套接字會使Web服務器變慢
net.ipv4.ip_local_port_range = 1024 65000
#定義UDP和TCP鏈接的本地端口的取值範圍
net.ipv4.tcp_rmem = 10240 87380 12582912
#定義了TCP接受緩存的最小值、默認值、較大值
net.ipv4.tcp_wmem = 10240 87380 12582912
#定義TCP發送緩存的最小值、默認值、較大值
net.core.netdev_max_backlog = 8096
#當網卡接收數據包的速度大於內核處理速度時,會有一個列隊保存這些數據包。這個參數表示該列隊的較大值
net.core.rmem_default = 6291456
#表示內核套接字接受緩存區默認大小
net.core.wmem_default = 6291456
#表示內核套接字發送緩存區默認大小
net.core.rmem_max = 12582912
#表示內核套接字接受緩存區較大大小
net.core.wmem_max = 12582912
#表示內核套接字發送緩存區較大大小
注意:以上的四個參數,需要根據業務邏輯和實際的硬件成本來綜合考慮
net.ipv4.tcp_syncookies = 1
#與性能無關。用於解決TCP的SYN攻擊
net.ipv4.tcp_max_syn_backlog = 8192
#這個參數表示TCP三次握手建立階段接受SYN請求列隊的較大長度,默認1024,將其設置的大一些可使出現Nginx繁忙來不及accept新連接時,Linux不至於丟失客戶端發起的鏈接請求
net.ipv4.tcp_tw_recycle = 1
#這個參數用於設置啓用timewait快速回收
net.core.somaxconn=262114
#選項默認值是128,這個參數用於調節系統同時發起的TCP連接數,在高併發的請求中,默認的值可能會導致鏈接超時或者重傳,因此需要結合高併發請求數來調節此值。
net.ipv4.tcp_max_orphans=262114
#選項用於設定系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤立鏈接將立即被複位並輸出警告信息。這個限制指示爲了防止簡單的DOS攻擊,不用過分依靠這個限制甚至認爲的減小這個值,更多的情況是增加這個值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
PAM 資源限制優化
設置宿主機接受高併發連接數nproc,對應nginx的worker_rlimit_nofile值
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
————————————————
版權聲明:本文爲CSDN博主「白-胖-子」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/timonium/article/details/120213252

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章