Nginx的優化和壓力測試
阿新 • • 發佈:2019-02-06
我們要測試 nginx 的負載能力,需要藉助壓力測試工具。本部落格是使用 Apache 伺服器自帶的一個 web 壓力測試工具 ApacheBench ,簡稱 ab。ab 是一個命令列工具,即通過 ab 命令列,模擬多個請求同時對某一 URL 地址進行訪問,因此可以用來測試目標伺服器的負載壓力。
ab 的安裝
ab 的安裝可以去官網下載,如果不想安裝 apache,又想使用 ab 命令,可以直接安裝工具包 httpd-tools,該工具包會將 ab 命令安裝到 /usr/bin 下,因此在任何地方都可以呼叫:
yum -y install httpd-tools
檢查 ab 的安裝結果
ab -V
# 顯示下面資訊表示安裝成功
This 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/
ab 的簡單使用
# 檢視 ab 的命令及引數
ab -help
# 最簡單的使用
# -c:一次併發請求的數量;-n:請求總次數
ab -c 5000 -n 200000 http://192.168.222.101:80/index.html
優化思路
每個請求都需要建立 socket 連線,那麼影響併發量的因素之一:
- 客戶端不允許一次性建立過多的連線
- 服務端不允許一次性建立過多的連線
每個請求都要訪問一些資源,那麼影響併發量的因素之一: - 服務端不允許一個檔案在同一時間點被訪問 N 次,相當於一個檔案在服務端開啟 N 次
我們在使用 ab 模擬併發訪問後,執行 dmesg 命令,檢視請求的資訊
dmesg
# 執行結果的最後一行為:possible SYN flooding on port 80. Sending cookies.
# 解釋:在同一時間有過多的請求訪問 80 埠,導致系統誤認為遭受了洪水攻擊
從上面的優化分析中,我們可以從 socket 和檔案兩個層面進行 Nginx 的高併發優化。
socket:分為系統層面和 nginx 層面:
- 系統層面
# 禁止洪水抵禦,這個操作在重啟之後失效
命令:more /proc/sys/net/ipv4/tcp_syncookies
結果:1
命令:echo 0 > /proc/sys/net/ipv4/tcp_syncookies
# 最大連線數,這個操作在重啟之後失效
命令:more /proc/sys/net/core/somaxconn
結果:128
命令:echo 50000 > /proc/sys/net/core/somaxconn
# 加快 tcp 連線的回收,這個操作在重啟之後失效
命令:cat /proc/sys/net/ipv4/tcp_tw_recycle
結果:0
命令:echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
# 使空的 tcp 連線重新被利用,這個操作在重啟之後失效
命令:cat /proc/sys/net/ipv4/tcp_tw_reuse
結果:0
命令:echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
# 完整的命令
echo 50000 > /proc/sys/net/core/somaxconn
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
- nginx
# 子程序允許開啟的連線數(nginx.conf)及 IO 選擇
events {
# 子程序連線數
worker_connections 65535;
# 使用 linux 下的多路複用 IO,是 poll 增強版本
use epoll;
}
# 將 keepalive_timeout 設定為 0,高併發網站中,一般不超過 2s。此引數在 F12 除錯頁面時,在 Network 的 Headers 的 Response Headers 下可以看到 Connection:keep-alive,如果設定為 0,那麼為 Connection:close
keepalive_timeout 0;
檔案:分為系統層面和 nginx 層面:
- 系統層面
# 設定同一個檔案同一時間點可以開啟 N 次,這個操作在重啟之後失效
命令:ulimit -n
返回:128
命令:ulimit -n 20000
- nginx 層面
# nginx 程序數,按照 CPU 數目指定
worker_processes 8;
# nginx 子程序允許開啟的檔案次數
worker_rlimit_nofile 102400;
ab 使用時的注意點
如果使用 A 和 B 兩臺虛擬機器測試,用 B 上的 ab 測試 A 的 nginx ,即 A 為服務端,B 為客戶端。此時需要在 B 上配置下面的引數,並且兩個引數至少要等於 A 配置的值。
ulimit -n 20000
echo 50000 > /proc/sys/net/core/somaxconn
Nginx 新增統計模組及配置
nginx 在安裝時可以新增訪問的統計模組。
./configure --prefix=/usr/local/nginx --with-http_stub_status_module
# 在 nginx.conf 中配置統計模組
location /status{
# 開啟狀態
stub_status on;
# 不需要日誌
access_log off;
# 只允許此 ip 訪問
allow 192.168.222.101;
# 其他 ip 禁止訪問
deny all;
}
使用 Nginx 的統計模組檢視狀態
# ab 測試併發
ab -c 1000 -n 100000 http://192.168.222.101:80/index.html
# 瀏覽器開啟
http://192.168.222.101:80/status