天天看點

高性能Nginx最佳實踐

  • Nginx簡介
  • Nginx監聽端口
  • Nginx虛拟主機
  • Nginx配置location
  • Nginx正常配置
  • Nginx高性能配置
  • Nginx事件配置

Nginx監聽端口

基本文法:listen address:port

預設:listen 80;

作用:listen參數決定Nginx伺服器如何監聽端口。在listen後可以加IP位址,端口和主機名,非常靈活

例如:

listen 127.0.0.1:8000;

listen 127.0.0.1; # 預設80端口

listen 8000; # listen *:8000; # listen locahost:8000

這樣就可以配置多個server,監聽不同的端口

擴充文法:listen address:port [default(deprecated in 0.8.21)|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|defered|bind|ipv6only=[on|off]|ssl]]

參數 意義
default 将所在得server設定為整個web服務的預設server塊。如果沒有這個設定,那麼會以在nginx.conf中找到的第一個server作為預設server。(default_server:同上)
backlog=num 表示TCP中backlog清單的大小
rcvbuf=size 設定監聽句柄的SO_RECVBUF參數
sndbuf=size 設定監聽句柄的SO_SNDBUF參數
accept_filter 設定accept過濾器,隻對FreeBSD有用
defered 在設定參數後,若使用者發起建立請求,并且完成了TCP三向交握,核心也不會為這次連接配接排程worker程序來處理,隻有使用者真的發送資料時(核心已經在網卡中收到請求包),核心才會喚醒worker程序處理這個請求
bind 綁定目前端口、位址對。隻有同時對一個端口監聽多個位址時才會生效
ssl 在目前監聽的端口上建立的連接配接必須基于SSL協定

Nginx虛拟主機

類别 主機名 server_names_hash_bucket_size
文法 server_name name […] server_names_hash_bucket_size size;
預設 server_name “”; server_names_hash_bucket_size 32
配置塊 server; http,server,location
作用 實作虛拟主機的關鍵 為了快速找到相應的server name的能力,Nginx使用散清單來存儲server name。這個設定了桶的大小。
worker_processes  auto;
events {
    use  epoll;
    worker_connections  65535;
}
http {
    upstream aidan.org{
        server 127.0.0.1:8881;
        server 127.0.0.1:8882;
        server 127.0.0.1:8883;
    }
    server {
        listen       80;
        server_name  aidan.org;
        location / {
            proxy_pass  http://aidan.org;
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;
        }
    }
}
           

Nginx配置location

文法:location [=|~*|@]/uri/{…}

配置塊:server

詳情:location會嘗試根據使用者請求中的uri來比對上面的uri表達式,如果可以比對,就選擇location塊中的配置來處理使用者請求。當然比對方式是多樣的。

  • = /uri 表示完全比對。
  • ~ /uri 表示比對uri時大小寫敏感。
  • ~* /uri 表示比對uri時忽略大小寫。
  • ^~ /uri 表示比對uri時隻需要其前半部分比對即可。
  • /uri 不帶任何修飾符,也表示字首比對,但是在正則比對之後。
  • / 通用比對,任何未比對到其它location的請求都會比對到,類似switch中的default。

Nginx正常配置

定義環境變量

文法:evn VAR|VAR=VALUE

作用:使用者可以直接設定作業系統上的環境變量

舉例:evn TESTPATH=/tmp;

嵌入其他配置檔案

文法:include /path/file;

作用:可以把其他配置檔案引入進來,路徑可以使用絕對路徑也可以是相對路徑。還可以含有通配符*。

pid檔案

文法:pid path/file;

預設:pid logs/nginx.pid;

作用:儲存master程序ID的pid檔案存放路徑。

Nginx Worker程序運作的使用者和使用者組

文法:user username [groupname];

預設:user nobody nobody;

作用:master程序fork出的程序在哪個使用者和使用者組下。

指定Nginx Worker程序可以打開的最大句柄描述符個數

文法:worker_rlimit_nofile limit;

作用:設定一個worker可以打開的最大句柄數。

限制信号隊列

文法:worker_rlimit_sigpending limit;

作用:設定每個使用者發往Nginx的信号隊列的大小。也就是說,當某個使用者的信号隊列滿了,這個使用者再發送的信号量就會被丢掉。

Nginx高性能配置

Nginx Worker程序個數

文法:worker_processes number;

預設:worker_processes 1;

作用:在master_worker運作方法下,定義worker程序的個數。worker程序的數量會直接影響性能。每個worker都是單線程的程序,他會調用各個子產品來實作各種功能。如果确定這些子產品不會出現堵塞式調用,那麼程序數可以和CPU核心數一樣;反之,則稍少一些。

綁定Nginx Worker程序到指定的CPU核心

文法:worker_cpu_affinity cpumask [cpumask…]

作用:假設每個worker都是很繁忙的,如果多個程序都在搶同一個CPU,那麼就會出現同步問題。反之,如果每個worker程序獨享一個CPU,就實作了完全的并發。

舉例:

worker_processes 4;

worker_cpu_affinity 1000 0100 0010 0001;

SSL硬體加速

文法:ssl_engine device;

作用:如果伺服器上有SSL硬體加速裝置,那麼就可以進行配置以加快SSL協定的處理速度。使用者可以用OpenSSL提供的指令檢視是否有SSL硬體加速裝置:

$ openssl engine -t
(dynamic) Dynamic engine loading support
     [ unavailable ]
           

Nginx Worker程序優先級設定

文法:worker_priority nice;

預設:worker_priority 0;

作用:在Linux和Unix中,當許多程序都處于可執行狀态時,按照優先級來決定本次核心選擇哪一個程序執行。程序配置設定的CPU時間片大小也與優先級有關,優先級越高,時間片越長(例如,在預設情況下,最小時間片是5ms,最大則有800ms)。優先級由靜态優先級和核心根據程序的執行情況所做的動态調整(目前隻有±5的調整)共同決定。nice是程序的優先級,他的取值範圍是-20~+19,-20是最高優先級,+19是最低優先級。不建議把nice的值設為比核心程序(通常為-5)還要小。

ab測試

# apt install -y apache2-utils
$ yum install -y httpd-tools
$ ab -n 20000 -k http://aidan.org/a/a
           

參考

Nginx事件配置

是否打開accept鎖

文法:accept_mutex [on|off];

預設:accept_mutex on;

作用:accept_mutex是Nginx的負載均衡鎖。這把鎖可以讓多個worker程序輪流的,序列化的與新的用戶端建立TCP連接配接。

accept鎖預設是打開的,如果關閉它,那麼建立TCP連接配接的耗時會更短,但不利于負載均衡,是以不建議關閉。

使用accept鎖後到真正建立連接配接之間的延遲時間

文法:accept_mutex_delay Nms;

預設:accept_mutex_delay 500ms;

作用:在使用accept鎖後,同一時間隻有一個worker程序能夠取到accept鎖,這個accept鎖不是堵塞鎖,如果取不到會立刻傳回。如果隻有一個worker程序試圖取鎖而沒有取到,他至少要等待accept_mutex_delay定義的時間才能再次試圖取鎖。

批量建立新連接配接

文法:multi_accept [on|off];

預設:multi_accept off;

作用:當事件模型有新連接配接時,盡可能的對本次排程中用戶端發起的所有TCP請求都建立連接配接。

選擇事件模型

文法:use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];

預設:Nginx會選出最合适的事件模型

作用:對于Linux系統,可供選擇的事件驅動模型有:poll,select,epoll三種,一般來說,epoll是性能最高的。

每個worker的最大連接配接數

文法:worker_connections number;

作用:定義每個worker程序可以同時處理的最大連接配接數。

Nginx事件模型

epoll是Linux核心為處理大批量檔案描述符而作的改進的poll,是Linux下多路複用IO接口select/poll的增強版本,它能顯著提高程式在大量并發連接配接中隻有少量活躍的情況下的系統CPU使用率。

優點:

  • 支援一個程序打開大數目的socket描述符。
  • IO效率不随FD數目增加而線性下降
  • 使用mmap加速核心與使用者空間的消息傳遞。

Nginx配置執行個體

worker_processes  auto;
events {
    use  epoll;
    worker_connections  65535;
}
http {
    upstream aidan.org{
        server 127.0.0.1:8881;
        server 127.0.0.1:8882;
        server 127.0.0.1:8883;
    }
    server {
        listen       80;
        server_name  aidan.org;
        location / {
            proxy_pass  http://aidan.org;
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;
        }
    }
}
           

繼續閱讀