nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP3、SMTP代理服務器;nginx可以作為一個HTTP服務器進行網站的發布處理,另外nginx可以作為反向代理進行負載均衡的實現
一、靜態HTTP服務器
首先,Nginx是一個HTTP服務器,可以將服務器上的靜態文件(如HTML、圖片)通過HTTP協議展現給客戶端。
配置:
server { listen 80; # 端口號 location / { root /usr/share/nginx/html; # 靜態文件路徑 } }
二、反向代理服務器
什么是反向代理?
客戶端本來可以直接通過HTTP協議訪問某網站應用服務器,網站管理員可以在中間加上一個Nginx,客戶端請求Nginx,Nginx請求應用服務器,然后將結果返回給客戶端,此時Nginx就是反向代理服務器。負載均衡、虛擬主機等,都是基於反向代理實現
配置:
server { listen 80; location / { proxy_pass http://192.168.20.1:8080; # 應用服務器HTTP地址 } }
什么是正向代理?
某些情況下,代理我們用戶去訪問服務器,需要用戶手動的設置代理服務器的ip和端口號。或者說正向代理最大的特點是客戶端非常明確要訪問的服務器地址;服務器只清楚請求來自哪個代理服務器,而不清楚來自哪個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。
三、負載均衡
負載均衡多在高並發情況下需要使用。其原理就是將數據流量分攤到多個服務器執行,減輕每台服務器的壓力,多台服務器(集群)共同完成工作任務,從而提高了數據的吞吐量。同時帶來的好處是,其中一台服務器萬一掛了,只要還有其他服務器正常運行,就不會影響用戶使用。
Nginx可以通過反向代理來實現負載均衡。Nginx可使用的負載均衡策略有:輪詢(默認)、權重、ip_hash、url_hash(第三方)、fair(第三方)
-
weight輪詢(默認):接收到的請求按照順序逐一分配到不同的后端服務器,即使在使用過程中,某一台后端服務器宕機,nginx會自動將該服務器剔除出隊列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的后端服務器設置一個權重值(weight),用於調整不同的服務器上請求的分配率;權重數據越大,被分配到請求的幾率越大;該權重值,主要是針對實際工作環境中不同的后端服務器硬件配置進行調整的。
-
ip_hash:每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的算法下一個固定ip地址的客戶端總會訪問到同一個后端服務器,這也在一定程度上解決了集群部署環境下session共享的問題。
-
fair:智能調整調度算法,動態的根據后端服務器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的服務器分配到請求的概率高,響應時間長處理效率低的服務器分配到的請求少;結合了前兩者的優點的一種調度算法。但是需要注意的是nginx默認不支持fair算法,如果要使用這種調度算法,請安裝upstream_fair模塊
-
url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向后端固定的某個服務器,可以在nginx作為靜態服務器的情況下提高緩存效率。同樣要注意nginx默認不支持這種調度算法,要使用的話需要安裝nginx的hash軟件包
輪詢配置:
upstream myapp { server 192.168.20.1:8080; # 應用服務器1 server 192.168.20.2:8080; # 應用服務器2 } server { listen 80; location / { proxy_pass http://myapp; } }
根據客戶端ip地址的hash值將請求分配給固定的某一個服務器處理、ip_hash方式配置
upstream myapp { ip_hash; # 根據客戶端IP地址Hash值將請求分配給固定的一個服務器處理 server 192.168.20.1:8080; server 192.168.20.2:8080; } server { listen 80; location / { proxy_pass http://myapp; } }
通過weight來控制的配置
upstream myapp { server 192.168.20.1:8080 weight=3; # 該服務器處理3/4請求 server 192.168.20.2:8080; # weight默認為1,該服務器處理1/4請求 } server { listen 80; location / { proxy_pass http://myapp; } }
四、虛擬主機
有的網站訪問量大,需要負載均衡。然而並不是所有網站都如此出色,有的網站,由於訪問量太小,需要節省成本,將多個網站部署在同一台服務器上。
例如將www.jim.com和www.tim.com兩個網站部署在同一台服務器上,兩個域名解析到同一個IP地址,但是用戶通過兩個域名卻可以打開兩個完全不同的網站,互相不影響,就像訪問兩個服務器一樣,所以叫兩個虛擬主機。
server { listen 80 default_server; server_name _; return 444; # 過濾其他域名的請求,返回444狀態碼 } server { listen 80; server_name www.jim.com; # www.jim.com域名 location / { proxy_pass http://localhost:8080; # 對應端口號8080 } } server { listen 80; server_name www.tim.com; # www.tim.com域名 location / { proxy_pass http://localhost:8081; # 對應端口號8081 } }
在服務器8080和8081分別開了一個應用,客戶端通過不同的域名訪問,根據server_name可以反向代理到對應的應用服務器。
虛擬主機的原理是通過HTTP請求頭中的Host是否匹配server_name來實現的,有興趣的同學可以研究一下HTTP協議。
另外,server_name配置還可以過濾有人惡意將某些域名指向你的主機服務器。