nginx指令配置釋義

在Nginx配置中,指令不少,但與nginx性能主要有關的並非不少,在使用中,公司的ops都會給出他們的標配,每每咱們除非有特殊的性能需求,纔會考慮nginx的默認配置是否對性能有影響,且nginx自身在設計時,對性能的優化已考慮不少。 html

OS考量
  • 事件模型:nginx的事件模型應與選擇的操做系統相匹配, Linux 2.6+有效的模型是使用epoll。
  • 文件描述符:由於與客戶端創建對應的鏈接,表明須要使用某文件句柄描述符與之通訊,可使用命令ulimit -a查看系統設定值,建議特別是高併發時,儘可能提升內核限制,而後使用nginx指令worker_rlimit_nofile 改變nginx worker 進程可打開的最大文件描述符限制。
Nginx 自身
  • worker_processes : 定義nginx worker進程的數量,系統默認爲1,一般設定這個值時,應該與cpu核的數目一致,即便比CPU核數目多出,但不會帶來很明顯的效益,在測試時發現,增長這個數字,會當即提升CPU使用率,但更可能是由於進程的調度形成,並無有效利用CPU。此外,還應考慮讀取文件的大小以及負載模式。若是業務邏輯有大量的阻塞IO操做,能夠適當提升這個值。
  • worker_connections: 某worker進程在某時刻可維持的鏈接數,wiki指出nginx的最大客戶端鏈接數爲worker_connections*worker_processes值,不少人給出的建議是儘可能調大這個值,當業務高併發鏈接時。理想設置是(umilit -n) /num of worker_processes ,可是考慮到HTTP請求的特性,短暫而高突發且不一樣請求的時長不一致,能夠都設置爲最大值umlit --n ,實際中使用時,可根據本身的狀況適當調整,畢竟描述符的使用也是須要系統資源的。
  • worker_cpu_affinity : 綁定worker進程到某特殊的CPU上,僅容許FressBSD與Linux使用,參考別人的建議以及實際壓測發現,並無帶來變化,畢竟操做系統層次的調度算法,可參考的運行因素不少,會比實際手工分配有機會在負載均衡上作得更出色,不建議去考慮此指令,除非你的CPU負載在實際查看中發現存在問題,但也是推薦修改調度算法。
  • sendfile:在於傳輸TCP幀時,能夠將數據直接從內存寫到網絡芯片的緩存中,避免數據在內核態到用戶態之間反覆上下文切換,以及其餘內存訪問操做如TLB,虛擬內存地址到實地址的映射等,下降CPU消耗等,通常建議開啓。在網上查閱相關配置時,指出當讀取文件過大(>4M)時,建議關閉這個選項,調整其餘指令的值,特別是輸出緩衝區,使用異步IO(Linux許多版本還不支持)等,可是至於爲何關閉sendfile,發現都沒有很好的解釋,看sendfile的官方指出在初始設計時,並非針對大文件的偏移操做,可是2.4版本已經添加sendfile64,且已經有glibc的sendfile透明封裝好,於是對於這個建議仍是很困惑。有人給出的解釋是「以平衡磁盤與網絡I/O處理速度,下降系統的uptime」,可是以爲仍是模糊,畢竟磁盤有內核緩存,網絡芯片也有自身的緩存。偶然間看到nginx郵件列表中的內容,指出sendfile在nginx中傳輸文件的大小是受到限制的。
  • TCP_NODELAY與TCP_NOPUSH: 與socket選項有關,決定着操做系統如何處理網絡緩存以及什麼時候將數據發送給終端用戶。TCP_NOPUSH, 避免傳輸數據小,網絡帶寬沒法有效利用,將多個數據組包一塊兒發送,也就是Nagle's 算法, 而wiki中指出僅能與sendfile一塊兒使用,能夠方便在調用sendfile以前準備頭部信息,或優化網絡吞吐率,畢竟減小傳輸過程的網絡數據包。可是HTTP的數據更可能是偏向流處理,而不是相似telnet,等待用戶輸入數據,且此算法會有最高達200ms的延遲上限; TCP_NODELAY則是禁用Nagle's 算法,wiki指出啓用僅被包含在keep_alive 鏈接裏。Linux 內核2.5.17 以後已經容許兩個指令能夠組合在一塊兒使用。默認是TCP_NODELAY 開啓,TCP_NOPUSH 關閉。
  • keepalive_timeout: 涉及到HTTP協議的特性,容許客戶端與服務端創建的鏈接持續到所設置的時間爲止,容許客戶端發起多個請求,而再也不進行屢次握手協議,節省socket創建的時間,與NGINX自身的優化卻是無關,更多體如今客戶端加載頁面多個資源的響應速度,影響用戶的體驗。根據業務適當設置,以避免惡意的客戶端佔用,形成性能的影響。
減小IO

Nginx在CPU與內存使用上效率都很高,廣泛不是性能瓶頸,可是磁盤由於自身的特色,形成讀寫都很慢,於是應儘可能減小nginx的磁盤讀寫。 linux

  • open_file_cache:緩存打開的文件描述符、文件大小以及修改時間,還有存在的目錄信息等其餘信息,至於相關配置其餘指令可參考nginx wiki.
  • access_log :記錄正常的訪問請求,可用於統計,安全檢查等,可是卻頻繁的讀寫文件,且buffer不工做,對於任何的日誌項打開文件,寫完後就迅速關閉文件。若是沒有特殊需求,建議關閉。不然嘗試改變請求訪問日誌記錄的保存方式等,固然容忍其開啓也能夠。
  • error _log: 與access_log同樣,可是由於出錯的請求並非不少,於是開啓影響不大!

在nginx中也須要調整buffer大小,設置太小,某些請求或者後端返回的數據就會存儲在臨時文件中,形成磁盤的讀寫。 nginx

  • client_body_buffer_size: 請求體的緩存大小,若是請求體的數據大於設置的這個值將會被寫入到臨時文件中,於是在處理post請求的數據時,須要注意這個選項。
  • fastcgi_buffers: 用於緩存後端fastcgi進程返回的數據,當返回的數據過大就會寫入臨時文件,於是運行PHP程序時,能夠適當調整此值,默認是32KB/64KB,取決於操做系統的頁設置大小。
  • output_buffers :這條指令雖然nginx有關的配置中出現,可是在nginx指令的索引中沒有找到,並且查閱很多配置,發現更可能是讀取大文件時,關閉sendfile,調整此值,提升服務器的吞吐率。
  • gzip:並不屬於減小磁盤IO,可是能夠有效減小網絡傳輸數據的大小,畢竟現實中數據包傳輸時間受帶寬影響的時間要明顯高於主機之間的距離形成的傳送時間,於是壓縮數據包,能夠有效利用帶寬,下降帶寬形成的延遲,默認壓縮級別是7,可是壓縮級別不要設置過高,畢竟要消耗CPU時間,帶來的壓 縮效果並不很明顯。

可能在配置中看到的其餘某些選項 算法

  • client_header_buffer_size與large_client_header_buffers: 緩存請求頭,當請求頭的大小超出這兩個指令指定的緩存限制時,就會返回相關錯誤碼,於是採用默認配置就好,並不影響nginx的性能。
  • client_body_timeout與client_header_timeout:更可能是設置服務端在讀取客戶端發送的請求時設置的超時時間,避免客戶端惡意或者網絡情況不佳形成鏈接長期佔用,影響服務端的可處理的能力。須要注意的是,client_body_timeout是設置在兩個連續的讀取操做之間的超時,並非傳輸整個請求體的超時時間設置。當相關的數據包在超時時間內沒有讀取到時,都會返回408,默認設置值是60s。
  • send_lowat與send_timeout: 側重與客戶端的交互,send_lowats 當設置爲非零值時,nginx就會試圖減小對客戶端socket的發送操做,默認設置爲零;而send_timeout是設置服務端傳送回應包時的超時時間,針對兩個連續的寫操做,而不是整個迴應過程的超時設置,默認設置60s.

在Nginx中還有不少其餘指令,可能會影響到瀏覽器的行爲,如某些模塊的指令可有效利用瀏覽器的本地緩存,可以影響到用戶瀏覽網頁的體驗效果。
在實際使用中,若是沒有特殊需求,可直接採用使用nginx源碼安裝後給出的默認配置,調整worker_processes以及worker_connections,其餘參數,針對須要,決定是否開啓。 後端

參考文獻
  1. http://nginx.org/en/docs/http/ngx_http_core_module.html#directives
  2. http://linux.die.net/man/2/sendfile
  3. http://www.techrepublic.com/article/use-sendfile-to-optimize-data-transfer/ (對sendfile如何起做用很不錯的分析)
  4. http://blog.martinfjordvald.com/2011/04/optimizing-nginx-for-high-traffic-loads
  5. http://www.lifelinux.com/how-to-optimize-nginx-for-maximum-performance/
  6. http://baus.net/on-tcp_cork/ (tcp_nopush設置時,對業務的弊與利)
  7. https://calomel.org/nginx.html (nginx配置文件樣例還有些調優的內容)
  8. http://www.phoenixvps.com/guides/2013/04/nginx-configuration-examples (nginx 配置文件樣例)
相關文章
相關標籤/搜索