1. 程式人生 > >Nginx的優化和壓力測試

Nginx的優化和壓力測試

    我們要測試 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 連線,那麼影響併發量的因素之一:

  1. 客戶端不允許一次性建立過多的連線
  2. 服務端不允許一次性建立過多的連線
    每個請求都要訪問一些資源,那麼影響併發量的因素之一:
  3. 服務端不允許一個檔案在同一時間點被訪問 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

這裡寫圖片描述