天天看點

nginx

一、簡介

Nginx (讀作"engine X") 由Igor Sysoev(俄羅斯)于2005年編寫,是一個免費、開源、高性能的HTTP伺服器和反向代理,也可以作為一個IMAP/POP3代理伺服器。根據 Netcraft 的 March 2014 WebServer Survey, 現在全世界23%的網站使用Nginx,而Apache占54.68%。Nginx因為穩定,豐富的功能集,配置簡單,資源占用低而聞名世界。

二、Nginx的特性和基礎架構

1、基本功能

       實作與服務靜态檔案(靜态資源的web伺服器),能緩存打開的檔案标書費

       反向代理伺服器,支援緩存、負載均衡、健康狀态檢測

       支援FastCGI

       子產品化機制,非DOS機制,支援多種過濾器,如gzip,ssl和用來完成圖形大小調整的圖像子產品

       支援SSL

2.擴充功能

       基于名稱和IP做虛拟主機

       支援keepalive

       支援平滑配置更新和程式版本更新

       定制通路日志,支援使用日志緩存以提高性能

       支援URL rewrite

       支援路徑别名

       支援基于IP和使用者的認證

       支援速率限制,并發數限制等

3.nginx的基本架構

       一個master,生成一個或多個worker

       事件驅動:kqueue,epoll,/dev/poll    

           消息通知:select poll rt rignals

       支援sendfile,sendfile64

       支援mmap

三、nginx的配置檔案詳解

       配置參數需要以分号結尾,文法格式如下

          參數名  值1 [值2....];

       配置參數中還支援使用變量

           支援使用子產品内置變量

           使用者自定義變量:set var_name value

       Nginx基本核心配置的類别

           用于調試、定位問題

           正常運作的必備配置

           優化性能的配置

           事件類的配置

1.正常運作的必備配置

          ①、user username[groupname]    

           以那個使用者身份運作,可以在配置檔案中指定,如果沒有指定則以編譯時的使用者為運作使用者

          ②、pid/path/to/pidfile_name

           指定nginx的pid檔案

          ③、worker_rlimit_nofile#

           指定一個worker程序所能打開的最大句柄數

          ④、worker_rlimit_sigpending#

            設定每個使用者能夠發往worker程序的資訊的數量  

2.優化性能相關的配置

          ①、worker_procrsses #

             worker程序的個數,通常其數值應該為cpu的實體核心數減1或2

          ②、worker_cpu_affinitycpumask .....

              用來綁定cpu的,比如

worker_processes    4;

                worker_cpu_affinity 0001 00100100 1000;

           ③、ssl_engine device

               在存在ssl硬體加速器的伺服器上,指定所使用的ssl硬體加速裝置

           ④、timer_resolution t

               每次核心事件調用傳回時,都會使用gettimeday()來更新nginx緩存時鐘,timer_resloution用來定義每隔多久才會由gettimeday()更新一次緩存時鐘,x86-64系統上,gettimeday()代價已經很小,可以忽略此配置

           ⑤、worker_priority nice

              -20到19之間的整數值,數值越小越優先被調用

3.跟事件相關的配置

           ①、accept_mutex on|off

               是否打開nginx的負載均衡鎖,此鎖能夠讓多個worker輪流地、序列化的與新的用戶端請求建立連接配接;而通常當一個worker程序的負載達到其上限的7/8,master就盡可能不将請求掉地至此worker

           ②、lock_file /path/to/lock_file

               鎖檔案的位置

           ③、accept_mutex_delay #ms

               使用accept鎖以後,隻有一個worker能取得鎖,一個worker程序為取得accept鎖的等待市場,即使用者建立等待的時間,如果某worker程序在某次試圖取得鎖時失敗了,則至少要等#ms才能再一次請求鎖

           ④、multi_accept on|off

               是否允許一次性地響應多個使用者請求,預設為off   

           ⑤、use [epoll|rtsig|select|poll]

               指定使用的模型,建議讓nginx自動選擇

           ⑥、worker_commections #

               每個worker能夠并發響應的最大請求數,如果為代理伺服器的話,worker_rlimit_nofile=worker_commections*2

4.用于調試、定位問題:隻在調試nginx時使用

           ①、daemon [on|off]

               關閉提供守護程序的模式,是否讓nignx運作于背景;調試時應該為off,使得所有資訊直接輸出在控制台上,預設為on

           ②、master_process on|off

               是否已master/worker模式運作nginx,預設為on,調試時可以設定為off以友善追蹤

           ③、error_log /path/to/error_log level

               錯誤日志檔案及其級别,調試時可以使用debug級别,但要求在編譯時必須使用--with-debug啟用debug功能,通常預設為error級别

5.跟記憶體及磁盤資源配置設定相關

           ①、client_body_in_file_only on|clean|off

               是否将請求包體存儲在磁盤中,不為off時,即時包體為0,也要存儲在硬碟上,如果為on,請求結束後包體檔案不會被删除,clean表示删除

          ②、client_body_in_single_buffer on|off

              http的包體是否存儲在記憶體buffer當中,預設為off

          ③、client_body_buffer_size

              nginx接受http包體的記憶體緩存區大小

          ④、client_body_temp_path dir-path[level1[level2[level3]]]

               定義http包體存放的臨時目錄,可以使用多級目錄,level用來指定某一級目錄的檔案名的長度

              client_body_temp_path /var/tmp/client 1 2

               表示在/var/tmp/client建立16個一級子目錄,在每個一級子目錄建立256個二級子目錄來存放緩存

          ⑤、client_header_buffer_size size

               正常情況下接受使用者請求的http封包header部分時配置設定的buffer大小,預設為1k

          ⑥、large_client_header_buffers numbersize

               存儲超大http請求首部的記憶體buffer大小及個數

          ⑦、connection_pool_size size

              nginx對于每個建立成功的tcp連接配接都會預先配置設定一個記憶體池,此處機用于設定此記憶體池的初始大小,預設為256

          ⑧、request_pool_size size

              nginx對于每個處理每個請求時會預先配置設定一個記憶體池,此處機用于設定此記憶體池的初始大小,預設為4K

四、nginx的http web功能

       必須使用虛拟主機來配置站點,每個虛拟主機使用一個server{}段來定義,非虛拟主機的配置和公共選項,需要定義在server之外,http之内

       1.server{}

          定義一個虛拟主機:nginx支援使用基于主機名或ip的虛拟主機

       2.listen

          liseten address [:port]

          liseten prot

          listen  unix:socket

          default_server:定義此server為http的預設的server,如果所有的server中任意沒有任何一個使用此參數,那麼第一個server為預設server

          rcvbuf=SIZE:接收緩沖大小

          sndbuf=SIZE:發送緩沖大小

       3.server_name[...]

          server_name可以跟多個主機名,名稱可以使用通配符和正規表達式(通常以~開頭):當nginx收到一個請求時,會取出去首部的server的值,而後跟衆server_name進行比較:比較方式

          (1)先做精确比對

          (2)左側通配符比對

          (3)右側通配符比對

          (4)正規表達式比對

      4.server_name_hash_bucket_size 32|64|128

          為了實作快速主機查找,nginx使用hash表來儲存主機名

       5.location [=|~ |~* |^~] uri {  ... }

        location @name { ... }

          功能:允許根據使用者請求的URI來比對指定的各location以進行通路比對;比對到時,将被location塊中的配置所處理

          == 精确比對

          ~:正規表達式模式比對,比對時區分字元大小寫

          ~*:正規表達式模式比對,比對時忽略字元大小寫

          ^~:隻需要前半部分與uri比對即可,不檢查正規表達式

          比對優先級:

              字元字面量最精确比對、正規表達式索引(有多個比對到時,由第一個比對到的所處理)、安字元字面量

五、檔案路徑定義

       1.root path     

           設定web資源路徑,用于指定請求的根文檔目錄,從根開始比對

           root:root/URI

       2.alias path

           指定路徑别名,隻能用于location中,從最後一個/開始比對

           alias: alias/

       3. index file ....

           定義預設頁面,可以跟多個值,自左向右比對

       4.error_pagecode ...[=[response]] URI

          當對于某個請求發回錯誤時,如果比對上了error_page指令中設定的code,則從定向至新的URI中

          錯誤重定向

       5.try_filespath1 [path2 ... ] URI

          自左向右嘗試讀取所有path所指定路徑,在第一個找到即停止并傳回,如果path均不存在,則傳回最後一個URI

location ~* ^/document/(.*)${

           root /www/htdocs

           try_files $uri/docu/$1 /temp.html

           }

          http://www.wangfeng7399.com/documents/a.html

           http://www.wangfeng7399.com/docu/a.html

          http://www.wangfeng7399.com/temp.html

六、網絡連接配接相關的設定

      1.keepalive_timeout time

          保持連接配接的逾時時長,預設為75s

      2.keepalive_requests n

          在一次長連接配接上允許承載的最大請求數

      3.keepalive_disable [msie6|asfari|none]

          對指定的浏覽器禁止使用長連接配接

       4.tcp_nodelayon|off

          對keepalive連接配接是否使用tcp_nodelay選項

      5.client_header_timeout time

          讀取http請求首部的逾時時長

      6.client_body_timeout time

          請求http請求包體的逾時時長

      7.save_timeout time

          發送響應的逾時時長

七、對用戶端請求的限制

      1.limit_except method ... { ... }

          指定範圍之外的其他的通路控制,隻能用于location中

      2.client_max_body_size SIZE

          http請求包體的最大值,常用于限定用戶端所能夠請求的最大包體,根據請求首部中的Content-Length來檢查,以避免無用的傳輸

       3.limit_ratespeed

          限制用戶端每秒傳輸的位元組數,預設為0,表示沒有限制

      4.limit_rate_after time

          nginx向用戶端發送響應封包時,如果時長超過了此處指定的時長,則後續的發送過程開始限速

八、檔案操作的優化

       1.aendfile on|off

           是否啟用sendfile功能

       2.aio on|off

           是否啟用aio功能

       3.open_file_cache max=N[incative=time]|off

           是否打開檔案緩存功能

           max:用于緩存條目的最大值,允許打開的緩存條目最大數,當滿兩類以後将根據LRU(最小最少連接配接數)算法進行置換     

           inactive:某緩存條目在指定時長内沒有被通路過時,将自動被删除,通常預設為60s

           緩存的資訊包括

               檔案句柄、檔案大小和上次修改的時間

               已經打開的目錄結構

               沒有找到或沒有通路權限的資訊

       4.open_file_cache_errorson|off

           是否緩存檔案找不到或者沒有權限通路等資訊

       5.open_file_cache_min_use #

           在inactive指定的時長内被通路超過此處指定的次數時,不會被删除

       6.open_file_cache_valid time

           多長時間檢查一次緩存中的額條目是否超出非活動時長,預設為60s

九、對用戶端請求的特殊處理

      1.ignore_invalid_headers on|off

          是否忽略不合法的http首部,預設為on,off意味着請求首部中出現不合規的首部将拒絕響應,隻能用于server和http中,建議改為off

      2.log_not_found on|off

          使用者通路的檔案不存在時,是否将其記錄到錯誤日志中

       3.resolveraddress

          指定nginx使用的dns伺服器位址

       4.resolvertimeout

          指定DNS解析逾時時長,預設為30s

      5.server_tokens on|off

          是否在錯誤頁面中顯示nginx的版本号

十、http核心子產品的内置變量

       1.$uri:目前請求的uri,不帶參數

       2.$request_uri:請求的uri,帶完整參數

       3.$host:http請求封包中host首部,如果請求中沒有host首部,則以處理此請求的主機的著名代替

       4.$hostname:nginx服務運作所在主機的主機名

       5.$remote_addr:用戶端ip

       6.$remote_port:用戶端port

       7.$remote_user:使用使用者認證時用戶端使用者輸入的使用者名

       8.$request_filename:使用者請求中的URI經過本地root或alias轉換後映射的本地的檔案路徑

       9.$request_method:請求方法

       10.$server_addr:伺服器位址

       11.$server_name: 伺服器名稱

       12.$server_port: 伺服器端口

       13.$server_protocol:伺服器想用戶端發送響應時的協定,如http/1.1 http/1.0

       14.$scheme: 在請求中使用的scheme映射協定本身的協定

       15.$http_HEADER:比對請求封包中指定的HEADER  例如:$http_host比對請求封包中的host首部

       16.$sent_http_HEADER:響應封包中指定的HERADER,例如:$http_content_type比對相應封包中的content-type首部

繼續閱讀