Nginx常見應用
Nginx 最常見的幾種應用場景
- 反向代理
- 負載均衡(反向代理某個應用服務器集羣)
- 動靜分離(可以作爲靜態服務器來使用)
- Nginx集羣部署(實現高可用)
上述應用都會牽扯到nginx.conf配置文件的配置,具體配置詳解參見道人另一篇文章。
一:反向代理
示例演示(Nginx服務器反向代理兩個tomcat服務)
Nginx服務器部署在192.168.32.133虛機上
web服務器(道人配置的兩臺虛機)
- 192.168.32.134 上佈置tomcat1(端口8080)
- 192.168.32.135 上佈置tomcat2(端口8080)
關鍵在於Nginx配置文件的配置
主要是在http塊中的server塊中配置 server_name 和 location 這兩個屬性,詳細配置如下。
修改window客戶端hosts文件(模仿下域名訪問)
- hosts目錄是:C:\Windows\System32\drivers\etc
192.168.32.133 www.tomcat1.com
192.168.32.133 www.tomcat2.com
Nginx.conf 配置文件配置如下
...
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 第一個虛擬服務器
server {
listen 80;
# 這裏需要修改爲你代理的服務器地址
server_name www.tomcat1.com;
location / {
root html;
# 這裏要更換爲你代理的服務器路徑
proxy_pass http://192.168.32.134:8080;
index index.jsp;
}
}
# 第二個虛擬服務器
server {
listen 80;
# 這裏需要修改爲你代理的服務器地址
server_name www.tomcat2.com;
location / {
root html;
# 這裏要更換爲你代理的服務器路徑
proxy_pass http://192.168.32.135:8080;
index index.jsp;
}
}
}
關鍵配置:
重啓Nginx,訪問www.tomcat1.com,和www.tomcat2.com網址,均可正常訪問。
二:負載均衡
假設tomcat1,tomcat2佈置的是同一服務,Nginx實現請求在兩臺服務器上均勻分佈。
關鍵配置
http{
...
#設定負載均衡的服務器列表
upstream myserver {
#weigth參數表示權值,權值越高被分配到的機率越大
server 192.168.32.134:8080 weight=1;
server 192.168.32.135:8080 weight=1;
}
server {
#偵聽80端口
listen 80;
#定義使用www.xx.com訪問
server_name www.xx.com;
#默認請求
location / {
# 代理地址
proxy_pass http://myserver;
root /root; #定義服務器的默認網站根目錄位置
index index.php index.html index.htm;
}
}
}
Nginx.conf 配置文件配置如下
在這裏提一下,負載均衡算法有以下幾種方式。
1、熱備:如果你有2臺服務器,當一臺服務器發生事故時,才啓用第二臺服務器給提供服務。服務器處理請求的順序:AAAAAA突然A掛啦,BBBBBBBBBBBBBB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #熱備
}
2、輪詢:nginx默認就是輪詢其權重都默認爲1,服務器處理請求的順序:ABABABABAB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
3、加權輪詢:跟據配置的權重的大小而分發給不同服務器不同數量的請求。如果不設置,則默認爲1。下面服務器的請求順序爲:ABBABBABBABBABB…
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
4、ip_hash:nginx會讓相同的客戶端ip請求相同的服務器。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
5、關於nginx負載均衡配置的幾個狀態參數講解。
-
down,表示當前的server暫時不參與負載均衡。
-
backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,纔會請求backup機器,因此這臺機器的壓力最輕。
-
max_fails,允許請求失敗的次數,默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。
-
fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用。
upstream mysvr {
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
}
三:動靜分離
靜態資源:
http塊中server塊中location如下配置
表示url爲 /static/*.xxx 的圖片或者js等靜態資源則會到/html/static目錄下去尋找資源
location /static/~(.*)(\.jpg|\.png|\.gif|\.jepg|\.css|\.js|\.css){
alias html;
}
動態資源:
其他訪問url則轉發到proxy_pass 指向的 http://192.168.32.135:8080;
location / {
proxy_pass http://192.168.32.135:8080;
}
四:Nginx集羣(保證高可用)
解決的是Nginx宕機導致服務不可用的問題。
採用方式:Keepalived+Nginx實現雙機熱備(主流方案)。
Keepalived高可用軟件
Keepalived軟件起初是專爲LVS負載均衡軟件設計的,用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,keepalived除了能夠管理LVS軟件外,還可以作爲其他服務的高可用解決方案軟件。
keepalived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router Redundancy Protocol(虛擬路由冗餘協議)的縮寫,VRRP出現的目的就是爲了解決靜態路由的單點故障問題的,它能保證當個別節點宕機時,整個網絡可以不間斷地運行。所以,keepalived一方面具有配置管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可以實現系統網絡服務的高可用功能。
Nginx雙機熱備配置示例
準備兩臺服務器192.168.32.134 192.168.32.135 均安裝上Keepalived和Nginx。
Keepalived安裝
yum install keepalived -y
安裝成功後,/etc 目錄下會存在一個keepAlived目錄,該目錄即是keepAlived的安裝目錄。
Keepalived 配置文件修改以及說明
Keepalived的配置文件可以分爲三塊:
- 全局定義塊:對整個 Keepalive 配置生效的,不管是否使用 LVS;
- VRRP 實例定義塊:是 Keepalived 的核心;
- 虛擬服務器(LVS)定義塊:LVS 配置只在使用 Keepalived 來配置和管理 LVS 時才需要使用,如果僅僅使用 Keepalived做 HA,LVS 的配置完全是不需要的。
配置文件的詳細說明如下:
global_defs { #全局配置
notification_email { #指定keepalived在發生切換時需要發送email到的對象,一行一個
[email protected] #指定收件人郵箱
[email protected]
[email protected]
}
notification_email_from [email protected] #指定發件人
smtp_server 192.168.200.1 #指定smtp服務器地址
smtp_connect_timeout 30 #指定smtp連接超時時間
router_id LVS_DEVEL #此處注意router_id爲負載均衡標識,在局域網內應該是唯一的。
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_sync_group VG_1{ #監控多個網段的實例
group {
inside_network #實例名
outside_network
}
notify_master /path/xx.sh #指定當切換到master時,執行的腳本
netify_backup /path/xx.sh #指定當切換到backup時,執行的腳本
notify_fault "path/xx.sh VG_1" #故障時執行的腳本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的郵件地址和smtp服務器發送郵件通知
}
vrrp_instance inside_network {
state BACKUP #指定那個爲master,那個爲backup,如果設置了nopreempt這個值不起作用,主備考priority決定
interface eth0 #設置實例綁定的網卡
dont_track_primary #忽略vrrp的interface錯誤(默認不設置)
track_interface{ #設置額外的監控,裏面那個網卡出現問題都會切換
eth0
eth1
}
mcast_src_ip #發送多播包的地址,如果不設置默認使用綁定網卡的primary ip
garp_master_delay #在切換到master狀態後,延遲進行gratuitous ARP請求
virtual_router_id 50 #VPID標記
priority 99 #優先級,高優先級競選爲master
advert_int 1 #檢查間隔,默認1秒
nopreempt #設置爲不搶佔 注:這個配置只能設置在backup主機上,而且這個主機優先級要比另外一臺高
preempt_delay #搶佔延時,默認5分鐘
debug #debug級別
authentication { #設置認證
auth_type PASS #認證方式,類型主要有PASS、AH 兩種
auth_pass 111111 #認證密碼
}
virtual_ipaddress { #設置vip
192.168.36.200
}
}
vrrp_instance VI_1 { #虛擬路由的標識符
state MASTER #狀態只有MASTER和BACKUP兩種,並且要大寫,MASTER爲工作狀態,BACKUP是備用狀態
interface eth0 #通信所使用的網絡接口
lvs_sync_daemon_inteface eth0 #這個默認沒有,相當於心跳線接口,DR模式用的和上面的接口一樣,也可以用機器上的其他網卡eth1,用來防止腦裂。
virtual_router_id 51 #虛擬路由的ID號,是虛擬路由MAC的最後一位地址
priority 100 #此節點的優先級,主節點的優先級需要比其他節點高
advert_int 1 #通告的間隔時間
nopreempt #設置爲不搶佔 注:這個配置只能設置在backup主機上,而且這個主機優先級要比另外一臺高
preempt_delay #搶佔延時,默認5分鐘
authentication { #認證配置
auth_type PASS #認證方式
auth_pass 1111 #認證密碼
}
virtual_ipaddress { #虛擬ip地址,可以有多個地址,每個地址佔一行,不需要子網掩碼,同時這個ip 必須與我們在lvs 客戶端設定的vip 相一致!
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 443 { #集羣所使用的VIP和端口
delay_loop 6 #健康檢查間隔,單位爲秒
lb_algo rr #lvs調度算法rr|wrr|lc|wlc|lblc|sh|dh
nat_mask 255.255.255.0 #VIP掩碼
lb_kind NAT #負載均衡轉發規則。一般包括DR,NAT,TUN 3種
persistence_timeout 50 #會話保持時間,會話保持,就是把用戶請求轉發給同一個服務器,不然剛在1上提交完帳號密碼,就跳轉到另一臺服務器2上了
protocol TCP #轉發協議,有TCP和UDP兩種,一般用TCP,沒用過UDP
persistence_granularity <NETMASK> #lvs會話保持粒度
real_server 192.168.201.100 443 { #真實服務器,包括IP和端口號
weight 1 #默認爲1,0爲失效
inhibit_on_failure #在服務器健康檢查失效時,將其設爲0,而不是直接從ipvs中刪除
notify_up <string> | <quoted-string> #在檢測到server up後執行腳本
notify_down <string> | <quoted-string> #在檢測到server down後執行腳本
TCP_CHECK { #通過tcpcheck判斷RealServer的健康狀態
connect_timeout 3 #連接超時時間
nb_get_retry 3 #重連次數
delay_before_retry 3 #重連間隔時間
connect_port 23 健康檢查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET { #健康檢測方式,可選有 SSL_GET、TCP_CHECK、HTTP_GET
url { #檢查url,可以指定多個
path / #檢查的url路徑
digest ff20ad2481f97b1754ef3e12ecd3a9cc #需要檢查到的內容。檢查後的摘要信息。
status_code 200 #檢查的返回狀態碼
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #連接超時時間
nb_get_retry 3 #檢測嘗試幾次
delay_before_retry 3 #檢測的時間間隔
}
}
}
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
本次示例只需做以下關鍵配置修改
# global_defs塊(全局塊中)
route_id XXX #MASTER和BACKUP不同
# vrrp_instance塊中需修改部分
state MASTER #狀態只有MASTER和BACKUP兩種,並且要大寫,MASTER爲工作狀態,BACKUP是備用狀態
interface ens33 #通信所使用的網絡接口(道人使用的是虛機,橋聯方式)
virtual_router_id 51 #同一個實例下,MASTER和BACKUP相同
priority 100 #優先級,同一個實例下,MASTER高於BACKUP
virtual_ipaddress { #虛擬ip地址,可以有多個地址,每個地址佔一行,不需要子網掩碼,同時這個ip 必須與我們在lvs 客戶端設定的vip 相一致!
192.168.32.50
192.168.32.51
192.168.32.52
}
vrrp_script check_nginx { # check_nginx 爲自定義的一個監控名稱
script "/etc/keepalived/check_nginx.sh" # 採用腳步呢監控nginx是否正常運行
interval 2 # 檢測間隔時間,即兩秒檢測一次
weight 30 # 一個正整數或負整數。權重值,關係到整個集羣角色選舉。
}
track_script {
check_nginx # 引用上面定義的監控模塊
}
/etc/keepalived/check_nginx.sh 監控腳本內容 (Shell腳本)
A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx進程 把值賦給變量A
if [ $A -eq 0 ];then ## 如果沒有進程值得爲 零
/usr/local/nginx/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived ## 則結束 keepalived 進程
fi
fi
最後啓動nginx與keepalived
./nginx
systemctl start keepalived.service