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首部

       17.$document_root:當前請求映射到的root配置

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章