Nginx高級應用--------性能優化,突破C100K
【引自asd1123509133的博客】1. 背景
介紹:
Nginx是一款高性能的HTTP和反向代理服務器,能夠選擇高效的epoll(linux2.6內核)、kqueue(freebsd)、eventport(solaris10)作為網絡I/O模型,能夠支持高達50000個并發連接數的響應,而內存、CPU等系統資源消耗卻非常低、運行非常穩定。
選擇的理由:
* 支持高并發連接:nginx使用高效的多路復用模型(epoll/linux, kqueue/freebsd, eventport/solaris)
* 內存消耗少:在服務器3W并發連接下,開啟10個Nginx進程消耗150MB內存(15MB*10)
* 成本低廉:購買F5 BIG-IP、NetScaler等負載均衡交換機需要幾十萬RMB,而開源Nginx替代這些商業設備。
* 其他理由:網絡配置簡單;支持rewrite重寫規則,能夠根據域名、URL的不同、將HTTP請求分到不同的后端服務器群組;內置的健康檢查功能;節省帶寬,支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭;支持熱部署,能夠在不間斷服務的情況下、對軟件版本進行升級
2. 環境
- [root@nginx ~]$ uname -r
- 2.6.32-642.13.1.el6.x86_64
- [root@nginx ~]$ uname -m
- x86_64
- [root@nginx ~]$ cat /etc/redhat-release
- CentOS release 6.8 (Final)
3. 優化
* nginx配置文件優化
- nginx進程數,建議按照cpu數目來指定,一般為它的倍數:
- worker_processes 4;
- 為每個進程綁定cpu:
- worker_cpu_affinity 00000001 00000010 00000100 00001000;
- nginx進程打開的最多文件描述符數目:
- worker_rlimit_nofile 102400;
- 使用epoll的I/O復用模型:
- use epoll;
- 每個進程允許的最多連接數:
- worker_connections 102400;
- keepalive超時時間:
- keepalive_timeout 60;
- 客戶端請求頭部的緩沖區大小: (分頁大小可以用命令getconf PAGESIZE取得):
- client_header_buffer_size 4k;
- 打開文件指定緩存,默認是沒有啟用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求后刪除緩存:
- open_file_cache max=102400 inactive=20s;
- 指定多長時間檢查一次緩存的有效信息:
- open_file_cache_valid 30s;
- 設置最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的:
- open_file_cache_min_uses 1;
* 系統優化
- timewait的數量,默認是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值減小):
- net.ipv4.tcp_max_tw_buckets = 6000
- 允許系統打開的端口范圍:
- net.ipv4.ip_local_port_range = 1024 65000
- 啟用timewait快速回收:
- net.ipv4.tcp_tw_recycle = 1
- 開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接:
- net.ipv4.tcp_tw_reuse = 1
- 開啟SYN Cookies,當出現SYN等待隊列溢出時,啟用cookies來處理:
- net.ipv4.tcp_syncookies = 1
- web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511:
- net.core.somaxconn = 262144
- 允許送到隊列的數據包的***數目:
- net.core.netdev_max_backlog = 262144
- 系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上:
- net.ipv4.tcp_max_orphans = 262144
- 記錄的那些尚未收到客戶端確認信息的連接請求的***值:
- net.ipv4.tcp_max_syn_backlog = 262144
- 時間戳可以避免序列號的卷繞:
- net.ipv4.tcp_timestamps = 0
- 內核放棄連接之前發送SYN+ACK包:
- net.ipv4.tcp_synack_retries = 1
- 內核放棄建立連接之前發送SYN包的數量:
- net.ipv4.tcp_syn_retries = 1
- 保持在FIN-WAIT-2狀態的時間:
- net.ipv4.tcp_fin_timeout = 1
- 當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時:
- net.ipv4.tcp_keepalive_time = 30
4. 總結
以需求驅動技術,技術本身沒有優略之分,只有業務之分。