1.Nginx服務應用

Nginx服務應用javascript

Nginx的優勢和做用css

    Nginx是一款高性能的HTTP和反向代理的服務器軟件,仍是一個IMAP/POP3/SMTP(郵件)代理服務器!html

    Nginx在功能實現上都採用模塊化結構設計,都支持通用的語言接口,如PHP,Perl,python等,同時還支持正向和反向代理,虛擬主機,URL重寫,壓縮傳輸,SSL加密傳輸等。前端

    Nginx和Apache的區別:最大的差異是Apache的處理速度很慢,並且佔用不少內存資源,而Nginx正好相反。在功能實現上,Apache的全部模塊都支持動,靜態編譯的,而Nginx都是靜態編譯的,Nginx對Fcgi的支持很是好;在處理鏈接方式上,Nginx支持epoll,Nginx的安裝包很是小,只有幾百KM。java

    Nginx採用分階段資源分配技術,使得CPU和內存的佔用率很是低,Nginx保持10000個沒有活動的鏈接,只佔用2.5MB內存,所一,相似DOS這樣的攻擊對Nginx沒有任何做用。node

    Nginx採用內核poll模型,能夠支持更多的併發鏈接,最大能夠支持50000個併發鏈接數的響應,並且只佔用很低的內存資源!python

    在高可用方面,Nginx支持熱部署,啓動速度特別迅速,所以能夠不間斷服務的狀況下,對軟件版本或配置進行升級,即便運行數月也無需從新啓動,幾乎能夠作到7X24小時不間斷的運行。linux

Nginx的工做模塊和原理nginx

     Nginx由內核和模塊組成,其中,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件將客戶端請求映射到一個location block(location是Nginx配置中的一個指令,用於URL匹配),而這個location中所配置的每一個指令將會啓動不一樣的模塊去完成相應的工做。正則表達式

     Nginx的模塊從結構上分爲核心模塊,基礎模塊和第三方模塊,

核心模塊:HTTP模塊,ECENT模塊和MAIL模塊等。

基礎模塊:HTTP Access模塊,HTTP FastCGI模塊,HTTP Proxy模塊和HTTP Rewrite模塊。

第三方模塊:HTTP Upstream Request Hash模塊,Notice模塊和HTTP Access模塊,用戶根據本身的須要開發的模塊都屬於第三方模塊。

 

Nginx的模塊從功能上分爲三類

Handlers(處理器模塊)。此類模塊直接處理請求,並進行輸出內容和修改headers信息等操做。handres處理器模塊通常只能有一個。

Filters(過濾器模塊)。此類模塊主要對其餘處理器模塊輸出的內容進行修改操做,最後又Nginx輸出。

Proxies(代理類模塊)。此類模塊式Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務好比FastCGI等進行交互,實現服務代理和負載均衡等功能。

 

Nginx的工做原理

HTTP發出請---Nginx內核-----選擇一個Handlers處理器模塊-----handlers(處理器模塊)---生成內容---Filters(過濾器模塊1)---處理內容---Filters(過濾器模塊2)---Filters(過濾器模塊N)---HTTP響應請求

工做方式:單工做進程和多工程進程兩種模式。在單工做進程模式下,處主進程外,還有一個工做進程,工做進程是單線程的;在多工做進程模式下,每一個工做進程包含多個線程。Nginx默認爲單工做進程模式。

Nginx的模塊是直接編譯進去Nginx,所以屬於靜態編譯方式。啓動Nginx後,模塊被自動加載!在解析配置文件時,Nginx的每一個模塊都有可能去處理某個請求,可是同一個處理請求只能由一個模塊來完成。

 

Nginx的安裝

Nginx只能經過源碼包編譯安裝,在安裝Nginx之間,咱們須要安裝Nginx依賴的軟件:gccopenssl-devel,pcre,zlib-devel。

         在默認狀況下,經過編譯安裝的Nginx包含大部分可用模塊,Nginx支持哪些模塊,咱們能夠經過./configure –help查看nginx支持的全部模塊

         [root@localhost nginx-1.2.1]# ./configure --help

       --prefix=PATH                      set installation prefix                                          #指定nginx的安裝路徑

       --user=USER                        set non-privileged user for                              #指定用來運行nginx的用戶

                                     worker processes

       --group=GROUP                      set non-privileged group for                         #指定運行nginx的組

                                     worker processes

         在安裝時候,咱們推薦開啓NginxStatus和HTTPGzip模塊,在編譯安裝的時候加上--with-http_stub_status_module和--with-http_gzip_static_module。

 

Nginx配置文件結構

         Nginx的配置文件是一個純文本文件,它通常位於Nginx安裝目錄的conf目錄下,整個配置文件是以block的形式組織的。每一個block以「{}」來表示。block能夠分爲幾回層次,整個配置文件中Main位於最高層,在Main下面有Events(項目),HTTP等層級,而在HTTP層中又包括Server層,即server block,server block又能夠分爲location(位置)層,而且一個server block中能夠包含多個location block。

         一個完整的Nginx服務的配置文件結構如圖:

Nginx配置文件詳解

         nginx配置文件主要分紅四個部分:main(全局配置),server(主機配置),upstream(負載均衡服務器設置)和location(URL匹配特定位置的設置)。main部分設置的命令將影響到其餘全部設置;server部分的命令主要用於指定主機和端口;upstream命令主要用於負載均衡,設置一系列的後端服務器;location部分用於匹配網頁位置。這四者之間的關係是:server繼承main,location繼承server,upstream既不會繼承也不會被繼承。

         在這四個部分中,每一個部分都包含若干命令,這些命令主要包含Nginx的主模塊命令,事件模塊命令,HTTP核心模塊命令,同時每一個部分還可使用其餘HTTP模塊命令,例於:Http SSL模塊,HttpGzip Static模塊和Http Addition模塊等。

user nobody nobody;

worker_processes  4;

error_log logs/error.log notice;

pid logs/nginx.pid;

worker_rlimit_nofile 65535;

events{

         use epoll;

         worker_connections 65535;

}

解釋:

user是個主模塊指令,指定Nginx worker進程運行用戶以及用戶組,默認的用戶和用戶組都是nobody運行。

worker_processes是個主模塊指令,指定Nginx要開啓的進程數,每一個Nginx進程平均耗費10M-12M內存,根據經驗,通常指定一個進程足夠了,若是是多核CPU,建議指定和CPU的數量同樣多的進程數便可。

error_log是個主模塊指令,用來定義全局錯誤日誌文件。日誌輸出級別有debug,info,notice,warn,error,crit可供選擇,其中debug輸出日誌最爲詳細,而crit輸出日誌最少。

pid:用來指定進程id的存儲文件位置。

worker_rlimit_nofile:用於綁定worker進程和CPU,linux內核2.4以上可用。

events:設定Nginx的工做模式及鏈接數上限。其中參數「use」用來指定nginx的工做模式,nginx支持的工做模式有select,poll(選舉),kqueue(隊列),epoll,rtsig和/dev/poll。其中select和poll都是標準的工做模式,kqueue和epoll是高效的工做模式,對於Linux系統,epoll工做模式是首選。而參數」worker_connections」用於定義每一個進程的最大鏈接數,默認是1024。因此,一個nginx服務的的最大客戶端的鏈接數爲:worker_processes*worker_connections.進程的最大鏈接數受linux系統進程的最大打開文件數限制,在執行操做系統命令「ulimit –n 65535」更改能夠打開的最大文件的數量(臨時有效,因此咱們須要將命令加入到啓動nginx用戶的啓動腳本中),worker_connections纔會生效。

#對於root用戶而言,咱們直接修改ulimit=65535是沒有一點問題的,可是普通用戶就會報錯Socket/File: Can’t open so many files,普通用戶無權限修改這個值:因此咱們應該最正確的修改方法是:

# vim /etc/security/limits.conf

#<domain>      <type>  <item>         <value>

*               soft    nofile  32768

*               hard    nofile  65536

在配置文件中將文件句柄限制修改成軟:32768,硬:65536,配置在前面的domain,*號是表明全部,固然你也能夠對單個用戶進行設置。在這個當中,硬限制纔是實際的顯示,而軟限制,只是warnning限制,只會作出警告,ulimit命令自己也有軟硬之分,加-H就是硬,-S就是軟。

   

http {

    include       mime.types;

    default_type  application/octet-stream;

 

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

 

    access_log  logs/access.log  main;

 

    client_max_body_size        20m;

    client_header_buffer_size   32k;

    large_client_header_buffers 4       32k;

    sendfile        on;

    tcp_nopush     on;

    tcp_nodelay    on;

    keepalive_timeout  65;

    client_header_timeout 10;

    client_body_timeout 10;

send_timeout        10;

釋:

include:主模塊命令,實現對配置文件所包含文件的設定,能夠減小主配置文件的複雜度,相似於Apache中的include方法。

default_type:屬於HTTP核心模塊命令,這裏設定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式,例於,在沒配置PHP環境時,Nginx是不會解析的,用瀏覽器訪問PHP文件時會出現下載窗口。

log_format:用於指定nginx日誌的輸出格式。main爲此日誌輸出格式的名稱,能夠在下面的access_log命令中引用。

client_max_body_size:用來設置容許客戶端請求的最大的單個文件字節數。

client_header_buffer_size:用於指定來自客戶端請求頭的headerbuffer大小。對於大多數請求,1KB的緩衝區大小已經夠了,若是自定義了消息頭或有更大的cookie,能夠增長緩衝區大小。這裏設置爲32KB。

large_client_header_buffer:用來指定客戶端請求中較大的消息頭的緩存最大數量和大小,「4」爲個數,「128K」爲大小,最大緩存量爲4個128KB。

sendfile:用於開啓高效文件傳輸模式。將tcp_nopush和tcp_nodelay兩個命令設置爲「on」用於防止網絡阻塞。

keepalive_timeout:設置客戶端鏈接保持活動的超時時間。在超過這個時間以後,服務器會關閉該鏈接。

client_header_tomeout:設置客戶端請求頭讀取超時時間。若是超過這個時間,客戶端尚未發送任何數據,Nginx將返回「Request time out(408)」錯誤。

client_body_timeout:設置客戶端請求主體讀取超時時間。若是超過這個時間,客戶端尚未發送任何數據,Nginx將返回「Request time out(408)」錯誤,默認值是60。

send_timeout:設定響應客戶端的超時時間。這個超時僅限於兩個連接活動之間的時間,若是超過這個時間,客戶端沒有任何活動,Nginx將會關閉鏈接。

 

httpgzip模塊相關屬性設置:

    gzip  on;

    gzip_min_length 1k;

    gzip_buffers 4 16k;

    gzip_http_version 1.1;

    gzip_comp_level 2;

    gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

釋:

gzip:用於設置開啓或者關閉gzip模塊。開啓gzip壓縮,實時壓縮輸出的數據流。

gzip_min_length:設置容許壓縮的頁面最小字節數,頁面字節數從header(數據頭)頭的Content-length(內容長度)中獲取。默認值是0,無論頁面多大都進行壓縮。建議設置成大於1KB的字節數,小於1KB可能會越壓越大。

gzip_buffers:表示申請4個單位爲16kb的內存做爲壓縮結果流緩存。默認是申請與原始數據大小相同的內存空間來存儲GZIP壓縮結果。

gzip_http_version:用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓,使用默認便可。

gzip_comp_level:用於指定gzip壓縮比,1表示壓縮比最小,處理速度最快;9表示壓縮比最大,傳輸速度快,但處理速度最慢,也比較消耗CPU資源。

gzip_types:用來指定壓縮的類型,不管是否指定,「text/html」類型老是會被壓縮。

gzip_vary:讓前端的緩存服務器緩存通過gzip壓縮的頁面,例於用Squid(代理和緩存服務器)緩存通過Nginx壓縮的數據。

 

虛擬主機的配置:

           server {

      listen       80;

      server_name  www.gxl.com;

      index   index.html index.htm index.jsp;

      root    html;

      charset gb2312;

      access_log  logs/host.access.log  main;

           釋:

           建議將對虛擬主機進行配置的內容寫進另一個文件,而後經過include(包含)命令包含進來,這樣更利於維護和管理。配置虛擬主機代碼中每一個參數的含義。

         server:定義虛擬主機開始的關鍵字。

         listen:用於指定虛擬主機的服務端口。

         server_name:用來指定ip地址和域名,多個域名之間用空格分開。

         index:用於設定訪問的默認首頁地址。

         root:用於指定虛擬主機的網頁根目錄,這個目錄能夠是相對路徑,也能夠是絕對路徑。

         charset:用於設置網頁的默認編碼格式。

         assess_log:用來指定此虛擬主機的訪問日誌存放路徑,最後的man用於指定訪問日誌的輸出格式。

 

URL地址匹配設置:

         location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {                                                        #.*\.gif     就是匹配當前目錄下全部*.gif文件。         .        當前目錄         *       通配符     \.      轉義符,使後面這個點沒有特需含義  

    root    html;

    expires 30d;

}

釋(文件):

         URL地址匹配是nginx配置中最靈活的部分。經過location關鍵字定義了地址匹配的開始。location支持正則表達式,也支持條件判斷匹配。用戶能夠經過location命令實現nginx對動態,靜態網頁進行過濾處理。

在上面這段location代碼中,全部以擴展名以.gif,.jpg…..等等結尾的靜態文件都交給Nginx處理,而expires用來指定靜態文件的過時時間,這裏是30天。

 

location ~ ^/(upload|html)      {

root    html;

expires 30d;

}

釋(目錄):

這段代碼是將upload和html目錄下的全部文件都交給nginx處理,而這兩個目錄實在html目錄下的。

 

location ~ .*.jsp$      {

index index.jsp;

proxy_pass      http://locahost:8080;

}

釋:

這段代碼中,經過location關鍵字將全部以.jsp關鍵字爲後綴的文件都交給本機的8080端口處理。這樣就能夠實現nginx的動靜態分離,而爲何是8080端口勒?由於通常咱們都須要搭建tomcat服務,而8080端口就是tomcat服務的端口。

 

Nginx運行狀態,StubStatus模塊可以獲取nginx自上次啓動以來的工做狀態:

 location        /NginxStatus {

 stub_status     on;

 access_log       logs/NginxStatus.log;

 auth_basic      "NginxStatus";

 auth_basic_user_file    ../htpsswd;

 }

釋:

stub_status:是否啓用StubStatus的工做狀態統計功能

access_log:用來指定StubStatus模塊的訪問日誌功能

auth_basic:是nginx的一種認證機制

auth_basic_user_file:用來指定認證的密碼文件

 

因爲nginx的auth_basic認證採用的是與Apache兼容的密碼文件,所以須要用htpasswd命令來生成密碼文件:

htpasswd -c /usr/local/nginx/conf/htpasswd admin

設置user成功之後,咱們重啓一下服務,而後在瀏覽器中http://IP/NginxStatus訪問

Active connections:表示當前活躍鏈接數

第三行的上那個數字分別表示:當前總共處理鏈接的次數;成功建立握手次數;處理請求次數

reading:表示nginx讀取到客戶端header(信息頭)信息數           writing:表示nginx返回給客戶端header信息數     waiting:表示nginx已處理完,正在等候下一次請求命令時的駐留鏈接數。

 

error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

釋:

經過page命令能夠定製各類錯誤信息的返回頁面。在默認狀況下,nginx會在主目錄html目錄中查找指定的返回頁面。須要特別注意的是,這些錯誤信息的返回頁面信息的大小必定要超過512KB,不然會被IE替換成本身默認的。

相關文章
相關標籤/搜索