nginx全面解析【負載均衡、反向代理、高可用、宕機容錯】
原創itcats_cn 最后發布於2018-09-06 10:24:33 閱讀數 15799 收藏
展開
什么是nginx?
nginx是一款高性能的http服務器,官方測試nginx能夠支支撐5萬並發鏈接,並且cpu、內存等資源消耗卻非常低,運行非常穩定,所以現在很多知名的公司都在使用nginx。
nginx有什么作用?
1、負載均衡(可以減輕單台服務器的壓力)
2、反向代理(隱藏企業真實的ip地址)
3、搭建虛擬服務器
4、用做靜態服務器(實現動靜分離)
5、nginx性能高、體積小、能支撐的並發量很高
6、ddos攻擊可以使用nginx解決
7、解決ajax跨域問題
這里補充一點:
問:企業中常用的安全架構有哪些?
1、使用nginx做反向代理(隱藏了服務器真實的ip地址)
2、ddos(流量攻擊)可以使用nginx解決
3、使用https防止第三方通過抓包分析http請求
4、防盜鏈、csrf(跨域請求偽造)、xss攻擊、sql注入等
分享我之前寫過的文章《XSS攻擊及解決方案》、《表單重復提交的解決方案(防止模擬Http請求CSRF)》
除了nginx,還有什么反向代理服務器呢?
lvs、F5(硬件)、haproxy等。
nginx應用場景
1、http服務器。Nginx是一個http服務可以獨立提供http服務。可以做網頁靜態服務器。
2、虛擬主機。可以實現在一台服務器虛擬出多個網站。例如個人網站使用的虛擬主機。
3、反向代理,負載均衡。在安全架構中,使用反向代理可以隱藏企業真實ip地址,安全性高。當網站的訪問量達到一定程度后,單台服務器不能滿足用戶的請求時,需要用多台服務器集群可以使用nginx做負載均衡,並且多台服務器可以平均分擔負載,不會因為某台服務器負載高宕機而某台服務器閑置的情況。
4、nginx搭建企業級api接口網關,可以解決跨域問題
5、安全架構中可以使用nginx防ddos流量攻擊
Linux下nginx安裝
https://blog.csdn.net/wxyjuly/article/details/79443432
啟動:
$ /usr/local/nginx/sbin/nginx
重啟:
$ /usr/local/nginx/sbin/nginx –s reload
停止:
$ /usr/local/nginx/sbin/nginx –s stop
測試配置文件是否正常:
$ /usr/local/nginx/sbin/nginx –t
強制關閉:
$ pkill nginx
nginx反向代理配置
反向代理通過在nginx/conf/nginx.conf中的proxy_pass配置
什么是反向代理?
反向代理(Reverse Proxy)方式是指以代理服務器外網方式來接受internet上的連接請求,然后將請求轉發給內網的服務器(tomcat),並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。
啟動一個Tomcat 127.0.0.1:8080
需要配置反向代理,則需要配置一下nginx安裝目錄下的conf文件夾——nginx.conf
原配置文件含義:
可以看到nginx默認監聽端口號為80,當請求開頭為localhost或localhost:80時候,攔截所有請求,並轉發到index.html,即nginx的默認頁面
那么,nginx配置反向代理也就迎刃而解了:
如果我想在本地通過訪問www.nginx.cn跳轉到我的本地項目localhost:8080/index,則這么配置
server {
listen 80;
server_name www.nginx.cn;
location / {
proxy_pass http://localhost:8080/index;
index index.html index.htm;
}
}
重啟nginx /usr/local/nginx/sbin/nginx –s reload
plus: server{}可以配置多個,這個過程中我們隱藏了我們真實的ip地址,提高了安全性。
nginx實現負載均衡
什么是負載均衡
負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。負載均衡的本質目的就是提高網站的吞吐量(吞(請求)、吐(響應)數量),減輕單台服務器壓力,盡可能最大化利用每個服務器的資源。
負載均衡策略
負載均衡策略配置在nginx/conf/nginx.conf中,根據upstream backserver{}配置,注意:配置在server{}外面
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。如有兩台tomcat,tomcat1和tomcat2,那么先訪問tomcat1,再訪問tomcat2,再訪問tomcat1,再訪問tomcat2...以此循環。適用場景:兩台服務器配置相近情況,否則對於配置低的服務器是性能瓶頸。
upstream backserver {
server 10.211.55.1;
server 10.211.55.2;
}
location / {
proxy_pass http://backserver;
index index.html index.htm;
}
當你訪問www.nginx.cn/login時候,端口號80和server_name都匹配,location / 攔截所有請求,會反向代理到backserver,而backserver配置了兩個serverIP,則實際訪問的是:10.211.55.1 和 10.211.55.2兩者輪詢訪問。
當然,如果你沒有這么多服務器,你也可以根據端口號區分,搭建偽集群。
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
改過配置,不會實時生效,重啟nginx sbin/nginx -s reload
2、指定權重
指定輪詢幾率,weight和訪問比率成正比,用於后端服務器性能不均的情況。
upstream backserver {
server 10.211.55.1 weight=5;
server 10.211.55.2 weight=10;
}
按比例進行分配 10.211.55.1訪問1次,10.211.55.2訪問兩次。
改過配置,不會實時生效,重啟nginx
3、IP綁定 ip_hash【不建議】
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。
upstream backserver {
ip_hash;
server 10.211.55.1;
server 10.211.55.2;
}
4、第三方【了解】
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backserver {
server 10.211.55.1;
server 10.211.55.2;
fair;
}
到此位置,負載均衡和反向代理就介紹完了。我發現很多人有一個誤區,分不清楚負載均衡和反向代理的區別。負載均衡主要是針對tomcat集群,nginx根據負載均衡策略訪問不同的tomcat服務器,讓服務器盡可能發揮出更多性能。而反向代理主要是出於安全性考慮,只需要提供nginx的公網ip,而通過內網nginx與tomcat實現通信,這樣隱藏了tomcat服務器的ip地址。
那么假設tomcat集群中,有一台服務器掛了,而nginx剛好選擇了該台服務器,那么會一直請求,問題來了,通過nginx怎么解決tomcat宕機容錯問題呢?
服務器宕機輪詢配置規則
server {
listen 80;
server_name www.nginx.cn;
location / {
proxy_pass http://backserver;
index index.html index.htm;
proxy_connect_timeout 1;
proxy_send_timeout 1;
proxy_read_timeout 1;
}
}
加入三行代碼,在訪問某服務器1秒內沒有響應的話,自動輪詢下一台服務器。
實現tomcat服務器高可用:1、當有tomcat節點掛掉時候,使用keepalived腳本重啟服務器 2、配置nginx服務器宕機輪詢規則,超時未訪問自動輪詢下一台服務器 3、若多次重啟不成功,則通過郵件通知
問:如果在項目發布新版本時候,怎么訪問服務器?
假設有主備兩台服務器,主機發布版本期間無法訪問主機,那么通過配置了nginx服務器宕機容錯機制,nginx則會轉發給備機,當主機發布版本完成后,再更新備機項目。
問:tomcat發布版本的時候,session失效怎么解決?
由於session存放在jvm內存中,重啟session失效,解決辦法:把session存放在redis中。
nginx配置DDOS
限制請求次數
設置Nginx、Nginx Plus的連接請求在一個真實用戶請求的合理范圍內。比如,如果你覺得一個正常用戶每兩秒可以請求一次登錄頁面,你就可以設置Nginx每兩秒鍾接收一個客戶端IP的請求(大約等同於每分鍾個請求)。
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;
server {
...
location /login.html {
limit_req zone=one;
...
}
}
`limit_req_zone`命令設置了一個叫one的共享內存區來存儲請求狀態的特定鍵值,在上面的例子中是客戶端IP($binary_remote_addr)。location塊中的`limit_req`通過引用one共享內存區來實現限制訪問/login.html的目的。
nginx配置防盜鏈
location ~ .*\.(jpg|jpeg|JPG|png|gif|icon)$ {
valid_referers blocked http://www.itcats.cn www.itcats.cn;
if ($invalid_referer) {
return 403;
}
}
nginx作為服務器的入口,所有的請求都需要經過nginx再分發給tomcat,如果有一天nginx掛了怎么辦?nginx怎么實現高可用?
什么是負載均衡高可用
nginx作為負載均衡器,所有請求都到了nginx,可見nginx處於非常重點的位置,如果nginx服務器宕機后端web服務將無法提供服務,影響嚴重。為了屏蔽負載均衡服務器的宕機,需要建立一個備份機。主服務器和備份機上都運行高可用(High Availability)監控程序,通過傳送諸如“I am alive”這樣的信息來監控對方的運行狀況。當備份機不能在一定的時間內收到這樣的信息時,它就接管主服務器的服務IP並繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。
Nginx + Keepalived實現高可用
正常的互聯網公司都會搭建nginx一主一備,主nginx掛了,備nginx就工作了。而keepalived負責
Keepalived是什么?
keepalived是集群管理中保證集群高可用的一個服務軟件,用來防止單點故障。 Keepalived的作用是檢測web服務器的狀態,如果有一台web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常后Keepalived自動將web服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。
Keepalived工作原理
Keepalived是一個基於VRRP協議來實現的服務高可用方案,可以利用其來避免IP單點故障,在VRRP中有兩組重要的概念:VRRP路由器和虛擬路由器,主控路由器和備份路由器。
VRRP全稱 Virtual Router Redundancy Protocol,即 虛擬路由冗余協議。可以認為它是實現路由器高可用的容錯協議,即將N台提供相同功能的路由器組成一個路由器組(Router Group),這個組里面有一個master和多個backup,但在外界看來就像一台一樣,構成虛擬路由器,擁有一個虛擬IP(vip,也就是路由器所在局域網內其他機器的默認路由),占有這個IP的master實際負責ARP響應和轉發IP數據包,組中的其它路由器作為備份的角色處於待命狀態。master會發組播消息,當backup在超時時間內收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master,保證路由器的高可用。
1、安裝keepalived
下載keepalived地址:http://www.keepalived.org/download.html
解壓安裝:
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
yum install -y openssl openssl-devel(需要安裝一個軟件包)
cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
make && make install
2、keepalived安裝成Linux系統服務
將keepalived安裝成Linux系統服務,因為沒有使用keepalived的默認安裝路徑(默認路徑:/usr/local),安裝完成之后,需要做一些修改工作:
首先創建文件夾,將keepalived配置文件進行復制:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然后復制keepalived腳本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
可以設置開機啟動:chkconfig keepalived on,到此我們安裝完畢!
3、keepalived 常用命令
service keepalived start
service keepalived stop
4、配置nginx主備自動重啟
第三步:對配置文件進行修改:vim /etc/keepalived/keepalived.conf
keepalived.conf配置文件說明:
主服務器:
把keepalived.conf文件替換為:
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #運行腳本,腳本內容下面有,就是起到一個nginx宕機以后,自動開啟服務
interval 2 #檢測時間間隔,每隔兩秒檢查一次服務器是否宕機
weight -20 #如果條件成立的話,則權重 -20
}
# 定義虛擬路由,VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
state MASTER #來決定主從
interface eth0 # 綁定虛擬 IP 的網絡接口,根據自己的機器填寫
virtual_router_id 121 # 虛擬路由的 ID 號, 兩個節點設置必須不一樣
mcast_src_ip 10.211.55.3 #填寫本機ip
priority 100 # 節點優先級,主要比從節點優先級高
nopreempt # 優先級高的設置 nopreempt 解決異常恢復后再次搶占的問題
advert_int 1 # 組播信息發送間隔,兩個節點設置必須一樣,默認 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 將 track_script 塊加入 instance 配置塊
track_script {
chk_nginx #執行 Nginx 監控的服務
}
virtual_ipaddress {
192.168.11.12 # 主從一致,虛擬ip,也就是解決寫死程序的ip怎么能切換的ip,也可擴展,用途廣泛。可配置多個。
}
}
nginx_check.sh 腳本: 讓nginx自動重啟的腳本,可以模擬把nginx進程殺死,只啟動keepalived,會發現兩台nginx都會重啟,如果無法重啟nginx_check.sh腳本授權。賦予可執行權限:chmod +x /etc/keepalived/nginx_check.sh
這樣,使用keepalived就方便多了,無需手動啟動nginx,只需啟動keepalived,nginx就會通過腳本執行啟動命令
注意:如果主服務器keepalived掛掉了,那么keepalived會把虛擬ip分配給從服務器進行使用,但是主服務器還是原來那個服務器,決定誰是主從服務器是根據一開始在keepalived.conf配置的——state MASTER #來決定主從,一旦主服務器的keepalived恢復工作,主服務器立刻獲得虛擬ip地址,從服務器休息,主服務器繼續工作,決定主從服務器這點跟redis的哨兵機制不太一樣。
#!/bin/bash
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
我們需要把nginx_check.sh腳本分別copy到兩台機器的 /etc/keepalived/文件夾下。
1、配置完成 啟動 service keepalived start
返回 : Starting keepalived (via systemctl): [ OK ] 成功
2、輸入ip a 發現 inet多了一行虛擬地址ip
inet 192.168.11.12/32 scope global eth0
3、這時就可以通過虛擬ip訪問nginx了
訪問192.168.11.12即可
從服務器:
把keepalived.conf文件替換為:
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #運行腳本,腳本內容下面有,就是起到一個nginx宕機以后,自動開啟服務
interval 2 #檢測時間間隔,每隔兩秒檢查一次服務器是否宕機
weight -20 #如果條件成立的話,則權重 -20
}
# 定義虛擬路由,VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
state BACKUP #來決定主從
interface eth0 # 綁定虛擬 IP 的網絡接口,根據自己的機器填寫 輸入ip a查詢inet后是eth幾
virtual_router_id 122 # 虛擬路由的 ID 號, 兩個節點設置必須不一樣
mcast_src_ip 10.211.55.1 #填寫本機ip
priority 100 # 節點優先級,主要比從節點優先級高
nopreempt # 優先級高的設置 nopreempt 解決異常恢復后再次搶占的問題
advert_int 1 # 組播信息發送間隔,兩個節點設置必須一樣,默認 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 將 track_script 塊加入 instance 配置塊
track_script {
chk_nginx #執行 Nginx 監控的服務
}
virtual_ipaddress {
192.168.11.12 # 主從一致 虛擬ip,也就是解決寫死程序的ip怎么能切換的ip,也可擴展,用途廣泛。可配置多個。
}
}
相比主服務器 ,輸入ip a 發 inet並沒有顯示多一行虛擬地址ip
原因:虛擬ip在主服務器內,並沒有在從服務器,因為ip地址不允許有重復的
模擬讓主服務器停止 service keepalived stop 再在從服務器輸入 ip a
從服務器獲得了虛擬ip 顯示: inet 192.168.11.12/32 scope global eth0
keepalived2.0安裝配置參考:
https://www.jianshu.com/p/cf7601437ecc
這樣,nginx+keepalived實現的高可用就完成了,
總結一下:
1、主nginx和備nginx都需要安裝keepalived,且都需要運行keepalived
2、keepalived只能負責自己服務器的nginx,當主服務器keepalive掛掉,從服務器獲得主服務器的虛擬ip。記住!!!虛擬ip在哪,請求就交給哪個nginx處理。主服務器keepalived沒掛掉,主服務器就有虛擬ip,訪問虛擬ip則訪問主服務器的nginx,主服務器keepalived掛掉,則從服務器獲得虛擬ip,訪問虛擬ip則訪問從服務器的nginx。
3、只要keepalived不掛,nginx就不會掛,即使你手動殺掉nginx進程,keepalived也會通過腳本重啟nginx。
總結起來一句:此處的keepalived作用就是:①主從虛擬ip自動切換(即自動故障遷移) ②nginx自動重啟
主keepalived掛,從nginx工作,主keepalived工作,從nginx休息,主nginx工作,keepalived不掛,所在的nginx也不會掛
舉一反三:如果tomcat掛掉了,該怎么處理?
答:首先我們nginx會訪問tomcat,如果訪問對應的tomcat掛掉,則會采用服務器宕機輪詢配置規則(上面提到了),即一定時間內,tomcat無響應則自動輪詢下一台服務器,其次,還要使用keepalived重啟宕機的tomcat,本質上跟上面的配置一樣,只需要修改tomcat重啟腳本即可
————————————————
版權聲明:本文為CSDN博主「itcats_cn」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/itcats_cn/article/details/82454657