1.簡介
Nginx是一個反向代理伺服器,其啟動速度極快、佔用記憶體極少、抗高併發能力強,因此大量在網際網路專案中應用。
Nginx訪問速度快的原因:
1.動靜分離,靜態資源由Nginx直接進行管理,動態請求轉發到後端。
2.Worker中的執行緒是AIO的(非同步非阻塞),當接收到請求後會將其放入到佇列中,然後繼續接收新的請求。
3.可以指定Master和Worker之間的IO多路複用模型。
2.正向代理與反向代理
2.1 正向代理
正向代理:代理的是客戶端,伺服器並不知道客戶端的是通過VPN進行訪問的。
2.2 反向代理
反向代理:代理的是伺服器,客戶端並不知道請求具體傳送到哪個伺服器中。
3.Nginx的工作模型
Nginx使用Master和Worker工作模型,一個Nginx服務由一個Master和多個Worker程式組成。
3.1 Master程式
Master程式負責讀取nginx.conf配置檔案以及管理Worker程式。
3.2 Worker程式
Worker程式負責處理連線和請求,且每個Worker程式中維護一個執行緒。
4.Nginx常用功能
4.1 通過Nginx管理靜態資源
location ~ \.(gif|jpg|png|js|css)$ {
root static;
}
*使用root表示返回靜態資源,root指定資源的根目錄(相對於Nginx安裝目錄)
*當匹配到此Location後,會進入root指定的根目錄,然後根據請求的/path訪問靜態資源。
4.2 通過Nginx進行反向代理到某個指定URL
location = /baidu{
proxy_pass http://ip:port/adserving/baidu;
}
*使用proxy_pass表示反向代理,將使用者的請求動態轉發到某個URL。
*當使用了反向代理,那麼對於Tomcat而言使用者的IP即Nginx的地址,如果想要檢視使用者的IP,那麼需要從Nginx日誌中檢視。
4.3 通過Nginx實現負載均衡
upstream name{
server ip:port ;
server ip:port ;
server ip:port ;
}
location /path {
proxy_pass http://name;
}
*當使用了負載均衡,那麼請求在動態轉發時會攜帶請求的/path。
*當使用了負載均衡叢集,那麼要注意叢集間Session的共享問題,可以將Session物件放入一個公共區域,當獲取Session時從公共區域中查詢。
負載均衡策略:輪詢、指定權重、對使用者IP進行Hash
1.輪詢:當不指定weight時,各個伺服器的權重相同,每個請求按訪問時間的順序逐一分配到各個伺服器中,如果伺服器發生故障,能被自動剔除。
upstream name{
server ip:port ;
server ip:port ;
server ip:port ;
}
2.指定權重:權重與訪問率成正比,如果伺服器發生故障,能被自動剔除。
upstream name{
server ip:port weight=1 ;
server ip:port weight=2 ;
server ip:port weight=3 ;
}
3.對使用者IP進行Hash:以元素的關鍵字k作為自變數,通過H(K)雜湊函式計算出雜湊值,以該雜湊值坐落在Hash環上的位置,找到其對應處理的節點,這裡的自變數就是使用者的IP,如果伺服器發生故障,不會自動被剔除。
upstream name{
ip_hash ;
server ip:port ;
server ip:port ;
server ip:port ;
}
*如果使用對使用者IP進行Hash的負載均衡策略,那麼每個使用者就固定訪問後端的一個節點,就能避免叢集間Session共享問題。
5.Nginx配置
#Nginx全域性配置
events {
#Event事件配置
}
http {
#HTTP全域性配置
server {
#Server全域性配置
#Location配置
}
}
5.1 Nginx全域性配置
Nginx全域性配置主要包括:執行Nginx服務的所屬組、 Worker程式的數量、錯誤日誌存放路徑、Master程式ID等。
#指定執行Nginx的所屬組
user root;
#worker程式數量(建議CPU數量 x 核數)
work_processed 12;
#錯誤日誌存放路徑(相對於Nginx安裝目錄)
error_log logs/error.log;
#Master程式ID的存放路徑(相對於Nginx安裝目錄)
pid logs/nginx.pid;
5.2 Event事件配置
Event事件配置主要包括: Worker程式處理連線與請求的細節、事件驅動模型的選擇等。
#設定多個Worker程式接收一個新連線的方式
#當值為on時,當一個新的連線到達時,只有一個Worker程式被喚醒(預設)
#當值為off時,當一個新的連線到達時,所有的Worker程式都被喚醒,共同爭奪這個連線。
accept_mutex on;
#設定Worker程式一次是否能處理多個新的連線
#當值為on時,Worker程式一次能夠接收多個新的連線(預設)
#當值為off時,Worker程式一次只能接收一個新的連線。
multi_accept on;
#事件驅動模型選擇,可選select、poll、epoll、kqueue
use epoll;
#Worker程式最大連線數(預設512)
worker_connections 1024;
5.3 HTTP全域性配置
HTTP全域性配置主要包括:請求的MIME型別、是否允許sendFile方式傳輸檔案、負載均衡、長連線超時時間、長連線的最大請求數。
#指定請求的MIME型別,可以指定多個
types{
text/html html htm shtml;
text/css css;
text/xml xml;
......
}
#負載均衡
upstream name{
ip:port;
ip:port;
ip:port;
}
#整個HTTP服務的訪問日誌(相對於Nginx安裝目錄),並且指定日誌列印的格式
access_log logs/access_all.log main
#定義日誌的列印格式
log_format main '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
#設定是否允許sendFile傳輸檔案
sendFile on;
#長連線的超時時間,若在指定時間內連線沒有傳送新的請求,那麼該連線將會被關閉
keepalive_timeout 600s;
#長連線可傳送的最大請求數,當連線累計傳送的請求數到達指定大小時,連線將會被關閉
keepalive_requests 1000;
*Nginx中預設使用長連線的方式,一個連線中可以傳送多個請求。
5.4 Server全域性配置
Server全域性配置主要包括:繫結基於域名或IP的虛擬主機、監聽的TCP埠。
#繫結基於域名或者IP的虛擬主機
server_name 192.168.2.90;
#監聽的TCP埠
listen 80;
#整個Server的訪問日誌,並且指定日誌列印的格式
access_log logs/192.168.2.90.access.log main;
#Nginx直接返回的指定狀態碼直接重定向
error_page 404 500 502 /error.html
*server_name只能繫結本機的IP或者域名,不能是其他主機的。
*error_page只適用於由Nginx直接返回的狀態碼,不適用於轉發到後端返回的狀態碼。
*不允許在Server中定義日誌的列印格式,只能使用HTTP全域性配置中定義的日誌列印格式。
5.5 Location配置
Location主要為了匹配使用者訪問的URL,使其進入相應的邏輯處理。
location 匹配符 path{
}
*匹配符優先順序:精確匹配 > 正則匹配(第一個符合的正則)> URL最長匹配
*其中^~與不使用直接/path作用一樣,都是URL字尾匹配。
*access_log、error_log、pid、root都是相對於Nginx的安裝目錄,而include是相對於conf目錄。
6.Nginx訪問流程
1.客戶端向Nginx發起HTTP請求。
2.進入Nginx的HTTP模組,然後根據請求的IP與埠進入相應的Server。
3.根據請求的/path匹配Location,若找不到相應的Location,則由Nginx直接返回404狀態碼,否則進入相應的Location進行處理。
4.日誌中記錄請求的相關資訊。
7.Nginx安裝與使用
7.1 下載Nginx安裝包並解壓
http://nginx.org/en/download.html
7.2 編譯以及安裝
#配置,指定Nginx的安裝目錄
./configure --prefix=/usr/nginx
#編譯與安裝
make & make install
*Nginx是由C語言進行編寫的,因此需要使用gcc編譯器進行編譯。
安裝成功後的目錄結構:
*其中conf目錄存放著Nginx的相關配置檔案,html目錄存放nginx預定義的靜態資原始檔,logs目錄用於存放日誌,sbin目錄包含nginx程式,用於啟動Nginx。
7.3 修改nginx配置檔案
user root;
worker_processes 8;
error_log logs/error.log;
pid logs/nginx.pid;
events {
accept_mutex on;
multi_accept on;
use epoll;
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;
keepalive_timeout 600s;
keepalive_requests 1000;
upstream loadBalance {
server 192.168.2.90:8080;
server 192.168.2.91:8080;
server 192.168.2.93:8080;
}
server {
listen 80;
server_name 192.168.2.90;
access_log logs/192.168.2.90.access.log main;
#精確匹配,適用於網站首頁
location = / {
proxy_pass http://192.168.2.90:8080/web/index.html;
}
#匹配URL,負載均衡
location / {
proxy_pass http://loadBalance;
}
#正則匹配,靜態資源直接返回
location ~ \.(gif|jpg|png|js|css)$ {
root static;
}
}
}
7.4 啟動Nginx
*當Nginx服務啟動後,會啟動一個Master程式和多個Worker程式。
7.5 Nginx常用命令
#啟動nginx,預設載入conf/nginx.conf配置檔案,可以使用-c選項配置
./nginx
#檢查nginx.conf配置檔案
./nginx -t
#重啟Nginx(熱部署)
./nginx -s reload
#關閉nginx
./nginx -s stop
8.Keepalived實現Nginx的高可用
由於Nginx作為流量的入口,一旦Nginx發生故障時則無法對外提供服務,因此需要通過Keepalived實現Ngixn的高可用。
Keepalived是一個高可用叢集的解決方案,其使用VRRP協議(Virtual Router Redundancy Protocol),其對外提供一個虛擬IP,使用者的請求直接到達虛擬IP,然後進入狀態為Master的Keepalived節點,當狀態為Master的Keepalived節點故障時,會自動將狀態為Backup的Keepalived節點切換為Master狀態。
*每個包含Nginx服務的節點中都需要安裝Keepalived服務,並且需要自定義一個指令碼去定時檢測Nginx的程式狀態,當發現Nginx故障時,及時kill掉本節點的Keepalived服務。