nginx配置及性能調優


https://www.toutiao.com/i6765746230141125132/?timestamp=1575450096&app=news_article&group_id=6765746230141125132&req_id=201912041701360100260760263C04643

2.4、配置默認主頁

location / {
 index index.html index.htm;
 autoindex off;
}

2.5、配置反向代理

location / {
 proxy_pass http://localhost:8888;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

2.6、URL 美化(省略 index.html 入口文件)

location / {
 try_files $uri $uri/ /index.html;
}

2.7、upstream 代碼塊

upstream 代碼塊位於 http 代碼塊內部。
upstream 用於對服務器集群進行負載均衡的配置。
upstream name {
 ip_hash;
 server 192.168.1.100:8000;
 server 192.168.1.100:8001 down;
 server 192.168.1.100:8002 max_fails=3;
 server 192.168.1.100:8003 fail_timeout=20s;
 server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
ip_hash:手動指定調度算法。
down:表示該主機暫停服務。
max_fails:表示失敗最大次數,超過失敗最大次數就會暫停服務。
fail_timeout:表示如果請求受理失敗,暫停指定的時間之后重新發起請求。

2.8、配置文件中的全局變量

$args #這個變量等於請求行中的參數。
$content_length #請求頭中的Content-length字段。
$content_type #請求頭中的Content-Type字段。
$document_root #當前請求在root指令中指定的值。
$host #請求主機頭字段,否則為服務器名稱。
$http_user_agent #客戶端agent信息
$http_cookie #客戶端cookie信息
$limit_rate #這個變量可以限制連接速率。
$request_body_file #客戶端請求主體信息的臨時文件名。
$request_method #客戶端請求的動作,通常為GET或POST。
$remote_addr #客戶端的IP地址。
$remote_port #客戶端的端口。
$remote_user #已經經過Auth Basic Module驗證的用戶名。
$request_filename #當前請求的文件路徑,由root或alias指令與URI請求生成。
$query_string #與$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服務器地址,在完成一次系統調用后可以確定這個值。
$server_name #服務器名稱。
$server_port #請求到達服務器的端口號。
$request_uri #包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。
$uri #不帶請求參數的當前URI,$uri不包含主機名,如”/foo/bar.html”。
$document_uri #與$uri相同。

二、Nginx性能調優

1、優化 Nginx工作進程數及連接數

Nginx 有 master 和 worker 兩種進程,master 進程用於管理 worker 進程,worker 進程用於 Nginx 服務。
而worker 進程數默認為 1 。單進程最大連接數為1024

1.1、worker進程設置

worker 進程數應該設置為服務器 CPU 的核數。所以我們得先查看一下本機的CPU核數,得到結果后,再設置worker_processes值
# 查看CPU核數
grep -c processor /proc/cpuinfo

1.2、調整最大連接數

控制 Nginx 單個進程允許的最大連接數的參數為 worker_connections ,這個參數要根據服務器性能和內存使用量來調整。
進程的最大連接數受 Linux 系統進程打開的最大文件數的限制,只有執行了 "ulimit -HSn 65535" 之后,worker_connections 才能生效。
連接數包括代理服務器的連接、客戶端的連接等,Nginx 總並發連接數 = worker_processes * worker_connections。總數保持在 3w 左右即可。
worker_processes 2;
worker_cpu_affinity 01 10;
user nginx nginx;
events {
 use epoll;
 worker_connections 15000;
}

2、綁定 Nginx 進程到不同的 CPU 上

默認情況下,Nginx 的多個進程有可能跑在某一個 CPU 或 CPU 的某一核上,導致 Nginx 進程使用硬件的資源不均,因此綁定 Nginx 進程到不同的 CPU 上是為了充分利用硬件的多 CPU 多核資源。
[root@localhost ~]# grep -c processor /proc/cpuinfo # 查看CPU核數
2
worker_processes 2; # 2核CPU的配置
worker_cpu_affinity 01 10;
 
worker_processes 4; # 4核CPU的配置
worker_cpu_affinity 0001 0010 0100 1000;
 
worker_processes 8; # 8核CPU的配置
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;
 
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload

3、優化 Nginx worker 進程打開的最大文件數

# worker 進程打開的最大文件數,可設置為優化后的 ulimit -HSn 的結果
worker_rlimit_nofile 65535;

4、開啟高效文件傳輸模式

sendfile:參數用於開啟文件的高效傳輸模式,該參數實際上是激活了 sendfile() 功能。
sendfile() :是作用於兩個文件描述符之間的數據拷貝函數,這個拷貝操作是在內核之中的,被稱為 "零拷貝" 。sendfile 比 read 和 write 函數要高效得多,因為 read 和 write 函數要把數據拷貝到應用層再進行操作。
tcp_nopush:參數用於激活 Linux 上的 TCP_CORK socket 選項,此選項僅僅當開啟 sendfile 時才生效,tcp_nopush 參數可以把 http response header 和文件的開始部分放在一個文件里發布,以減少網絡報文段的數量。
http {
 include mime.types;
 default_type application/octet-stream;
 
 sendfile on; # 開啟文件的高效傳輸模式,減少文件在應用和內核之間的拷貝
 tcp_nopush on; # 激活 TCP_CORK socket 選擇,當數據包達到一定大小再發送
 tcp_nodelay on; # 數據在傳輸的過程中不進緩存,有數據隨時發送(只用在應答需要非常快速的情況下)
 
 keepalive_timeout 65;
 include vhosts/*.conf;
}

5、優化 Nginx 連接的超時時間

5.1:連接超時的作用

將無用的連接設置為盡快超時,可以保護服務器的系統資源(CPU、內存、磁盤)
當連接很多時,及時斷掉那些建立好的但又長時間不做事的連接,以減少其占用的服務器資源
如果黑客攻擊,會不斷地和服務器建立連接,因此設置連接超時以防止大量消耗服務器的資源
如果用戶請求了動態服務,則 Nginx 就會建立連接,請求 FastCGI 服務以及后端 MySQL 服務,設置連接超時,使得在用戶容忍的時間內返回數據
5.2:連接超時存在的問題

服務器建立新連接是要消耗資源的,因此,連接超時時間不宜設置得太短,否則會造成並發很大,導致服務器瞬間無法響應用戶的請求。
有些 PHP 站點會希望設置成短連接,因為 PHP 程序建立連接消耗的資源和時間相對要少些。
有些 Java 站點會希望設置成長連接,因為 Java 程序建立連接消耗的資源和時間要多一些,這是由語言的運行機制決定的。


5.3:設置超時時間

keepalive_timeout:用於設置客戶端連接保持會話的超時時間,超過這個時間服務器會關閉該連接。
client_header_timeout:用於設置讀取客戶端請求頭數據的超時時間,如果超時客戶端還沒有發送完整的 header 數據,服務器將返回 "Request time out (408)" 錯誤。
client_body_timeout:用於設置讀取客戶端請求主體數據的超時時間,如果超時客戶端還沒有發送完整的主體數據,服務器將返回 "Request time out (408)" 錯誤。
send_timeout:用於指定響應客戶端的超時時間,如果超過這個時間,客戶端沒有任何活動,Nginx 將會關閉連接。
tcp_nodelay:默認情況下當數據發送時,內核並不會馬上發送,可能會等待更多的字節組成一個數據包,這樣可以提高 I/O 性能,但是,在每次只發送很少字節的業務場景中,使用 tcp_nodelay 功能,等待時間會比較長。
http {
 include mime.types;
 server_names_hash_bucket_size 512;
 
 default_type application/octet-stream;
 sendfile on;
 tcp_nodelay on;
 
 keepalive_timeout 65;
 client_header_timeout 15;
 client_body_timeout 15;
 send_timeout 25;
 
 include vhosts/*.conf;
}

6、限制上傳文件的大小

client_max_body_size 用於設置最大的允許客戶端請求主體的大小。
在請求頭中有 "Content-Length" ,如果超過了此配置項,客戶端會收到 413 錯誤,即請求的條目過大。
http {
 client_max_body_size 8m; # 設置客戶端最大的請求主體大小為 8 M
}

7、FastCGI 相關參數調優

當 LNMP 組合工作時,用戶通過瀏覽器輸入域名請求 Nginx Web 服務:

如果請求的是靜態資源,則由 Nginx 解析后直接返回給用戶;
如果是動態請求(如 PHP),那么 Nginx 就會把它通過 FastCGI 接口發送給 PHP 引擎服務(即 php-fpm)進行解析,如果這個動態請求要讀取數據庫數據,那么 PHP 就會繼續請求 MySQL 數據庫,以讀取需要的數據,並最終通過 Nginx 服務把獲取的數據返回給用戶。
這就是 LNMP 環境的基本請求流程。

在 Linux 中,FastCGI 接口即為 socket ,這個 socket 可以是文件 socket,也可以是 IP socket。

http {
 include mime.types;
 default_type application/octet-stream;
 sendfile on;
 keepalive_timeout 65;
 fastcgi_connect_timeout 240; # Nginx服務器和后端FastCGI服務器連接的超時時間
 fastcgi_send_timeout 240; # Nginx允許FastCGI服務器返回數據的超時時間,即在規定時間內后端服務器必須傳完所有的數據,否則Nginx將斷開這個連接
 fastcgi_read_timeout 240; # Nginx從FastCGI服務器讀取響應信息的超時時間,表示連接建立成功后,Nginx等待后端服務器的響應時間
 fastcgi_buffer_size 64k; # Nginx FastCGI 的緩沖區大小,用來讀取從FastCGI服務器端收到的第一部分響應信息的緩沖區大小
 fastcgi_buffers 4 64k; # 設定用來讀取從FastCGI服務器端收到的響應信息的緩沖區大小和緩沖區數量
 fastcgi_busy_buffers_size 128k; # 用於設置系統很忙時可以使用的 proxy_buffers 大小
 fastcgi_temp_file_write_size 128k; # FastCGI 臨時文件的大小
# fastcti_temp_path /data/ngx_fcgi_tmp; # FastCGI 臨時文件的存放路徑
 fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; # 緩存目錄
 
 server {
 listen 80;
 server_name www.abc.com;
 location / {
 root html/www;
 index index.html index.htm;
 }
 location ~ .*\.(php|php5)?$ {
 root html/www;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 include fastcgi.conf;
 fastcgi_cache ngx_fcgi_cache; # 緩存FastCGI生成的內容,比如PHP生成的動態內容
 fastcgi_cache_valid 200 302 1h; # 指定http狀態碼的緩存時間,這里表示將200和302緩存1小時
 fastcgi_cache_valid 301 1d; # 指定http狀態碼的緩存時間,這里表示將301緩存1天
 fastcgi_cache_valid any 1m; # 指定http狀態碼的緩存時間,這里表示將其他狀態碼緩存1分鍾
 fastcgi_cache_min_uses 1; # 設置請求幾次之后響應被緩存,1表示一次即被緩存
 fastcgi_cache_use_stale error timeout invalid_header http_500; # 定義在哪些情況下使用過期緩存
 fastcgi_cache_key http://$host$request_uri; # 定義 fastcgi_cache 的 key
 }
 }
}

8、gzip 壓縮(在之前的講解vue首頁加載慢的一文中也有介紹Nginx壓縮)

Nginx gzip 壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發送到客戶端之前,Nginx 服務器會根據一些具體的策略實施壓縮,以節約網站出口帶寬,同時加快數據傳輸效率,來提升用戶訪問體驗。

需要壓縮的對象有 html 、js 、css 、xml 、shtml ,圖片和視頻盡量不要壓縮,因為這些文件大多都是已經壓縮過的,如果再壓縮可能反而變大。

另外,壓縮的對象必須大於 1KB,由於壓縮算法的特殊原因,極小的文件壓縮后可能反而變大。

http {
 gzip on; # 開啟壓縮功能
 gzip_min_length 1k; # 允許壓縮的對象的最小字節
 gzip_buffers 4 32k; # 壓縮緩沖區大小,表示申請4個單位為32k的內存作為壓縮結果的緩存
 gzip_http_version 1.1; # 壓縮版本,用於設置識別HTTP協議版本
 gzip_comp_level 9; # 壓縮級別,1級壓縮比最小但處理速度最快,9級壓縮比最高但處理速度最慢
 gzip_types text/plain application/x-javascript text/css application/xml; # 允許壓縮的媒體類型
 gzip_vary on; # 該選項可以讓前端的緩存服務器緩存經過gzip壓縮的頁面,例如用代理服務器緩存經過Nginx壓縮的數據
}

9、配置 expires 緩存期限

Nginx expires 的功能就是給用戶訪問的靜態內容設定一個過期時間。

當用戶第一次訪問這些內容時,會把這些內容存儲在用戶瀏覽器本地,這樣用戶第二次及以后繼續訪問該網站時,瀏覽器會檢查加載已經緩存在用戶瀏覽器本地的內容,就不會去服務器下載了,直到緩存的內容過期或被清除。
不希望被緩存的內容:廣告圖片、網站流量統計工具、更新很頻繁的文件。
緩存期限參考:新浪緩存 15 天,京東緩存 25 年,淘寶緩存 10 年。

server {
 listen 80;
 server_name www.abc.com abc.com;
 root html/www;
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ # 緩存的對象
 {
 expires 3650d; # 緩存期限為 10 年
 }
}

10、配置防盜鏈

防盜鏈:簡單地說,就是其它網站未經許可,通過在其自身網站程序里非法調用其他網站的資源,然后在自己的網站上顯示這些調用的資源,使得被盜鏈的那一端消耗帶寬資源 。
通過 HTTP referer 實現防盜鏈。

#第一種,匹配后綴
location ~ .*\.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ { # 指定需要使用防盜鏈的媒體資源
 access_log off; # 不記錄日志
 expires 15d; # 設置緩存時間
 valid_referers none blocked *.test.com *.abc.com; # 表示僅允許這些域名訪問上面的媒體資源
 if ($invalid_referer) { # 如果域名不是上面指定的地址就返回403
 return 403
 }
}
 
#第二種,綁定目錄
location /images {
 root /web/www/img;
 vaild_referers none blocked *.spdir.com *.spdir.top;
 if ($invalid_referer) {
 return 403;
 }
}

11、操作系統優化

1、配置文件/etc/sysctl.conf,如下:

sysctl -w net.ipv4.tcp_syncookies=1 #防止一個套接字在有過多試圖連接到達時引起過載
sysctl -w net.core.somaxconn=1024 #默認128,連接隊列
sysctl -w net.ipv4.tcp_fin_timeout=10 #timewait的超時時間
sysctl -w net.ipv4.tcp_tw_reuse=1 #os直接使用timevait的連接
sysctl -w net.ipv4.tcp_tw_recycle=0 #回收禁用
2、配置文件/etc/security/limits.conf,如下:

hard nofile 204800
soft nofile 204800
soft core unlimited
soft stack 204800


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM