高併發下nginx調優實戰(值得收藏)

1。nginx優勢說明

a。 佔有記憶體少 (在3W併發連線中,開啟的10個nginx程序消耗記憶體大約150M)

b。 高併發能力強 (官方測試能夠支撐5W併發連線,在實際生產環境中能到2-3W併發連線數)

c 。 簡單 (配置檔案通俗易懂)

d 。 價格 (免費、開源)

e。 支援Rewriter重寫 (能夠根據域名、URL的不同,將HTTP請求分到不同的後端伺服器群組)

f。 內建健康檢查 (如果nginx後端有幾個服務宕機了,不會影響前端訪問,能自動檢測服務狀態)

g。 節省頻寬 (支援GZIP壓縮,可以新增瀏覽器本地快取的Header頭)

h。 穩定性高,反向代理,很少宕機

i 。中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等

2。場景說明

測試資料:由於後端伺服器採用叢集部署,透過效能測試工具jmeter分析出後端服務端處理使用者每秒請求數(QPS)的單併發峰值在8千左右。

問題分析途徑:nginx日誌。

1、透過訪問日誌,你可以得到使用者地域來源、跳轉來源、使用終端、某個URL訪問量等相關資訊。

2、透過錯誤日誌,你可以得到系統某個服務或server的效能瓶頸等

調優過程:實現nginx限流、安全配置、最佳化程序數及併發連線數、nginx狀態監控等效能調優。

調優結果:當用戶請求數達到此峰值時實現限流,保證有效的請求透過nginx轉發給後端成功處理。ps:如果不做限流處理當請求數超過峰值時,有效的8千請求也會失效,造成伺服器的宕機。

3。 nginx日誌切割實現

nginx日誌預設沒有分割,使用起來非常不方便

[root@bogon logs]# ll總用量 24-rw-r——r——。 1 root root 17403 2月 8 17:09 access。log-rw-r——r——。 1 root root 186 2月 7 17:39 error。log[root@bogon logs]# ll總用量 24-rw-r——r——。 1 root root 17628 2月 9 14:38 access。log-rw-r——r——。 1 root root 186 2月 7 17:39 error。log

解決方法-透過shell指令碼實現日誌切割

shell指令碼如下:

#!/bin/bash#設定日誌檔案存放目錄LOG_HOME=“/data/nginx/logs/”#備分檔名稱LOG_PATH_BAK=“$(date -d yesterday +%Y%m%d%H%M)”。access。log#重新命名日誌檔案mv ${LOG_HOME}/access。log ${LOG_HOME}/${LOG_PATH_BAK}。log#向nginx主程序發訊號重新開啟日誌kill -USR1 `cat /opt/nginx/logs/nginx。pid

建立crontab設定定時任務

*/1 * * * * sh /data/nginx/nginx_log。sh

[root@bogon logs]# ll總用量 16-rw-r——r——。 1 root root 1238 2月 9 17:44 202002081743。access。log-rw-r——r——。 1 root root 2588 2月 9 17:45 202002081745。access。log-rw-r——r——。 1 root root 0 2月 9 17:46 access。log-rw-r——r——。 1 root root 0 2月 9 17:10 error。log

4。併發AB工具簡介

相對效能測試工具jmeter而言,在Linux下ab工具更輕巧好用。BA命令簡介:

高併發下nginx調優實戰(值得收藏)

Centos安裝命令:

yum install httpd-tools –y

測試併發命令:

ab -c 1 -n 6 http://192。168。1。90:8070/index/index。html192。168。1。91 - - [09/Feb/2020:11:55:23 +0000] “GET /index/index。html HTTP/1。0” 200 20 “-” “ApacheBench/2。3” “-”192。168。1。91 - - [09/Feb/2020:11:55:23 +0000] “GET /index/index。html HTTP/1。0” 200 150 “-” “ApacheBench/2。3” “-”192。168。1。91 - - [09/Feb/2020:11:55:23 +0000] “GET /index/index。html HTTP/1。0” 200 20 “-” “ApacheBench/2。3” “-”192。168。1。91 - - [09/Feb/2020:11:55:23 +0000] “GET /index/index。html HTTP/1。0” 200 150 “-” “ApacheBench/2。3” “-”

5。 nginx限流有三種方式實現

• limit_conn_zone

• limit_req_zone

• ngx_http_upstream_module

前兩種只能對客戶端(即單一ip限流)

ngx_http_upstream_module限流示例(推薦)

• 該模組是提供了我們需要的後端限流功能的

• 該模組有一個引數:max_conns可以對服務端進行限流,版本要求:在nginx1。11。5版本以後,配置引數:

upstream localhost{server 192。168。1。90:8071 max_conns=5;server 192。168。1。90:8072 max_conns=5;}

執行結果【可以看到結果有一個已經錯誤了,同理可以限制服務端訪問流量】:

[root@bogon ~]# ab -c 1 -n 6 http://192。168。1。90:8070/index/index。htmlThis is ApacheBench, Version 2。3 <$Revision: 1430300 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www。zeustech。net/Licensed to The Apache Software Foundation, http://www。apache。org/Benchmarking 192。168。1。90 (be patient)。。。。。doneServer Software: nginx/1。17。8Server Hostname: 192。168。1。90Server Port: 8070Document Path: /index/index。htmlDocument Length: 150 bytesConcurrency Level: 1Time taken for tests: 0。041 secondsComplete requests: 6Failed requests: 0 Write errors: 1Total transferred: 2328 bytesHTML transferred: 900 bytesRequests per second: 146。03 [#/sec] (mean)Time per request: 6。848 [ms] (mean)Time per request: 6。848 [ms] (mean, across all concurrent requests)Transfer rate: 55。33 [Kbytes/sec] received

6。 高併發下Nginx安全配置

版本安全

Accept-Ranges: bytesConnection: keep-aliveContent-Length: 20Content-Type: text/htmlDate: Sun, 09 Feb 2020 11:42:08 GMTETag: W/“20-1581064798000”Last-Modified: Fri, 07 Feb 2020 08:39:58 GMTServer: nginx/1。17。8

響應頭資訊可以看到nginx的版本號,版本號暴露是不安全的,所以需要隱藏下nginx的版本號,配置server_tokens off;下面就看不到了。

http { server_tokens off;。。。Accept-Ranges: bytesConnection: keep-aliveContent-Length: 150Content-Type: text/htmlDate: Sun, 09 Feb 2020 11:45:09 GMTETag: W/“150-1581063242000”Last-Modified: Fri, 07 Feb 2020 08:14:02 GMTServer: nginx

IP安全配置

白名單配置:location / {allow 192。168。136。1;deny all;}黑名單設定:location / {deny 192。168。136。1;allow all;}

檔案安全配置

location /logs {autoindex on;root /opt/nginx/;}location ^/logs~*\。(log|txt)$ {add_header Content-Type text/plain;root /opt/nginx/;}

7。 Nginx配置程序數、併發數、系統最佳化

調整Nginx的主配置檔案,增加併發量

worker_processes 2; #調整到與CPU數量一致events {worker_connection 65535; #每個worker最大併發連線數}

調整核心引數

[root@proxy ~]# ulimit -a #檢視所有的屬性值[root@proxy ~]# ulimit -Hn 10000 #臨時設定硬限制[root@proxy ~]# ulimit -Sn 10000 #設定軟限制[root@proxy ~]# vim /etc/security/limits。conf。。。* soft nofile 100000* hard nofile 100000使用者/組 軟/硬限制 需要限制的專案 限制的值

驗證

ab -n 1 -c 20000 http://192。168。1。131/

8。高併發下Nginx狀態監控

配置Nginx的監控選項(配置檔案路徑:nginx。conf)

新增如下程式碼:

#設定Nginx狀態訪問地址location /NginxStatus {stub_status on;access_log off;}

外掛安裝(在原始碼目錄下執行):

。/configure ——prefix=/opt/nginx/ ——with-http_stub_status_module

高併發下nginx調優實戰(值得收藏)

引數說明:

活躍的連線數量active connections總共處理了n個連線 , 成功建立n次握手, 總共處理了n個請求server accepts handled requests每個連線有三種狀態waiting、reading、writingreading —讀取客戶端的Header資訊數。這個操作只是讀取頭部資訊,讀取完後馬上進入writing狀態,因此時間很短writing — 響應資料到客戶端的Header資訊數。這個操作不僅讀取頭部,還要等待服務響應,因此時間比較長。waiting — 開啟keep-alive後等候下一次請求指令的駐留連線。正常情況下waiting數量是比較多的,並不能說明效能差。反而如果reading+writing數量比較多說明服務併發有問題。檢視Nginx併發程序數:ps -ef|grep nginx | wc -l檢視Web伺服器TCP連線狀態:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

解析:

CLOSED //無連線是活動的或正在進行LISTEN //伺服器在等待進入呼叫SYN_RECV //一個連線請求已經到達,等待確認SYN_SENT //應用已經開始,開啟一個連線ESTABLISHED //正常資料傳輸狀態/當前併發連線數FIN_WAIT1 //應用說它已經完成FIN_WAIT2 //另一邊已同意釋放ITMED_WAIT //等待所有分組死掉CLOSING //兩邊同時嘗試關閉TIME_WAIT //另一邊已初始化一個釋放LAST_ACK //等待所有分組死掉檢視Web伺服器TCP連線狀態:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

最後併發超過峰值後的服務端jvm監控顯正常

高併發下nginx調優實戰(值得收藏)

如果本文對你有幫助,別忘記給我個3連 ,點贊,轉發,評論,

,咱們下期見。收藏 等於白嫖,點贊才是真情。

高併發下nginx調優實戰(值得收藏)