nginx簡單介紹
代理服務器:
一般是指局域網內部的機器通過代理服務器發送請求到互聯網上的服務器,代理服務器一般作用在客戶端。應用比如:GoAgent,FQ神器.
一個完整的代理請求過程為:
客戶端首先與代理服務器創建連接,接著根據代理服務器所使用的代理協議,請求對目標服務器創建連接、或者獲得目標服務器的指定資源。 Web代理(proxy)服務器是網絡的中間實體。 代理位於Web客戶端和Web服務器之間,扮演“中間人”的角色。HTTP的代理服務器即是Web服務器又是Web客戶端。
代理服務器是介於客戶端和Web服務器之間的另一臺服務器,有了它之後,瀏覽器不是直接到Web服務器去取回網頁而是向代理服務器發出請求,信號會先送到代理服務器,由代理服務器來取回瀏覽器所需要的信息並傳送給你的瀏覽器。
正向代理 :
是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
反向代理:
在服務器端接受客戶端的請求,然後把請求分發給具體的服務器進行處理,然後再將服務器的響應結果反饋給客戶端。Nginx就是其中的一種反向代理服務器軟件。
Nginx:
Nginx ("engine x") ,Nginx (“engine x”) 是俄羅斯人Igor Sysoev(塞索耶夫)編寫的一款高性能的 HTTP 和反向代理服務器。也是一個IMAP/POP3/SMTP代理服務器;也就是說,Nginx本身就可以托管網站,進行HTTP服務處理,也可以作為反向代理服務器使用。
說明:客戶端必須設置正向代理服務器,當然前提是要知道正向代理服務器的IP地址,還有代理程序的端口。反向代理正好與正向代理相反,對於客戶端而言代理服務器就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接著反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端。
用戶A始終認為它訪問的是原始服務器B而不是代理服務器Z,但實用際上反向代理服務器接受用戶A的應答,從原始資源服務器B中取得用戶A的需求資源,然後發送給用戶A。由於防火墻的作用,只允許代理服務器Z訪問原始資源服務器B。盡管在這個虛擬的環境下,防火墻和反向代理的共同作用保護了原始資源服務器B,但用戶A並不知情。
Nginx的應用現狀
Nginx 已經在俄羅斯最大的門戶網站── Rambler Media(www.rambler.ru)上運行了3年時間,同時俄羅斯超過20%的虛擬主機平臺采用Nginx作為反向代理服務器。在國內,已經有 淘寶、新浪博客、新浪播客、網易新聞、六間房、56.com、Discuz!、水木社區、豆瓣、YUPOO、海內、迅雷在線 等多家網站使用 Nginx 作為Web服務器或反向代理服務器。
Nginx的特點
跨平臺:Nginx 可以在大多數 Unix like OS編譯運行,而且也有Windows的移植版本。
配置異常簡單:非常容易上手。配置風格跟程序開發一樣,神一般的配置
非阻塞、高並發連接:數據復制時,磁盤I/O的第一階段是非阻塞的。官方測試能夠支撐5萬並發連接,在實際生產環境中跑到2~3萬並發連接數.(這得益於Nginx使用了最新的epoll模型)
事件驅動:通信機制采用epoll模型,支持更大的並發連接。
Nginx的事件處理機制
對於一個基本的web服務器來說,事件通常有三種類型,網絡事件、信號、定時器。
首先看一個請求的基本過程:建立連接---接收數據---發送數據 。
再次看系統底層的操作 :上述過程(建立連接---接收數據---發送數據)在系統底層就是讀寫事件。
1)如果采用阻塞調用的方式,當讀寫事件沒有準備好時,必然不能夠進行讀寫事件,那麽久只好等待,等事件準備好了,才能進行讀寫事件。那麽請求就會被耽擱 。阻塞調用會進入內核等待,cpu就會讓出去給別人用了,對單線程的worker來說,顯然不合適,當網絡事件越多時,大家都在等待呢,cpu空閑下來沒人用,cpu利用率自然上不去了,更別談高並發了 。
2)既然沒有準備好阻塞調用不行,那麽采用非阻塞方式。非阻塞就是,事件,馬上返回EAGAIN, 告訴你,事件還沒準備好呢,你慌什麽,過會再來吧。好吧,你過一會,再來檢查一下事件,直到事件準備好了為止,在這期間,你就可以先去做其它事情,然後再 來看看事件好了沒。雖然不阻塞了,但你得不時地過來檢查一下事件的狀態,你可以做更多的事情了,但帶來的開銷也是不小的
小結:非阻塞通過不斷檢查事件的狀態來判斷是否進行讀寫操作,這樣帶來的開銷很大。
3)因此才有了異步非阻塞的事件處理機制。具體到系統調用就是像select/poll/epoll/kqueue這樣的系統調用。他們提供了一種機制,讓你可以同時監控多個事件,調用他們是阻塞的,但可以設置超時時間,在超時時間之內,如果有事件準備好了,就返回。這種機制解決了我們上面兩個問題。
以epoll為例:當事件沒有準備好時,就放入epoll(隊列)裏面。如果有事件準備好了,那麽就去處理;如果事件返回的是EAGAIN,那麽繼續將其放入epoll裏面。從而,只要有事件準備好了,我們就去處理她,只有當所有時間都沒有準備好時,才在epoll裏 面等著。這樣,我們就可以並發處理大量的並發了,當然,這裏的並發請求,是指未處理完的請求,線程只有一個,所以同時能處理的請求當然只有一個了,只是在 請求間進行不斷地切換而已,切換也是因為異步事件未準備好,而主動讓出的。這裏的切換是沒有任何代價,你可以理解為循環處理多個準備好的事件,事實上就是 這樣的。
4)與多線程的比較:
與多線程相比,這種事件處理方式是有很大的優勢的,不需要創建線程,每個請求占用的內存也很少,沒有上下文切換,事件處理非常的輕量級。並發數再多也不會導致無謂的資源浪費(上下文切換)。
小結:通過異步非阻塞的事件處理機制,Nginx實現由進程循環處理多個準備好的事件,從而實現高並發和輕量級。
master/worker結構:一個master進程,生成一個或多個worker進程
內存消耗小:處理大並發的請求內存消耗非常小。在3萬並發連接下,開啟的10個Nginx 進程才消耗150M內存(15M*10=150M) 成本低廉:Nginx為開源軟件,可以免費使用。而購買F5 BIG-IP、NetScaler等硬件負載均衡交換機則需要十多萬至幾十萬人民幣
內置的健康檢查功能:如果 Nginx Proxy 後端的某臺 Web 服務器宕機了,不會影響前端訪問。
節省帶寬:支持 GZIP 壓縮,可以添加瀏覽器本地緩存的 Header 頭。
穩定性高:用於反向代理,宕機的概率微乎其微
Nginx的不為人知的特點
1、nginx代理和後端web服務器間無需長連接;
2、接收用戶請求是異步的,即先將用戶請求全部接收下來,再一次性發送後後端web服務器,極大的減輕後端web服務器的壓力
3、發送響應報文時,是邊接收來自後端web服務器的數據,邊發送給客戶端的
4、網絡依賴型低。NGINX對網絡的依賴程度非常低,理論上講,只要能夠ping通就可以實施負載均衡,而且可以有效區分內網和外網流量
5、支持服務器檢測。NGINX能夠根據應用服務器處理頁面返回的狀態碼、超時信息等檢測服務器是否出現故障,並及時返回錯誤的請求重新提交到其它節點上
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也是可以作為客戶端來請求其它server的數據的(如upstream模塊),此時,與其它server創建的連接,也封裝在ngx_connection_t中。作為客戶端,nginx先獲取一個ngx_connection_t結構體,然後創建socket,並設置socket的屬性( 比如非阻塞)。然後再通過添加讀寫事件,調用connect/read/write來調用連接,最後關掉連接,並釋放ngx_connection_t。
說明:nginx在實現時,是通過一個連接池來管理的,每個worker進程都有一個獨立的連接池,連接池的大小是worker_connections。這裏的連接池裏面保存的其實不是真實的連接,它只是一個worker_connections大小的一個ngx_connection_t結構的數組。並且,nginx會通過一個鏈表free_connections來保存所有的空閑ngx_connection_t,每次獲取一個連接時,就從空閑連接鏈表中獲取一個,用完後,再放回空閑連接鏈表裏面。
在這裏,很多人會誤解worker_connections這個參數的意思,認為這個值就是nginx所能建立連接的最大值。其實不然,這個值是表示每個worker進程所能建立連接的最大值,所以,一個nginx能建立的最大連接數,應該是worker_connections * worker_processes。當然,這裏說的是最大連接數,對於HTTP請求本地資源來說,能夠支持的最大並發數量是worker_connections * worker_processes,而如果是HTTP作為反向代理來說,最大並發數量應該是worker_connections * worker_processes/2。因為作為反向代理服務器,每個並發會建立與客戶端的連接和與後端服務的連接,會占用兩個連接。
Nginx典型的應用場景
負載均衡技術在現有網絡結構之上提供了一種廉價、有效、透明的方法,來擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的 靈活性和可用性。它有兩方面的含義:首先,大量的並發訪問或數據流量分擔到多臺節點設備上分別處理,減少用戶等待響應的時間;其次,單個重負載的運算分擔 到多臺節點設備上做並行處理,每個節點設備處理結束後,將結果匯總,返回給用戶,系統處理能力得到大幅度提高
Nginx的應用
1、到官網下載Windows版本,下載地址:http://nginx.org/en/download.html
2、解壓到磁盤任一目錄
3、修改配置文件:具體參考備註。
4、啟動服務:直接運行nginx.exe,缺點控制臺窗口關閉,服務關閉。守護進程的方式啟動:start nginx.exe
5、停止服務:nginx -s stop
重新加載配置:nginx -s reload
Nginx常見配置說明
worker_processes 8;
#nginx進程數,建議設置為等於CPU總核心數
worker_connections 65535;
#單個進程最大連接數(最大連接數=連接數*進程數)
client_header_buffer_size 32k; #上傳文件大小限制
large_client_header_buffers 4 64k; #設定請求緩
client_max_body_size 8m; #設定請求緩
autoindex on; #開啟目錄列表訪問,合適下載服務器,默認關閉。
tcp_nopush on; #防止網絡阻塞
tcp_nodelay on; #防止網絡阻塞
keepalive_timeout 120; #長連接超時時間,單位是秒
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮文件大小
gzip_buffers 4 16k; #壓縮緩沖區
gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
upstream blog.ha97.com {
#upstream的負載均衡,weight是權重,可以根據機器配置定義權重。weigth參數表示權值,權值越高被分配到的幾率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
#虛擬主機的配置
server
{
#監聽端口
listen 80;
#域名可以有多個,用空格隔開
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
nginx簡單介紹