Linux NGINX NGINX:engine X ,2002年開發,分為社區版和商業版(nginx plus ) 社區版:分為主線版(開發版,奇數),穩定版(偶數) Nginx官網:http://nginx.org NGINX的兩大功能:web伺服器、反向代理伺服器 NGINX和APACHE一樣 ...
Linux NGINX
NGINX:engine X ,2002年開發,分為社區版和商業版(nginx plus )
社區版:分為主線版(開發版,奇數),穩定版(偶數)
Nginx官網:http://nginx.org
NGINX的兩大功能:web伺服器、反向代理伺服器
NGINX和APACHE一樣,也是基於模塊設計的,使用不同的模塊可以實現不同的功能。模塊只能靜態編譯、不能動態載入。
NGINX的架構:一個主進程,若幹個子進程。
主進程:接收用戶的請求,轉發用戶請求、監控子進程
子進程:為用戶提供服務(真正工作的進程),子進程數量一般設置為cpu的核心數
NGINX的安裝:
編譯安裝:下載源碼包進行編譯安裝
源碼包地址:http://nginx.org/en/download.html
案例地址:https://www.cnblogs.com/heyongshen/p/16854271.html
源安裝:centos 8和ubuntu 1804倉庫中預設帶的nginx版本是1.14版本
源下載地址:http://nginx.org/en/linux_packages.html
NGINX的相關參數:
-v 查看版本信息 -V 顯示更詳細的信息,包括編譯參數
-t nginx配置文件語法檢查
-c 找到nginx的配置文件
-e 指定錯誤日誌
-g 指定指令,使用自己指定的指令來替代配置文件的指令
例如:nginx配置文件裡面的 user nginx; 可以不寫在配置文件裡面,而是通過nginx -g "user nginx" 來指定。
-s 發送信號,stop、reload等信號
啟動NGINX:
可以通過編寫systemd的unit文件來交給systemd托管,使用systemctl命令啟動
通過NGINX自身的命令來啟動:
# 啟動nginx nginx 預設就是後臺執行
# nginx
說明:如果使用unit文件的方式來托管NGINX,那麼不可以在使用nginx自身的命令來啟動,會衝突。
NGINX的信號管理:
可以通過ngins -s 給nginx發送指令,從而管理nginx。
kill命令的使用參考:https://www.cnblogs.com/heyongshen/p/16854476.html
#nginx信號控制使用的幾個選項
stop 立刻停止服務,相當於信號SIGTERM,SIGINT
quit 優雅的停止服務,相當於信號SIGQUIT
reload 重新載入配置文件,重新生成worker進程,master進程不變,相當於信號SIGHUP
reopen 重新開始記錄日誌文件,在切割日誌時用途較大。相當於信號SIGUSR1
SIGUSR2 平滑升級可執行程式
SIGWINCH 優雅的停止工作進程
說明:
USER1 USER2,作為用戶自定義信號,程式可以自定義這2個信號的含義,在收到這2個信號的時候,可以自定義代碼進行對著2個信號的處理,nginx的SIGUSR1和SIGUSR2分別代表切割日誌與平滑升級。
NGINX的平滑升級和回滾:
NGINX的平滑升級
#實現過程
1.下載並解壓源碼包 tar -xzf nginx-1.22.1.tar.gz
2.查看原來的編譯選項,使用原有編譯選項源碼編譯新版nginx nginx -V
./configure --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --prefix=/apps/nginx
3.執行make進行編譯,不執行make install,因為會將舊版本就行覆蓋 make -j 4
4.備份舊版本 mv old_file{,.bak}
5.將編譯的新版本移動到指定的位置(舊版本所在的位置) cp -a nginx /apps/nginx/sbin/
6.檢查新版本的nginx是否正常 nginx -t
7.發送user2信號進行平滑升級(此時兩個master共存)kill -USR2 `cat /apps/nginx/run/nginx.pid`
舊版本主進程PID的文件重命名為nginx.pid.oldbin
8.給舊的進程發送信號,關閉老的worker kill -QUIT `cat /apps/nginx/run/nginx.pid.oldbin`
#先關閉舊nginx的worker進程,而不關閉nginx主進程方便回滾
9.#經過一段時間測試,新版本服務沒問題,最後退出老的master kill -QUIT `cat /apps/nginx/run/nginx.pid.oldbin`
# 回滾:
#如果升級的版本發現問題需要回滾,可以重新拉起舊版本的worker
kill -HUP `cat /apps/nginx/run/nginx.pid.oldbin`
#最後關閉新版的master
kill -QUIT `cat /apps/nginx/run/nginx.pid`
#移除新版本的nginx,將舊版本的nginx重新命名為nginx,並檢查
rm -f nginx ; mv nginx.bak nginx;
#升級nginx
usr2-->winch-->quit--->hub
備份舊版本、將新版本放到nginx正常的安裝路徑 -- 此時現在系統中運行的仍然是舊版本
進行語法檢查,看新版本的nginx是否能正常載入系統中的配置文件
#USR2 平滑升級可執行程式,將存儲有舊版本主進程PID的文件重命名為nginx.pid.oldbin,並啟動新的nginx
#舊master是新master的父進程
發送usr2信號給舊版本nginx,此時新的nginx會生成新的master和worker,新舊進程的master和worker共存(此時雖然新舊進程都在監聽80埠,但是只有新的master才會接收用戶的請求。)
#先關閉舊nginx的worker進程,而不關閉nginx主進程方便回滾
優雅關閉舊的worker進程(WINCH信號),逐步關閉worker進程,主進程不退出 。此時就進程的進程編號文件xxx.oldbin
#測試一段時間後,新版本沒問題,就可以關閉舊nginx的master進程。
發送QUIT信號可以推出master進程
#此時如果新版本有問題舊可以回滾:因為舊master的父進程沒有關閉
通過給舊nginx發送HUP信號重新載入配置文件,重新生成worker進程
#舊master恢復後,關閉新nginx的master進程
NGINX的配置:
nginx的配置文件中,每一個配置都要以分號結尾。
全局配置:
user:指定啟動和運行nginx服務的用戶
例如:user nginx #指定運行nginx的用戶為nginx
worker_processes:設置nginx的worker進程,建議設置為和cpu核心數一樣
例如:worker_processes auto #表明會根據cpu的核心數來指定nginx的worker進程數量
pid:指定nginx服務的pid文件所在位置
例如:pid run/nginx.pid; #指定nginx的pid文件存放位置為 安裝目錄/run/nginx.pid 相對路徑,相對於安裝目錄
include:配置文件
例如;include /usr/share/nginx/modules/*.conf;
error_log:指定錯誤日誌的路徑
例如:error_log /var/log/nginx/error.log;
worker_cpu_affinity:設置nginx的親和性,讓worker進程在固定的cpu上運行,較少了worker進程在cpu之間的來回跳轉。
例如:worker_cpu_affinity 1000 0100 0010 0001; #本機有四個cpu,0001代表第一個cpu,0010 代表第二個cpu。。。。每個cpu綁定一個worker進程。
設置客戶端連接nginx伺服器的相關參數:events
events設置塊主要影響nginx伺服器與用戶的網路連接,比如是否允許同時接受多個網路連接,使用哪種事件驅動模型處理請求,每個工作進程可以同時支持的最大連接數,是否開啟對多工作進程下的網路連接進行序列化等。
events:設置客戶端連接nginx伺服器的相關參數
例如:events {
worker_connections 1024; #表示單個worker進程支持的最大併發是1024
}
location指令塊配置:location指令塊主要是對用戶請求的url進行匹配,並作對應的處理。
location:用戶請求的url匹配;對匹配到的url作對應處理;包括地址重定向、數據緩存和應答控制等功能都是在這部分實現,另外很多第三方模塊的配置也是在location模塊中配置。
location / { #當用戶訪問網站根的時候,就訪問html這個目錄
root html; #root 根,相對路徑
index index.html index.htm; #指定預設的顯示頁面
}
#location實現精確匹配 = 表示精確匹配
location = /logo.jpg { #表示uri必須是logo.jpg才會匹配到
root /data/nginx/images;
index index.html;
}
# ~ 實現區分大小寫的模糊匹配.
location ~ /A.?\.jpg { #匹配字母A開頭的jpg圖片,後面?表示A後面零次或一個字元 例如:Ax.jpg
index index.html;
root /data/nginx/html/image;
}
# ~* 不區分大小寫
location ~* /A.?\.jpg {
index index.html;
root /opt/nginx/html/image;
}
# 以什麼z
location ^~ /images { #必須要以images作為開始的才匹配,不區分大小寫
root /data/nginx/;
index index.html;
}
說明:
= 標識精確匹配,大小寫敏感
^~ 不區分大小寫,以xx作為開頭
~ 包含正則表達式,區分大小寫
~* 包含正則表達式,不區分大小寫
\ 轉移字元(逃脫符) 包含xx內容就匹配
無符號: 標識起始於的意思
優先順序:
=, ^~, ~/~*, 不帶符號
location指令塊中的相關指令說明:
root 指定web的家目錄 文件的絕對路徑等於 root+location
alias:定義路徑別名,會把訪問的路徑重新定義到其指定的路徑(alias只能放在location中)
index:#指定預設的顯示頁面
例如:index index.html index.htm; 多個頁面空格分隔
# root和alis的區別:
root:指定用戶的根目錄,用戶訪問的路徑:root+location
alis:重定向,把訪問的路徑重新定義到其指定的路徑。訪問路徑:alis
例如:
server{
listen 80;
server_name www.yongshen.com;
location /xx {
#表明訪問的就是根下麵的xx使用root指定了根為/data/nginx/html/pc所以訪問的完整路徑:/data/nginx/html/pc/xx
index index.html
root /data/nginx/html/pc; #用戶訪問的路徑:/data/nginx/html/pc/xx(把location中的/替換為root)
}
}
server{
listen 80;
server_name www.yongshen.com;
location /xx {
index index.html
alias /data/nginx/html/pc; # 用戶訪問的路徑:用戶訪問/xx時,就顯示/data/nginx/html/pc中的數據信息。
}
}
http指令塊:
http塊是Nginx伺服器配置中的重要部分,緩存、代理和日誌格式定義等絕大多數功能和第三方模塊都可以在這設置,http塊可以包含多個server塊,而一個server塊中又可以包含多個location塊
http {
server {
location {
}
}
}
listen:配置nginx的監聽埠
例如:listen 80; #表示nginx服務監聽本機所有ip地址的80埠
server_name:設置主機的名稱
例如:server_name www.yongshen.com #設置本伺服器的名稱為www.yongshen.com
例如:
http { #主要是實現web伺服器的相關配置
include mime.types; #包含的文件類型
default_type application/octet-stream; #預設類型,如果該文件不在 mime.types中被定義,那麼他就是default類型
include conf.d/*.conf; #包含子配置文件,相對路徑,以為conf目錄為起點
sendfile on;
keepalive_timeout 65;
}
# 子配置文件
# web的配置
[root@CentOS8 conf.d]# cat pc.conf
server{
listen 80; #監聽的埠,不指定ip預設監聽所有網卡的80埠
server_name www.yongshen.com; #虛擬主機的網站名稱
location / { #實現從uri到文件系統的路徑映射 /表示的就是預設的資源存放位置
index index.html #指定預設打開的網頁
root /data/nginx/html/pc; #指定web的家目錄 文件的絕對路徑等於 root+location
}
}
MIME相關知識點
mime:多用途互聯網郵件擴展類型,它設計的最初目的是為了在發送電子郵件時附加多媒體數據,讓郵件客戶程式能根據其類型進行處理。
多媒體概念:
媒體是傳播信息的媒介,實現將信息源傳遞到受信者得一種手段,例如圖像、聲音、文字等
多媒體:多種媒體的綜合,例如圖像、聲音、文字、視頻等媒體就可以統稱為多媒體
最早的HTTP協議中,並沒有附加的數據類型信息,所有傳送的數據都被客戶程式解釋為超文本標記語言HTML 文檔,為了支持多媒體數據類型,HTTP協議中就使用了附加在文檔之前的MIME數據類型信息來標識數據類型。
客戶端接收到伺服器返回來的數據後,根據mime標識的數據類型來解析不同類型的數據。
每個MIME類型由兩部分組成,前面是數據的大類別,例如聲音audio、圖象image等,後面定義具體的種類。
主類型/次要類型 文件尾碼
text/html:HTML 格式的文本文檔
text/plain:普通的 ASCII 文本文檔
image/jpeg:JPEG格式的圖片
image/gif:GIF格式的圖片
video/quicktime:Apple 的 QuickTime 電影
application/vnd.ms-powerpoint:微軟的powerpoint文件
範例:使用nginx搭建一個web站點
[root@HAproxy ~]# cat /etc/nginx/nginx.conf | grep -E -v '^#|^$'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
server_name yongshen.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
NGINX的HTTPS功能的實現:https = http+ssl或者https = http+tls
https的工作流程:
1.客戶端發起請求
2.服務端將自己的公鑰文件發送給客戶端
3.客戶端檢驗公鑰的合法性(通過根CA來校驗證書的合法性,因為伺服器的證書就是根CA頒發的)
4.客戶端用這個公鑰加密一個隨機數發送給服務端
5.服務端用自己的私鑰解析這個加密的信息(客戶端和服務端的通信就可以通過這個隨機值進行加密解密了)
6.信息傳輸:把數據通過這個隨機值來進行對稱加密
NGINX實現https的配置:
nginx 的https 功能基於模塊ngx_http_ssl_module實現,因此如果是編譯安裝的nginx要使用參數ngx_http_ssl_module開啟ssl功能,但是作為nginx的核心功能,yum安裝的nginx預設就是開啟的,編譯安裝的nginx需要指定編譯參數--with-http_ssl_module開啟
實現步驟:
(1)生成伺服器的私鑰和證書,CA的證書
# 腳本
CA_SUBJECT="/O=magedu/CN=ca.magedu.org"
SUBJECT="/C=CN/ST=henan/L=zhengzhou/O=magedu/CN=www.magedu.org"
SERIAL=34
EXPIRE=202002
FILE=magedu.org
openssl req -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt
openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key -subj $SUBJECT -out ${FILE}.csr
openssl x509 -req -in ${FILE}.csr -CA ca.crt -CAkey ca.key -set_serial $SERIAL -days $EXPIRE -out ${FILE}.crt
chmod 600 ${FILE}.key ca.key
#說明:
公用名稱 (Common Name) 簡稱:CN 欄位,對於 SSL 證書,一般為網站功能變數名稱或IP地址;
單位名稱 (Organization Name) :簡稱:O 欄位,對於 SSL 證書,一般為網站功能變數名稱;
# 證書申請單位所在地:
所在城市 (Locality) 簡稱:L 欄位
所在省份 (State/Provice) 簡稱:S 欄位
所在國家 (Country) 簡稱:C 欄位,只能是國家字母縮寫,如中國:CN
#其他一些欄位:
電子郵件 (Email) 簡稱:E 欄位
多個姓名欄位 簡稱:G 欄位
介紹:Description 欄位
電話號碼:Phone 欄位,格式要求 + 國家區號 城市區號 電話號碼,如: +86 732 88888888
地址:STREET 欄位
郵政編碼:PostalCode 欄位
顯示其他內容 簡稱:OU 欄位
(2)將伺服器的證書和CA的證書,兩個證書信息放在一個文件 (伺服器位於CA前面)
# cat nginx.crt ca.crt > nginx.pem
(3)參數配置
server {
listen 443 ssl; #為指定的虛擬主機配置啟用ssl功能
listen 80;
server_name localhost;
ssl_certificate /etc/nginx/cert/nginx.pem; ##指向包含當前虛擬主機和CA的兩個證書信息的文件,一般是crt文件
ssl_certificate_key /etc/nginx/cert/nginx.key; ##當前虛擬主機使用的私鑰文件,一般是key文件
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; #支持ssl協議版本,早期為ssl現在是TLS,預設為後三個
ssl_session_cache off #關閉ssl緩存
ssl_session_cache shared:sslcache:20m; #使用共用緩存 這個緩存叫做sslcache 緩存大小是20m
ssl_session_timeout 10m; #緩存有效時間是十分鐘
location / { #用戶的url路徑匹配
root /usr/share/nginx/html; #指定根目錄
index index.html; #指定預設的index頁面
}
}
範例:實現nginx的https配置:
# 1. 生成證書文件
[root@HAproxy certs]# cat certs.bash
#!/bin/bash
CA_SUBJECT="/O=nginx/CN=ca.nginx.org"
SUBJECT="/C=CN/ST=sichuan/L=cehngdu/O=ehigh/CN=www.magedu.org"
SERIAL=34
EXPIRE=202002
FILE=nginx
openssl req -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt
openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key -subj $SUBJECT -out ${FILE}.csr
openssl x509 -req -in ${FILE}.csr -CA ca.crt -CAkey ca.key -set_serial $SERIAL -days $EXPIRE -out ${FILE}.crt
chmod 600 ${FILE}.key ca.key
# 2. 合併證書文件
# cat nginx.crt ca.crt > nginx.pem
# 3. 相關配置
[root@HAproxy certs]# cat /etc/nginx/nginx.conf | grep -E -v '^#|^$'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen 443 ssl; ##表示監聽443埠的ssl服務
server_name yongshen.com;
ssl_certificate /etc/nginx/certs/nginx.pem; ##伺服器證書和他的上級證書(ca證書)
ssl_certificate_key /etc/nginx/certs/nginx.key; #伺服器的私鑰
ssl_session_cache off; #關閉緩存
ssl_session_cache shared:sslcache:20m; #使用共用緩存 這個緩存叫做sslcache 緩存大小是20m
ssl_session_timeout 10m; #緩存有效時間是十分鐘
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
(4)測試
說明:
# nginx實現https和apache實現https區別:
apache實現https的時候是三個文件 伺服器證書 伺服器私鑰 證書鏈(上級CA的證書),nginx相當於把apache的兩個文件合併成一個文件 伺服器證書和CA證書
NGINX反向代理的實現:
反向代理:
正向代理:
實現nginx的反向代理配置:有很多個模塊可以實現nginx的反向代理
# ngx_http_proxy_module模塊:將客戶端的請求以http協議轉發至指定伺服器進行處理 一對一
反向代理單台web 伺服器
在location中,根據用戶的url來進行代理轉發。
# 例如:
server {
listen 443 ssl; #https://x.x.x.x/
listen 80;
server_name localhost;
ssl_certificate /etc/nginx/cert/nginx.pem;
ssl_certificate_key /etc/nginx/cert/nginx.key;
ssl_session_cache shared:sslcache:20m;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
server {
listen 18080 ssl; #https://x.x.x.x:18080
server_name localhost;
ssl_certificate /etc/nginx/cert/nginx.pem;
ssl_certificate_key /etc/nginx/cert/nginx.key;
ssl_session_cache shared:sslcache:20m;
location / {
proxy_pass http://10.0.0.19:80;
}
}
#說明
502:後端伺服器沒連上
504:後端伺服器的訪問時間過長
proxy_pass語法格式:
proxy_pass http[s]://rs_host:port
如果rs_host:port後面沒有uri,相當於location下root的功能,訪問地址為:rs_host:port/xxx
例如: proxy_pass http://10.0.0.9;
如果rs_host:port後面有uri,相當於location下alias的功能,方位地址為rs_host:port/uri
例如: proxy_pass http://10.0.0.9/;
NGINX反向代理實現負載均衡:一對多
ngx_http_upstream_module模塊:可以實現多個後端伺服器的調度。(將客戶端的請求轉發到一組特定的後端伺服器)
實現方式:
將後端伺服器進行分組,一組就是一個集群,每個集群裡面包含一個或多個伺服器。nginx代理伺服器將指定的請求轉發到對應的集群裡面去。集群裡面的伺服器可以通過輪詢或者其它演算法來處理代理伺服器發過來的請求。
# 通過在http中配置upstream指令塊定義一組伺服器,轉發請求的時候就將請求轉發到這組伺服器
#http中配置
upstream webserver { #upstream模塊只能在http中配置
server 10.0.0.9 weight=1 fail_timeout=5s max_fails=3; #5s內連續三次都不能握手成功就認為掛了
server 10.0.0.11 weight=1 fail_timeout=5s max_fails=3;
}
#server中配置
location /text {
proxy_pass http://webserver/; #將請求轉發給那個組
}
upstream指令塊:只能再http語句塊中定義,定義後端服務組。一個upstream定義一組,多組就需要多個upstream
server參數:指定後端伺服器的物理地址。
# server的參數:
weight=number #設置權重,預設為1,預設就是輪詢模式。實現類似於LVS中的WRR,WLC等。
max_conns=number #後端伺服器最多連多少個請求,預設為0表示沒有限制
max_fails=number #失敗指定次數以後,就認為後端伺服器掛了,預設為1次
fail_timeout=time #超時時間,預設為10秒。判斷握手是否能成功,如果再這個時間內連續(max_fails)次失敗,那麼就認為伺服器掛了。
backup # 設置為備份伺服器,當所有後端伺服器不可用時,才會啟用此備用伺服器
# 例如:server 10.0.0.9 weight=1 fail_timeout=5s max_fails=3 backup; #所有後端伺服器都掛了,就讓他上
down # 標記為down狀態,讓nginx代理伺服器認為指定的伺服器掛了。
# 例如:server 10.0.0.9 weight=1 fail_timeout=5s max_fails=3 down; -- 表示認為標記這個伺服器為掛了的狀態
resolve # 當server定義的是主機名的時候,當A記錄發生變化會自動應用新IP而不用重啟Nginx
說明:lvs不會對後端伺服器進行健康性檢查 nginx能實現後端健康性檢查
nginx進行健康性檢查的方式:通過握手的方式來判斷後端伺服器是否存活,基於懶惰的方式(用戶訪問的時候才會去看後端伺服器的健康性)
一對多反向代理的實現範例:
[root@HAproxy ~]# cat /etc/nginx/nginx.conf | grep -E -v '^#|^#'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
#後端服務組設置 預設是輪詢調度
upstream web1 {
server 10.0.0.29:80 weight=1 fail_timeout=5s max_fails=3;
server 10.0.0.39:80 weight=1 fail_timeout=5s max_fails=3;
}
#當用戶訪問80埠就轉發
server {
listen 80;
server_name www.web1.com;
location / {
proxy_pass http://web1/;
}
}
}
NGINX四層負載均衡的實現:
四層:傳輸層,tcp、udp調度。
通過ngx_stream_proxy_module模塊可以實現傳輸層tcp協議負載均衡的實現。編譯的時候指定 --with-stream 選項才能支持ngx_stream_proxy_module模塊。
相關配置:
通過stream指令來配置四層調度,stream和http是平級的,然後在stream中通過upstream來指定調度的後端伺服器組,然後再使用server監聽對應的埠。
# 說明:stream指令塊和http指令塊平級
# stream指令塊:用來設置支持tcp或udp負載均衡的反向代理
stream {
#定義一個集群
upstream name {
server xxx
}
#定義監聽某個ip地址和埠,當用戶訪問這個埠的時候,就轉發請求到指定的upstream
server {
listen: xxx
}
}
例如:利用nginx的四層代理實現mysql、redis的負載均衡。
# 主配置文件:定義stream指令塊,和http平級
[root@HAproxy ~]# cat /etc/nginx/nginx.conf | grep -E -v '^#|^$'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
stream {
upstream redis { #定一個一個redis集群
server 10.0.0.29:6379 max_fails=3 fail_timeout=30s; #集群中的主機 預設採用輪詢的演算法
server 10.0.0.39:6379 max_fails=3 fail_timeout=30s;
}
server { #只寫埠指定協議,預設就是tcp埠
listen 10.0.0.19:6379; #監聽10.0.0.8的tcp6379埠 例如監聽udp的埠:listen host:port udp
proxy_connect_timeout 6s;
proxy_timeout 15s;
proxy_pass redis; #用戶訪問10.0.0.19:6379就調度到redis集群中
}
}
# 測試 另外一臺機器安裝reidis客戶端工具測試
root@ubuntu1804:/etc/nginx/conf.d# redis-cli -h 10.0.0.19
10.0.0.19:6379> get name
"10.0.0.29"
10.0.0.19:6379> exit
root@ubuntu1804:/etc/nginx/conf.d# redis-cli -h 10.0.0.19
10.0.0.19:6379> get name
"10.0.0.39"
10.0.0.19:6379> exit
root@ubuntu1804:/etc/nginx/conf.d# redis-cli -h 10.0.0.19
10.0.0.19:6379> get name
"10.0.0.29"
10.0.0.19:6379>