1. 程式人生 > >nginx介紹和配置

nginx介紹和配置

一、 概念

       Nginx——Ngine X,是一款自由的、開源的、高效能HTTP伺服器和反向代理伺服器;也是一個IMAP、POP3、SMTP代理伺服器;也就是說Nginx本身就可以託管網站(類似於Tomcat一樣),進行Http服務處理,也可以作為反向代理伺服器使用。

       Nginx 解決了伺服器的C10K(就是在一秒之內連線客戶端的數目為10k即1萬)問題。它的設計不像傳統的伺服器那樣使用執行緒處理請求,而是一個更加高階的機制—事件驅動機制,是一種非同步事件驅動結構。

       雖然目前Nginx的份額在市場上只佔很少部分,但是其高效能和低消耗記憶體的結構,使得其越來越普遍,典型的一個應用就是我們可以使用Nginx作為反向代理進行網站的負載均衡器。例如:Wordpress、GitHub等知名的網站都使用到了Nginx。

二、 正向代理和反向代理

       首先,代理伺服器一般指區域網內部的機器通過代理伺服器傳送請求到網際網路上的伺服器,代理伺服器一般作用在客戶端。例如:GoAgent翻牆軟體。我們的客戶端在進行翻牆操作的時候,我們使用的正是正向代理,通過正向代理的方式,在我們的客戶端執行一個軟體,將我們的HTTP請求轉發到其他不同的伺服器端,實現請求的分發。

這裡寫圖片描述

       反向代理伺服器作用在伺服器端,它在伺服器端接收客戶端的請求,然後將請求分發給具體的伺服器進行處理,然後再將伺服器的相應結果反饋給客戶端。Nginx就是一個反向代理伺服器軟體。

這裡寫圖片描述

       從上圖可以看出:客戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的IP地址,還有代理程式的埠。 
反向代理正好與正向代理相反,對於客戶端而言代理伺服器就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端。

這裡寫圖片描述

三、伺服器的型別:

1、Web伺服器:提供Http的訪問,例如Nginx、Apache、IIS等,雖然Tomcat也能夠實現,但這並不是他的主要功能,而且效能也遠不如專門的Web伺服器; 
2、應用程式伺服器:能夠用於應用程式的執行; 
3、代理伺服器:代理伺服器通常是客戶端訪問的一種行為,在整個客戶端訪問伺服器的過程中有著重要的作用; 
4、反向代理 
5、後臺伺服器 
6、CDN快取伺服器:它是快取伺服器的角色,而且是反向代理的應用,在網站部署的時候,他算是一種策略,對於遠距離訪問的解決方案。

四、 Nginx的特點

  Ø 跨平臺:可以在大多數Unix like 系統編譯執行。而且也有Windows的移植版本。 
  Ø 配置異常簡單:非常的簡單,易上手。 
  Ø 非阻塞、高併發連線:資料複製時,磁碟I/O的第一階段是非阻塞的。官方測試能支援5萬併發連線,實際生產中能跑2~3萬併發連線數(得益於Nginx採用了最新的epoll事件處理模型(訊息佇列)。 
  Ø Nginx代理和後端Web伺服器間無需長連線; 
  Ø Nginx接收使用者請求是非同步的,即先將使用者請求全部接收下來,再一次性發送到後端Web伺服器,極大減輕後端Web伺服器的壓力。 
  Ø 傳送響應報文時,是邊接收來自後端Web伺服器的資料,邊傳送給客戶端。 
  Ø 網路依賴性低,理論上只要能夠ping通就可以實施負載均衡,而且可以有效區分內網、外網流量。 
  Ø 支援內建伺服器檢測。Nginx能夠根據應用伺服器處理頁面返回的狀態碼、超時資訊等檢測伺服器是否出現故障,並及時返回錯誤的請求重新提交到其它節點上。 
  Ø 採用Master/worker多程序工作模式 
  Ø 此外還有記憶體消耗小、成本低廉(比F5硬體負載均衡器廉價太多)、節省頻寬、穩定性高等特點。

五、Nginx的基本功能

       Nginx的功能包括基本HTTP功能和擴充套件功能。和Apache伺服器一樣,Nginx伺服器為了提供更多的功能並且能夠有效地擴充套件這些功能。每一個模組都提供了一個功能,通過編譯這些功能模組來實現功能的擴充套件。

1、基本HTTP功能

a)提供靜態檔案和index檔案,處理靜態檔案,索引檔案以及自動索引,開啟檔案描述符快取;
b)使用快取加速反向代理,反向代理加速(無快取),簡單的負載均衡和容錯;
c)使用快取機制加速遠端FastCGI,簡單的負載均衡和容錯;
d)模組化的結構。過濾器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;
e)支援SSL 和 TLS SNI 支援;
f)IMAP/POP3代理服務功能;
g)使用外部 HTTP 認證伺服器重定向使用者到 IMAP/POP3 後端;
h)使用外部 HTTP 認證伺服器認證使用者後連線重定向到內部的 SMTP 後端;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、其他HTTP功能

a)基於名稱和基於IP的虛擬伺服器;
b)支援Keep-alive和管道連線;
c)靈活的配置和重新配置、線上升級的時候不用中斷客戶訪問的處理;
d)訪問日誌的格式,快取日誌寫入和快速日誌輪循;
e)3xx-5xx錯誤程式碼重定向;
f)速度限制
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

六、Nginx的基本模組

       Nginx的核心模組包括核心模組和事件驅動模組,即:CoreModule和EventsModule;另外還有第三方模組 HTTP核心模組,HttpCoreModule,它是Nginx伺服器的核心模組。

CoreModule和EventsModule模組的配置相對於HttpCoreModule會少一些,但是它們的配置將會影響系統的效能,而非功能上的差異。

1、CoreModule用於控制Nginx伺服器的基本功能; 
2、EventsModule用於控制Nginx如何處理連線。該模組的指令的一些引數會對應用系統的效能產生重要的影響; 
3、HttpCoreModule提供HTTP訪問Nginx伺服器,該模組是不能缺少的。

七、 內部程序模型

這裡寫圖片描述

       Nginx是以多程序的方式來工作的,當然Nginx也是支援多執行緒的方式的,只是我們主流的方式還是多程序的方式,也是Nginx的預設方式。Nginx採用多程序的方式有諸多好處。

       Nginx在啟動後,會有一個master程序和多個worker程序。master程序主要用來管理worker程序,包含:接收來自外界的訊號,向各worker程序傳送訊號,監控 worker程序的執行狀態,當worker程序退出後(異常情況下),會自動重新啟動新的worker程序。而基本的網路事件,則是放在worker程序中來處理了。多個worker程序之間是對等的,他們同等競爭來自客戶端的請求,各程序互相之間是獨立的。一個請求,只可能在一個worker程序中處理,一個worker程序,不可能處理其它程序的請求。worker程序的個數是可以設定的,一般我們會設定與機器CPU核數一致,這裡面的原因與Nginx的程序模型以及事件處理模型是分不開的。

八、 處理請求

  首先,Nginx在啟動時,會解析配置檔案,得到需要監聽的埠與IP地址,然後在Nginx的master程序裡面,先初始化好這個監控的socket(建立socket,設定addrreuse等選項,繫結到指定的IP地址埠,再listen),然後再fork(一個現有程序可以呼叫fork函式建立一個新程序。由fork建立的新程序被稱為子程序 )出多個子程序出來,然後子程序會競爭accept新的連線。 
  此時,客戶端就可以向Nginx發起連線了。當客戶端與Nginx進行三次握手,與Nginx建立好一個連線後,某一個子程序會accept成功,得到這個建立好的連線的socket,然後建立Nginx對連線的封裝,即ngx_connection_t結構體。 
  接著,設定讀寫事件處理函式並新增讀寫事件來與客戶端進行資料的交換。最後,Nginx或客戶端來主動關掉連線,到此,一個連線就壽終正寢了。

九、 實際應用

       由於Nginx是由俄羅斯人寫的,所以,Nginx 已經在俄羅斯最大的入口網站── Rambler Media(www.rambler.ru)上運行了3年時間,同時俄羅斯超過20%的虛擬主機平臺採用Nginx作為反向代理伺服器。

       在國內,已經有淘寶、新浪部落格、新浪播客、網易新聞、六間房、56.com、Discuz!、水木社群、豆瓣、YUPOO、海內、迅雷線上等多家網站使用 Nginx 作為Web伺服器或反向代理伺服器。

這裡寫圖片描述

       在近期一些專案的開發過程中,主要是使用Nginx和Tomcat來搭建高效能負載均衡叢集,即使用Nginx的反向代理功能來實現請求的分發,關於Nginx和Tomcat的組合使用。

十、Nginx配置說明

1、代理配置

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
		#靜態頁面目錄
		root	D:\workSpace\dwsj\dwsj-ui\dwsj-UI-AngularJS;
		#預設首頁
		index	index.html;
        location / {
			#瀏覽器端快取設定
			location ~* \.(css|js|jpg|jpeg|gif|png|swf|htm|html|json|xml|svg|woff|ttf|eot|map|ico)$ {
				expires 1h;
				if (-f $request_filename){
					break;
				}
			}
			#動態頁面,交給tomcat處理
			if ( !-e $request_filename){
				proxy_pass		http://127.0.0.1:8087;
			}
         
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
2.叢集配置(Nginx+tomcat)
worker_processes  1;#工作程序的個數,一般與計算機的cpu核數一致

events {
    worker_connections  1024;#單個程序最大連線數(最大連線數=連線數*程序數)
}

http {
    include       mime.types; #副檔名與檔案型別對映表
    default_type  application/octet-stream;#預設檔案型別

    sendfile        on;#開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
    
	keepalive_timeout  65; #長連線超時時間,單位是秒

    gzip  on;#啟用Gizp壓縮
	
	#伺服器的叢集
    upstream  netitcast.com {  #伺服器叢集名字	
		server    127.0.0.1:18080  weight=1;#伺服器配置   weight是權重的意思,權重越大,分配的概率越大。
		server    127.0.0.1:28080  weight=2;
	}	

	#當前的Nginx的配置
    server {
        listen       80;#監聽80埠,可以改成其他埠
        server_name  localhost;##############	當前服務的域名

	location / {
            proxy_pass http://netitcast.com;
            proxy_redirect default;
        }
		

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}