Nginx是lgor Sysoev爲俄羅斯訪問量第二的rambler.ru站點設計開發的。從2004年發佈至今,憑藉開源的力量,已經接近成熟與完善。php
Nginx功能豐富,可做爲HTTP服務器,也可做爲反向代理服務器,郵件服務器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。而且支持不少第三方的模塊擴展。html
Nginx的穩定性、功能集、示例配置文件和低系統資源的消耗讓他後來居上,在全球活躍的網站中有12.18%的使用比率,大約爲2220萬個網站。nginx
牛逼吹的差很少啦,若是你還不過癮,你能夠百度百科或者一些書上找到這樣的誇耀,比比皆是。web
一、Http代理,反向代理:做爲web服務器最經常使用的功能之一,尤爲是反向代理。算法
這裏我給來2張圖,對正向代理與反響代理作個詮釋,具體細節,你們能夠翻閱下資料。後端
Nginx在作反向代理時,提供性能穩定,而且可以提供配置靈活的轉發功能。Nginx能夠根據不一樣的正則匹配,採起不一樣的轉發策略,好比圖片文件結尾的走文件服務器,動態頁面走web服務器,只要你正則寫的沒問題,又有相對應的服務器解決方案,你就能夠爲所欲爲的玩。而且Nginx對返回結果進行錯誤頁跳轉,異常判斷等。若是被分發的服務器存在異常,他能夠將請求從新轉發給另一臺服務器,而後自動去除異常服務器。瀏覽器
沒有聽過Nginx?那麼必定聽過它的"同行"Apache吧!Nginx同Apache同樣都是一種WEB服務器。基於REST架構風格,以統一資源描述符(Uniform Resources Identifier)URI或者統一資源定位符(Uniform Resources Locator)URL做爲溝通依據,經過HTTP協議提供各類網絡服務。緩存
然而,這些服務器在設計之初受到當時環境的侷限,例如當時的用戶規模,網絡帶寬,產品特色等侷限而且各自的定位和發展都不盡相同。這也使得各個WEB服務器有着各自鮮明的特色。安全
Apache的發展時期很長,並且是毫無爭議的世界第一大服務器。它有着不少優勢:穩定、開源、跨平臺等等。它出現的時間太長了,它興起的年代,互聯網產業遠遠比不上如今。因此它被設計爲一個重量級的。它不支持高併發的服務器。在Apache上運行數以萬計的併發訪問,會致使服務器消耗大量內存。操做系統對其進行進程或線程間的切換也消耗了大量的CPU資源,致使HTTP請求的平均響應速度下降。服務器
這些都決定了Apache不可能成爲高性能WEB服務器,輕量級高併發服務器Nginx就應運而生了。
俄羅斯的工程師Igor Sysoev,他在爲Rambler Media工做期間,使用C語言開發了Nginx。Nginx做爲WEB服務器一直爲Rambler Media提供出色而又穩定的服務。
而後呢,Igor Sysoev將Nginx代碼開源,而且賦予自由軟件許可證。
因爲:
因此,Nginx火了!
Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP三、SMTP代理服務器;Nginx能夠做爲一個HTTP服務器進行網站的發佈處理,另外Nginx能夠做爲反向代理進行負載均衡的實現。
說到代理,首先咱們要明確一個概念,所謂代理就是一個表明、一個渠道;
此時就設計到兩個角色,一個是被代理角色,一個是目標角色,被代理角色經過這個代理訪問目標角色完成一些任務的過程稱爲代理操做過程;如同生活中的專賣店~客人到adidas專賣店買了一雙鞋,這個專賣店就是代理,被代理角色就是adidas廠家,目標角色就是用戶。
說反向代理以前,咱們先看看正向代理,正向代理也是你們最常接觸的到的代理模式,咱們會從兩個方面來講關於正向代理的處理模式,分別從軟件方面和生活方面來解釋一下什麼叫正向代理。
在現在的網絡環境下,咱們若是因爲技術須要要去訪問國外的某些網站,此時你會發現位於國外的某網站咱們經過瀏覽器是沒有辦法訪問的,此時你們可能都會用一個操做FQ進行訪問,FQ的方式主要是找到一個能夠訪問國外網站的代理服務器,咱們將請求發送給代理服務器,代理服務器去訪問國外的網站,而後將訪問到的數據傳遞給咱們!
上述這樣的代理模式稱爲正向代理,正向代理最大的特色是客戶端很是明確要訪問的服務器地址;服務器只清楚請求來自哪一個代理服務器,而不清楚來自哪一個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。來看個示意圖(我把客戶端和正向代理框在一塊,同屬於一個環境,後面我有介紹):
客戶端必須設置正向代理服務器,固然前提是要知道正向代理服務器的IP地址,還有代理程序的端口。如
總結來講:正向代理,"它代理的是客戶端",是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。客戶端必需要進行一些特別的設置才能使用正向代理。
正向代理的用途:
(1)訪問原來沒法訪問的資源,如Google
(2) 能夠作緩存,加速訪問資源
(3)對客戶端訪問受權,上網進行認證
(4)代理能夠記錄用戶訪問記錄(上網行爲管理),對外隱藏用戶信息
明白了什麼是正向代理,咱們繼續看關於反向代理的處理方式,舉例如我大天朝的某寶網站,天天同時鏈接到網站的訪問人數已經爆表,單個服務器遠遠不能知足人民日益增加的購買慾望了,此時就出現了一個你們耳熟能詳的名詞:分佈式部署;也就是經過部署多臺服務器來解決訪問人數限制的問題;某寶網站中大部分功能也是直接使用Nginx進行反向代理實現的,而且經過封裝Nginx和其餘的組件以後起了個高大上的名字:Tengine,有興趣的童鞋能夠訪問Tengine的官網查看具體的信息:http://tengine.taobao.org/。那麼反向代理具體是經過什麼樣的方式實現的分佈式的集羣操做呢,咱們先看一個示意圖(我把服務器和反向代理框在一塊,同屬於一個環境,後面我有介紹):
經過上述的圖解你們就能夠看清楚了,多個客戶端給服務器發送的請求,Nginx服務器接收到以後,按照必定的規則分發給了後端的業務處理服務器進行處理了。此時~請求的來源也就是客戶端是明確的,可是請求具體由哪臺服務器處理的並不明確了,Nginx扮演的就是一個反向代理角色。
客戶端是無感知代理的存在的,反向代理對外都是透明的,訪問者並不知道本身訪問的是一個代理。由於客戶端不須要任何配置就能夠訪問。
反向代理,"它代理的是服務端",主要用於服務器集羣分佈式部署的狀況下,反向代理隱藏了服務器的信息。
反向代理的做用:
(1)保證內網的安全,一般將反向代理做爲公網訪問地址,Web服務器是內網
(2)負載均衡,經過反向代理服務器來優化網站的負載
一般狀況下,咱們在實際項目操做時,正向代理和反向代理頗有可能會存在在一個應用場景中,正向代理代理客戶端的請求去訪問目標服務器,目標服務器是一個反向單利服務器,反向代理了多臺真實的業務處理服務器。具體的拓撲圖以下:
截了一張圖來講明正向代理和反向代理兩者之間的區別,如圖。
圖解:
在正向代理中,Proxy和Client同屬於一個LAN(圖中方框內),隱藏了客戶端信息;
在反向代理中,Proxy和Server同屬於一個LAN(圖中方框內),隱藏了服務端信息;
實際上,Proxy在兩種代理中作的事情都是替服務器代爲收發請求和響應,不過從結構上看正好左右互換了一下,因此把後出現的那種代理方式稱爲反向代理了。
咱們已經明確了所謂代理服務器的概念,那麼接下來,Nginx扮演了反向代理服務器的角色,它是以依據什麼樣的規則進行請求分發的呢?不用的項目應用場景,分發的規則是否能夠控制呢?
這裏提到的客戶端發送的、Nginx反向代理服務器接收到的請求數量,就是咱們說的負載量。
請求數量按照必定的規則進行分發到不一樣的服務器處理的規則,就是一種均衡規則。
因此~將服務器接收到的請求按照規則分發的過程,稱爲負載均衡。
負載均衡在實際項目操做過程當中,有硬件負載均衡和軟件負載均衡兩種,硬件負載均衡也稱爲硬負載,如F5負載均衡,相對造價昂貴成本較高,可是數據的穩定性安全性等等有很是好的保障,如中國移動中國聯通這樣的公司纔會選擇硬負載進行操做;更多的公司考慮到成本緣由,會選擇使用軟件負載均衡,軟件負載均衡是利用現有的技術結合主機硬件實現的一種消息隊列分發機制。
Nginx支持的負載均衡調度算法方式以下:
對比項\服務器 | Apache | Nginx | Lighttpd |
Proxy代理 | 很是好 | 很是好 | 通常 |
Rewriter | 好 | 很是好 | 通常 |
Fcgi | 很差 | 好 | 很是好 |
熱部署 | 不支持 | 支持 | 不支持 |
系統壓力 | 很大 | 很小 | 比較小 |
穩定性 | 好 | 很是好 | 很差 |
安全性 | 好 | 通常 | 通常 |
靜態文件處理 | 通常 | 很是好 | 好 |
反向代理 | 通常 | 很是好 | 通常 |
二、負載均衡
Nginx提供的負載均衡策略有2種:內置策略和擴展策略。內置策略爲輪詢,加權輪詢,Ip hash。擴展策略,就天馬行空,只有你想不到的沒有他作不到的啦,你能夠參照全部的負載均衡算法,給他一一找出來作下實現。
上3個圖,理解這三種負載均衡算法的實現
Ip hash算法,對客戶端請求的ip進行hash操做,而後根據hash結果將同一個客戶端ip的請求分發給同一臺服務器進行處理,能夠解決session不共享的問題。
三、web緩存
Nginx能夠對不一樣的文件作不一樣的緩存處理,配置靈活,而且支持FastCGI_Cache,主要用於對FastCGI的動態程序進行緩存。配合着第三方的ngx_cache_purge,對制定的URL緩存內容能夠的進行增刪管理。
四、Nginx相關地址
源碼:https://trac.nginx.org/nginx/browser
官網:http://www.nginx.org/
若是你下載好啦,你的安裝文件,不妨打開conf文件夾的nginx.conf文件,Nginx服務器的基礎配置,默認的配置也存放在此。
在nginx.conf的註釋符號位#
nginx文件的結構,這個對剛入門的同窗,能夠多看兩眼。
默認的config
#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;
location / {
root html;
index index.html index.htm;
}
#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;
# }
#}
}
nginx文件結構
... #全局塊 events { #events塊 ... } http #http塊 { ... #http全局塊 server #server塊 { ... #server全局塊 location [PATTERN] #location塊 { ... } location [PATTERN] { ... } } server { ... } ... #http全局塊 }
一、全局塊:配置影響nginx全局的指令。通常有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,容許生成worker process數等。
二、events塊:配置影響nginx服務器或與用戶的網絡鏈接。有每一個進程的最大鏈接數,選取哪一種事件驅動模型處理鏈接請求,是否容許同時接受多個網路鏈接,開啓多個網絡鏈接序列化等。
三、http塊:能夠嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,鏈接超時時間,單鏈接請求數等。
四、server塊:配置虛擬主機的相關參數,一個http中能夠有多個server。
五、location塊:配置請求的路由,以及各類頁面的處理狀況。
下面給你們上一個配置文件,做爲理解,同時也配入我搭建的一臺測試機中,給你們示例。
########### 每一個指令必須有分號結束。################# #user administrator administrators; #配置用戶或者組,默認爲nobody nobody。 #worker_processes 2; #容許生成的進程數,默認爲1 #pid /nginx/pid/nginx.pid; #指定nginx進程運行文件存放地址 error_log log/error.log debug; #制定日誌路徑,級別。這個設置能夠放入全局塊,http塊,server塊,級別以此爲:debug|info|notice|warn|error|crit|alert|emerg events { accept_mutex on; #設置網路鏈接序列化,防止驚羣現象發生,默認爲on multi_accept on; #設置一個進程是否同時接受多個網絡鏈接,默認爲off #use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024; #最大鏈接數,默認爲512 } http { include mime.types; #文件擴展名與文件類型映射表 default_type application/octet-stream; #默認文件類型,默認爲text/plain #access_log off; #取消服務日誌 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式 access_log log/access.log myFormat; #combined爲日誌格式的默認值 sendfile on; #容許sendfile方式傳輸文件,默認爲off,能夠在http塊,server塊,location塊。 sendfile_max_chunk 100k; #每一個進程每次調用傳輸數量不能大於設定的值,默認爲0,即不設上限。 keepalive_timeout 65; #鏈接超時時間,默認爲75s,能夠在http,server,location塊。 upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; #熱備 } error_page 404 https://www.baidu.com; #錯誤頁 server { keepalive_requests 120; #單鏈接請求上限次數。 listen 4545; #監聽端口 server_name 127.0.0.1; #監聽地址 location ~*^.+$ { #請求的url過濾,正則匹配,~爲區分大小寫,~*爲不區分大小寫。 #root path; #根目錄 #index vv.txt; #設置默認頁 proxy_pass http://mysvr; #請求轉向mysvr 定義的服務器列表 deny 127.0.0.1; #拒絕的ip allow 172.18.5.54; #容許的ip } } }
上面是nginx的基本配置,須要注意的有如下幾點:
一、1.$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的ip地址; 2.$remote_user :用來記錄客戶端用戶名稱; 3.$time_local : 用來記錄訪問時間與時區;4.$request : 用來記錄請求的url與http協議;
5.$status : 用來記錄請求狀態;成功是200, 6.$body_bytes_s ent :記錄發送給客戶端文件主體內容大小;7.$http_referer :用來記錄從那個頁面連接訪問過來的; 8.$http_user_agent :記錄客戶端瀏覽器的相關信息;
二、驚羣現象:一個網路鏈接到來,多個睡眠的進程被同事叫醒,但只有一個進程能得到連接,這樣會影響系統性能。
三、每一個指令必須有分號結束。
本文轉自:https://www.cnblogs.com/wcwnina/p/8728391.html
https://www.cnblogs.com/knowledgesea/p/5175711.html