Nginx ~模塊詳解~

         nginx和Apache一樣,都是HTTP服務器軟件,在功能實現上都採用模塊化結構設計,都支持通用的語言接口,如PHP、perl\python等,同時還支持正向和反向代理、虛擬主機、URL重寫、壓縮傳輸、SSL加密傳輸等。它們之間的最大差別是Apache的處理速度很慢且佔用很多內存資源,而nginx卻恰恰相反;在功能實現上,Apache的所有模塊都支持動、靜態編譯,而nginx模塊都是靜態編譯的,同時Apache對fcgi的支持不好,而nginx對Fcgi的支持非常好;在處理連接方式上,nginx支持epoll,而Apache卻不支持;在空間使用上,nginx安裝包僅僅只有幾百k,和nginx比起來Apache絕對是龐然大物。在瞭解nginx和Apache之間的異同點基本上就知道了nginx作爲HTTP服務器的優勢所在了。

選擇Nginx的優勢所在
   通過上面的簡單介紹,可以看出Nginx作爲HTTP服務器的優勢是顯而易見,它有很多其他web服務器無法比擬的性能和優勢;
   作爲web服務器,nginx處理靜態文件、索引文件、自動索引的效率非常高。
   作爲代理服務器,nginx可以實現無緩存的反向代理加速,提高網站運行的速度。
   作爲負載均衡服務器,nginx即可以在內部直接支持rails和php,也可以支持HTTP代理服務器對外進行服務,同時還支持簡單的容錯和利用算法進行負載均衡。
   在性能方面,nginx是專門爲性能優化而開發的,在實現上非常注重效率。它採用內核poll模型,可以支持更多的併發連接,最大可以支持對50000個併發連接數的響應,而且只佔用很低的內存資源。
   在穩定性方面,Nginx採用了分段資源分配技術,使得CPU與內存的佔用率非常低。Nginx官方表示,nginx保持10000個沒有活動的連接,而這些連接只佔2.5MB內存,因此,類似DOS這樣的***隊Nginx來說基本上是沒有任何作用的。
   在高可用型方面,Nginx支持熱部署,啓動速度特別迅速,因此可以在不間斷服務器的情況下,對軟件版本或者配置進行升級,即使運行數月也無需重新啓動,幾乎可以做到7X24小時不間斷地運行。

nginx的模塊與工作原理
nginx由內核和模塊組成,其中,內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個location block (location 是Nginx配置中的一個指令,用於URL匹配),而這個location中所匹配的每一個指令將會啓動不同的模塊去完成相應的工作

   nginx的模塊從結構上分爲核心模塊,基礎模塊,和第三方模塊,HTTP模塊、event模塊和mail模塊等屬於核心模塊,HTTP access 模塊、HTTP fastCGI模塊、HTTP proxy模塊和HTTP rewrite 模塊屬於基礎模塊,而http upstream reques hash 模塊、notice 模塊和HTTP access key 模塊屬於第三方模塊,用戶根據自己的需要開發的模塊都屬於第三方模塊。正是有了這麼多模塊的支撐,nginx的功能纔會如此強大。

   nginx 的模塊從功能上分爲如下三類。
handlers(處理器模塊)。此類模塊直接處理請求,並進行輸出內容和修改headers信息等操作。handlers處理器模塊一般只能有一個。
filters(過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由Nginx輸出。
proxies(代理類模塊)。此類模塊是nginx的http upstream 之類的模塊,這些模塊主要與後端一些服務,比如fastCGI等進行交互,實現服務代理和負載均衡等功能。如下圖所示:展示了Nginx模塊的HTTP請求和響應過程。

wKiom1NKMGThoCPqAADfq1md1Fw044.jpg

   在工作方式上,nginx分爲單工作進程和多工作進程兩種模式,在單工作進程模式下,除主進程外,還有一個工作進程,工作進程是單線程的;在多工作進程模式下,每個工作包含多個線程。nginx默認爲單工作進程模式。nginx的模塊直接被編譯進nginx,因此屬於靜態編譯方式。啓動nginx後,nginx的模塊被自動加載,不像Apache,首先將模塊編譯爲一個so文件,然後再配置文件中指定是否進行加載。在解析配置文件時,nginx的每個模塊都可能去處理某個請求,但是同一個處理請求只能由一個模塊來完成。


2、nginx的安裝及配置
安裝nginx所需的pcre-devel庫是爲了使Nginx支持HTTP Rewriter

unzip pcre-8.35.zip
cd pcre-8.35
./configure
make && make install

開始安裝nginx
nginx的安裝非常簡單。在默認情況下,經過編譯安裝nginx包含了大部分可用模塊。可以通過"./configure --help 選項設置各個模塊的使用情況,例如對不需要的http_ssi模塊,可以通過"--without-http_ssi_module"方式關閉此。同理,如果需呀"http_perl"模塊,那麼可以通過"--with-http_perl_module"方式進行安裝。

# tar  xvf nginx-1.4.7.tar.gz
# cd nginx-1.4.7
# ./configure  --with-http_stub_status_module  --prefix=/usr/local/nginx   --with-http_gzip_static_module
# make && make install

在上面的configure選項中,"--with-http_stub_status_module"可以用來啓動nginx nginx status 功能,以監控Nginx的當前狀態。
至此,nginx已經安裝完成了

nginx 配置文件的結構

nginx的配置文件是一個純文本文件,它一般位於nginx安裝目錄的conf目錄下,整個配置文件是以block的形式組織的。每個block一般以一個大括號"{}"來表示,block可以分爲幾個層次,整個配置文件中main指令位於最高層,在main層下面可以有events、HTTP等層級,而在HTTP層中又包含有server層,即server block, server block中又可分爲location 層,並且一個server block中可以包含多個location block。

   一個完整的配置文件結構如下圖所示:

wKiom1NL-KGCcZlHAABiHSrAfb4876.jpg


配置與調試nginx
nginx配置文件主要分爲4部分: main(全局設置)、server(主機設置)、upstream(負載均衡服務器設置)和location(URL 匹配特定位置的設置)。main部分設置的指令影響其他所有設置;server部分的指令主要用於指定主機和端口;upstream指令主要用戶負載均衡,設置一系列的後端服務器;location部分用於匹配網頁位置.這四者之間的關係如下:server 繼承main,location繼承server,upstream即不會繼承其他設置也不會被繼承。

在這4個部分當中,每個部分都包含若干指令,這些指令主要包含nginx的主模塊指令、事件模塊指令、HTTP核心模塊指令。同時每個部分還可以使用其他HTTP模塊指令,例如HTTP SSL模塊、HTTP gzip static 模塊和http addition 模塊等。

實例:
1、nginx 的全局配置

user              nginx;  # user是個主模塊指令,指定nginxworker進程運行用戶以及用戶組
worker_processes  1;  # worker_process 是主模塊指令,指定了nginx要開啓的進程數。每個nginx進程平均耗費10MB~12MB內存。根據經驗,一般指定一個進程足夠了,如果是多核CPU,建議指定和CPU的數量一樣多的進程數即可。
error_log  /var/log/nginx/error.log; # error 是個模塊,用來定義全局錯誤日誌文件。日誌輸出級別有debug、info、notice、warn、error、crit 可供選擇,其中debug輸出日誌最爲詳細,而crit輸出日誌最少。
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;
pid        /var/run/nginx.pid; # pid 是個主模塊指令,用來指定進程id的存儲文件位置。
events {
    use epoll;
    worker_connections  1024;
}
# events 指令用來設定nginx的工作模式及連接數上限。
# use是個事件模塊指令,用來nginx的工作模式。nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在linux平臺上,而kqueue用於BSD系統中。對linux系統,epoll工作模式時首選。
# worker_connections 也是個事件模塊指令,用於定義nginx每個進程的最大連接數,默認是1024.最大客戶端連接數由worker_processes和worker_connections決定,即max_client=worker_processes*worker_connections,在作反向代理時變爲max:clients=worker_processes*worker_connections/4。


HTTP服務器配置
接下來開始對HTTP服務器進行配置

http {
    include       /etc/nginx/mime.types;  # include 是個主模塊指令,實現對配置文件所包含的文件的設定,可以減少配置文件的複雜度。類似於Apache中的include方法。
    default_type  application/octet-stream; # default_type 屬於HTTP核心模塊指令,這裏設定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置PHP環境時,nginx是不予解析的,此時,用瀏覽器訪問PHP文件就不會出現下載窗口.
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
     # log_format 是nginx的HttpLog模塊指令,用於指定nginx日誌的輸出格式。main爲此日誌輸出格式的名稱,可以在下面的access_log指令引用。
    access_log  /var/log/nginx/access.log  main;
    sendfile        on; # sendfile 參數用於開啓高效文件傳輸模式。將tcp_nopush和tcp_nodely兩個指令設置爲on,用戶防止網絡阻塞
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
# 用於設置客戶端連接保持活動的超時時間。在超過這個時間之後,服務器會關閉該連接。



HttpGzip模塊配置
   下面配置nginx的HttpGzip模塊。這個模塊支持在線實時壓縮輸出數據流。要查看是否安裝了此模塊,需要使用下面命令:

# /usr/local/nginx/sbin/nginx  -V
nginx version: nginx/1.4.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
configure arguments: --with-http_stub_status_module --prefix=/usr/local/nginx --with-http_gzip_static_module
gzip  on;
# gzip 用於設置開啓或者關閉gzip模塊,"gzip on" 表示開啓gzip壓縮,實時壓縮輸出數據流
gzip_min_length   1k;
# gzip_min_length 用於設置允許壓縮的頁面最小字節數,頁面字節數從header頭的content-length中獲取。默認值是0,不管頁面多大都進行壓縮。建議設置成大於1k的字節數,小於1K可能會越壓越大。
gzip_buffers     4   16k;
# 表示申請4個單位爲16K的內存作爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。
gzip_http_version 1.1;
# gzip_http_version 用戶設置識別http協議版本,默認是1.1,目前大部分瀏覽器已經支持gzip壓縮,使用默認即可。
gzip_comp_level   2;
# gzip_comp_level 用於指定gzip壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也比較消耗CPU資源。
gzip_types      text/plain   application/x-javascript text/css appalachian/xml;
# gzip_type 用來指定壓縮的類型,無論是否指定,"text/html" 類型總是會被壓縮的。
gzip_vary on;
# gzip_vary 選項可以讓前端的緩存服務器緩存經過gzip壓縮的頁面,例如,用squid 緩存經過nginx壓縮的數據。


4、負載均衡配置
   下面設定負載均衡的服務器列表。

    upstream ixdba.net {
    ip_hash;
    server 192.168.10.1:80;
    server 192.168.10.1:80 down;
    server 192.168.10.1:8009 max_fails=3 fail_timeout=20s;
    server 192.168.10.1:8080;
}

   upstream 是Nginx的HTTP upstream模塊,這個模塊通過一個簡單的調度算法來實現客戶端IP到後端服務器的負載均衡。在上面的設定中,通過upstream指令指定了一個負載均衡器的名稱indba.net。這個名稱可以任意指定,在後面需要用到的地方直接調用即可。

   nginx的負載均衡模塊目前支持4種調度算法,下面進行分別介紹,其中後兩項屬於第三方調度算法。
   輪詢(默認)。每個請求安時間順序逐一分配到不同的後端服務器,如果後端某臺服務器掛掉了,故障系統唄自動剔除,使用戶訪問不受影響;

   weight。指定輪詢權重,weight值越大,分配到的訪問機率越高,主要用於後端每個服務器性能不均的情況下。

   ip_hash: 每個請求按訪問IP的hash結構分配,這樣來自同一個IP的訪客固定訪問一個後端服務器,有效解決了動態網頁存在的session共享問題。

   fair。這是比上面更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身不支持fair的,如果需要使用這種調度算法,必須下載Nginx的upstream_fair模塊。

   url_hash。此方法按訪問irl的hash結果來分配請求,是每個url定向到同一個後端服務器,可以進一步提高後端緩存服務器的效率。nginx本省是不支持url_hash的,如果需要使用這種調度算法,必須安裝nginx的hash軟件包。


在HTTP Upstream模塊中,可以通過server指令指定後端服務器的丨P地址和端口,同時還吋以設定毎個後端服務器在負栽均衡調度中的狀態。常用的狀態有:

□    down,表示當前的server暫時不參與負載均衡

□    backup.聞留的各份機器。當其他所有的非backup機器出觀故障或者忙的時候,纔會請求backup機器,因此這臺機器的壓力最輕。

□    max.fails,允許諳求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_ upstream模塊定義的錯誤,

□    fail. timeout,在經歷了 max—fails次失敗後,暫停股務的時間。max_failS可以和fail_ timeout 一起使用。


5.    server 虛擬主機配置


下面介紹對虛擬主機的配置。建議將對虛似主機進行配置的內容寫進另外一個文件.然 後通過include指令包念進來.這樣便維護和管理.

server {
    listen       80;
    server_name  localhost;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    location / {
        root   html;
        index  index.html index.htm;
    }

server標誌定義虛擬主機開始:listen用十指定虛擬主機的服務器端口 : server_name用 來指定IP地址或者域名,多個域名之間用空格分開:index用於設定訪叫的默認首員地址: root指令用於指定虛擬主機的網頁根目錄,這個目錄可以是相對格徑.也可以是絕對路徑: charset用於設置網頁默認編碼格式
access_log用來指定虛擬機的訪問日誌存放路掄,最後的main用於指定訪日誌的輸出格式.


6.    URL匹配配費

URL地址匹配是Nginx匹配中最靈活的部分。location支持正則表達式匹配,也支持條件判斷匹配,用戶可以通過location指定實現nginx對動、靜態的過濾處理。
以下這段設置是通過location指令來對網頁URL進行分析處理,所有擴展名爲.gif、. jpg、.jpeg、.png、.bmp, .swf的靜態文件都交給Nginx處理,而expires用來指定靜態文件 的過期時間,這甲.是30天,

  location ~.*\. (gi| jpg| jpeg|png|lq>| swf)$ {
                root /web/wwwroot/www. ixdba.net;
                expires 30d;
}

以下這段設資是將upload和html下的所有文陣都交拾Nginx來處通.當然,upload和 html目錄包含在/web/wwwroot/www.ixdba.net目錄中      

location ~ ^/(upload|hcal)/ {
                root /web/wwwroot/www.ixdba.net;
                expire* 30d;
}

在最後這段設霣中,location是對此虛擬主機下動態網頁的過濾處理,也就是將所有 以jsp爲後結的文件都交給本機的8080端口處理,          

Locacion  ~ .*.jsp$ {
                    index index.jsp;
                proxy_pass http://loc*lhost:8080;
}


7. StubStatus模塊配置

StubStatuss模塊能夠獲取Nginx自上次啓動以來的工作狀態,此模塊非核心欖塊,需要在Nginx編譯安裝時手工指定才能使用,
以下指令指定啓用獲取Nginx 工作狀態的功能    

location /nginxstatus {
           stub_status              on;
           access_log               logs/nginxstatus。log;
           auth_basic               "nginxStatus"
           auth_basic_user_file       ../htpasswd; 
       }

stub—status爲“ on ”表示啓用StubStatus的工作狀態統計功砣:acccss_log用來指定 StubStatuS模塊的訪問日誌文件:auth_basic是Nginx的一種認證機制:auth」basic_user_file 用來指定認證的密碼文件.由於Nginx的auih_basic認證採用的是與Apachc兼容的密碼文件,因此需要用Apache的htpasswd命令來生成密碼文件.例如要添加一個webadmin用戶, 可以使用下面的方式生成密碼文件:

/usr/local/apache/bin/htpasswd -c /usr/local/conf/htpasswd  webadmin

會得到以下提示信息:

New password:

輸入密碼之後.系統會要求再次輸入密碼.確認之後添加用戶成功。
要查看Nginx的運行狀態,吋以輸人hwp://ip/NginxStatus,然後輸人剛剛創建的用戶名
和密碼就可以看到如下信息

active connections:1
server accepts handled requests
393411 393411 393799
Reading:0 Writing:1 Waiting:0


Aciivc connections表當前活躍的連接數,第三行的3個數字表示Nginx與前總共處理了393411個連接.成功創建了393411次握手,總共處理了 393 799個請求,最後 一行的Reading表示Nginx讀取到客戶端Header信息數:Writing表示Nginx返回給客戶端的Header信息數:Waiting表示Nginx已經處理完、正在等候下一次請求指令時的駐留連接數.

在最後這段設置中.設置了虛擬主機的錯誤信息總返回頁面,通過error_page指令可以定製各種錯誤信息的返問頁面-在默認情況下,Nginx會在主目錄的html目錄中査找指定的返回頁面。特別需要注意的是,這些錯誤信息的返回頁面大小一定要超過512KB,否則會被IE瀏覽器替換爲IE默認的頁面。

error_page 404    /404.html;
error_page 502 502 503 504 /50x.html;
    locatim = /50x.html {
        root   html;
        }
}
}


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