一 、nginx介紹
1.簡介
Nginx 是高性能的 HTTP 和反向代理的web服務器,處理高并發能力是十分強大的,能經受高負 載的考驗,有報告表明能支持高達 50,000 個并發連接數,
2.正向代理
用正向代理來進行上網等功能, 正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪 問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理,
通過代理服務器來訪問真實服務器的程序 就叫正向代理,正向代理需要在客戶端進行配置代理服務器

例如,我們用的vpn ,國內直接訪問不了google , 通過vpn的服務器代理我們訪問對應的站點,就可以訪問
3.反向代理
反向代理 是代理服務器端, 當客戶端發送請求時,請求先到代理服務器,代理服務器再把請求選擇發送到目標服務器,代理服務器獲取目標服務器的資料后,在回傳給客戶端.這個程序代理服務器代理的是真實服務器端,客戶端對代理無感知,不知道請求的真實服務器的IP地址.
在不用反向代理的時候, 我們請求的是真實服務器,可以知道真實服務器的ip; 反向代理之后,請求的是代理服務器,代理服務器訪問真實服務器,從而隱藏了真實服務器,而暴露的是代理服務器,代理服務器需要配置真實服務器

3.1反向代理和正向代理的區別
-
正向代理,需要客戶端配置代理服務器;反向代理,則需要在代理服務器配置真實服務器
-
正向代理是代理服務器代理客戶端發送請求;反向代理是代理服務器端接受請求
-
因為正向代理 是代理客戶端發送請求,所以對于服務端,客戶端是隱藏的;
反向代理是代理服務端接受請求,所以對于客戶端,服務端是隱藏的
在完整的請求和回應的互動中,客戶端的請求通過代理服務器,代理服務轉發客戶端請求到真實服務端,即正向代理;
服務端回應請求到代理服務器,代理服務器發送回應資料到客戶端,即反向代理

4.負載均衡
4.1 負載均衡理解
-
負載均衡(Load Balance) , 其含義就是指將負載(作業任務)進行平衡、分攤到多個操作單元上進行運行,,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成作業任務,
-
負載均衡的核心是:將負載進行平衡,
4.2 nginx的負載均衡
通過增加服務器的數量,將請求分發到各個服務器上,將原先的請求集中到單個服務器上的情況改為 將請求分發到多個服務器上,將負載分發到不同的服務器,也就是我們所說的負載均衡
Nginx服務器的負載均衡策略可以劃分為兩大類:即內置策略和擴展策略,內置策略主要包含輪詢、加權輪詢和IP hash三種;擴展策略主要通過第三方模塊實作,種類比較豐富,常見的有url hash、fair等,
在傳統的客戶端和服務端的互動中, 客戶端直接請求服務端,但是隨著業務量越來越大,單一架構下服務器需要處理的也越來越多. 服務器的并發能力是有限的,例如tomcat的默認并發能力是150,當然是可以配置的.實際運用中,最大并發數與硬體性能和CPU數量都有很大關系的,更好的硬體,更多的處理器都會使Tomcat支持更多的并發,
針對以上情況的解決方案:
(1) 服務器進行硬體升級:采用高性能服務器替換現有低性能服務器, 該方案的弊端:
高成本:高性能服務器價格昂貴,需要高額成本投入,而原有低性能服務器被閑置,造成資 源浪費,
可擴展性差:每一次業務量的提升,都將導致再一次硬體升級的高額成本投入,性能再卓越 的設備也無法滿足當前業務量的發展趨勢,
(2) 組建服務器集群,利用負載均衡技術在服務器集群間進行業務均衡,
該方案的優勢: 低成本
可擴展性:當業務量增長時,系統可通過增加服務器來滿足需求,且不影響已有業務,不降低服務質量
高可靠性:單臺服務器故障時,由負載均衡設備將后續業務轉向其他服務器,不影響后續業 務提供,保證業務不中斷,

5.動靜分離
動靜分離是指在web服務器架構中,將靜態頁面與動態頁面或者靜態內容介面和動態內容介面,分開在不同系統(服務器)訪問的架構設計方法,進而提升整個服務訪問性能和可維護性,

二、Nginx 的安裝(Linux)
2.1 下載
nginx: 下載 (p2hp.com)
下載后上傳,或者直接用 wget命令
2.2 安裝
1、下載源代碼包
[root@web03 ~]# wget https://nginx.org/download/nginx-1.20.1.tar.gz
2、解壓
[root@web03 ~]# tar -xf nginx-1.20.1.tar.gz
3、進入nginx目錄并且設定系統配置引數
[root@web03 ~]#cd nginx-1.20.1
[root@web03 nginx-1.20.1]# ./configure --help

[root@web03 nginx-1.20.1]# ./configure --with-http_ssl_module --with-http_v2_module --with-stream
--with-http_ssl_module # 配置HTTPS時使用
--with-http_v2_module # 配置GOLANG語言時使用
--with-stream # 啟用TCP/UDP代理服務
4.安裝相關依賴
[root@web03 nginx-1.20.1]# yum install pcre pcre-devel -y

[root@web03 nginx-1.20.1]# yum install openssl openssl-devel -y

5.設定系統配置引數
./configure --with-http_ssl_module --with-http_v2_module --with-stream

6、開始編譯
[root@web03 nginx-1.20.1]# make
7、安裝
[root@web03 nginx-1.20.1]# make install

8、 加入環境變數
現在在命令列輸入nginx,報錯

需要加入環境變數:
[root@web03 nginx]# vi /etc/profile

新增以下內容:
export PATH=$PATH:/usr/local/nginx/sbin
使檔案生效:
[root@web03 nginx]# source /etc/profile
現在在命令列輸入nginx就行了

9、加入system系統管理(重要:一定要頂格寫)
[root@web03 sbin]# vi /usr/lib/systemd/system/nginx.service

輸入以下內容:
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
10、多載system服務并啟動
[root@web03 sbin]# systemctl daemon-reload
[root@web03 sbin]# systemctl start nginx
常見錯誤:
1、./configure: error: the HTTP rewrite module requires the PCRE library.
# 安裝相關包
yum install pcre pcre-devel -y
2、./configure: error: SSL modules require the OpenSSL library.
# 安裝相關包
yum install openssl openssl-devel -y

2.3 防火墻問題
在 windows 系統中訪問 linux 中 nginx,默認不能訪問的,因為防火墻問題 (1)關閉防火墻 (2)開放訪問的埠號,80 埠
查看開放的埠號
firewall-cmd --list-all
設定開放的埠號
設定開放的埠號
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=80/tcp --permanent
重啟防火墻
firewall-cmd –reload
如果是購買的云服務器,還需要配置網路安全組
三、nginx常用命令及組態檔
3.1操作命令
使用nginx操作命令的前提是必須再nginx 的目錄下
[root@VM-24-7-centos /]# cd /usr/local/nginx/sbin
1.查看 nginx 的版本號
[root@VM-24-7-centos sbin]# ./nginx -v
nginx version: nginx/1.20.2
2.查看 nginx 啟動狀態
[root@VM-24-7-centos sbin]# ps -ef | grep nginx
nobody 7508 10737 0 4月30 ? 00:00:24 nginx: worker process
root 10737 1 0 4月30 ? 00:00:00 nginx: master process ./nginx
root 15912 8298 0 16:21 pts/0 00:00:00 grep --color=auto nginx
2.nginx 啟動
[root@VM-24-7-centos sbin]# ./nginx
3.關閉 nginx
[root@VM-24-7-centos sbin]# ./nginx -s stop
4.重新加載 nginx,改完組態檔,重新加載組態檔
[root@VM-24-7-centos sbin]# ./nginx -s reload
3.2組態檔
nginx 安裝目錄下,其默認的組態檔都放在這個目錄的 conf 目錄下,而主組態檔
nginx.conf 也在其中,后續對 nginx 的使用基本上都是對此組態檔進行相應的修改

(1)nginx組態檔
http {
include mime.types; # nginx支持的媒體檔案型別,相對路徑為同目錄conf下的其他檔案
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; # 啟用sendfile傳輸模式,此模式是"零拷貝"
#tcp_nopush on; # 只在sendfile on時有效,讓資料包擠滿到一定程度才發送出去,擠滿之前被阻塞
#keepalive_timeout 0; # keepalive的超時時間
keepalive_timeout 65;
#gzip on; # 是否啟用gzip壓縮回應報文
server { # 定義虛擬主機
listen 80; # 定義監聽套接字
server_name localhost; # 定義主機名加域名,即網站地址
#charset koi8-r; # 默認字符集
#access_log logs/host.access.log main; # 訪問日志路徑
location / { # location容器,即URI的根
root html; # 站點根目錄,即DocumentRoot,相對路徑時為<prefix>/html
index index.html index.htm; # 站點主頁檔案
}
#error_page 404 /404.html; # 出現404 page not fount錯誤時,使用/404.html頁回應客戶端
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; # 出現50x錯誤時,使用/50x.html頁回傳給客戶端
location = /50x.html { # 定義手動輸入包含/50x.html時的location
root html;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
第一部分:全域塊
worker_processes 1;#nginx行程,一般設定為和cpu核數一樣
從組態檔開始到 events 塊之間的內容,主要會設定一些影響 nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,行程 PID 存放路徑、日志存放路徑和型別以及組態檔的引入等,
比如上面第一行配置的:這是 Nginx 服務器并發處理服務的關鍵配置,worker_processes 值越大,可以支持的并發處理量也越多,但是會受到硬體、軟體等設備的制約
第二部分:events 塊
events {
worker_connections 1024;
}
比如上面的配置:
上述例子就表示每個 work process 支持的最大連接數為 1024.這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置,
events 塊涉及的指令主要影響 Nginx 服務器與用戶的網路連接,常用的設定包括是否開啟對多 work process 下的網路連接進行序列化,是否允許同時接收多個網路連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等,
第三部分:http 塊
http {
include mime.types;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location = /50x.html {
root html;
}
}
}
這算是 Nginx 服務器配置中最頻繁的部分,代理、快取和日志定義等絕大多數功能和第三方模塊的配置都在這里,
需要注意的是:http 塊也可以包括 http 全域塊、server 塊
①http 全域塊
http 全域塊配置的指令包括檔案引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等,
②server 塊
這塊和虛擬主機有密切關系,虛擬主機從用戶角度看,和一臺獨立的硬體主機是完全一樣的,該技術的產生是為了節省互聯網服務器硬體成本,
每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機,
而每個 server 塊也分為全域 server 塊,以及可以同時包含多個 locaton 塊,
1、全域 server 塊
最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置,
2、location 塊
一個 server 塊可以配置多個 location 塊,
這塊的主要作用是基于 Nginx 服務器接收到的請求字串(例如 server_name/uri-string),對虛擬主機名稱
(也可以是 IP 別名)之外的字串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理,地址定向、資料緩
存和應答控制等功能,還有許多第三方模塊的配置也在這里進行,
四、nginx配置 反向代理和負載均衡
應用nginx配置
-
/nginx -s reload
-
./nginx -s stop ./nginx
1.反向代理
1.1實作一
通過nginx配置后,通過80埠訪問nginx ,nginx 轉發到tomcat的8080埠
在 nginx.conf組態檔中,加入如下配置
proxy_pass: URL; 該指令就是同來設定 真實服務器的地址,可以是主機名稱,也可以是IP地址加埠號
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 1999.life;
location / {
proxy_pass http://127.0.0.1:8080;
root html;
index index.html index.htm;
}
location = /50x.html {
root html;
}
}
}
上述配置,就是當我們訪問域名1999.life的80埠時,由于nginx監聽了80埠, 會轉發到http://127.0.0.1:8080根目錄
1.1實作二
實作效果:使用 nginx 反向代理,根據訪問的路徑跳轉到不同埠的服務中 nginx 監聽埠為 9001,
訪問 http://127.0.0.1:9001/edu/ 直接跳轉到 127.0.0.1:8081
訪問 http://127.0.0.1:9001/vod/ 直接跳轉到 127.0.0.1:8082
第一步,準備兩個 tomcat,一個 8001 埠,一個 8002 埠,并準備好測驗的頁面 第二步,修改 nginx 的組態檔 在 http 塊中添加 server{}
server {
listen 8800;
#listen 101.43.181.85;
server_name 101.43.181.85;
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
root html;
index index.html index.htm;
}
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
root html;
index index.html index.htm;
}
}
上述配置 是nginx監聽 8800埠, 當請求路徑包含 vod 時 ,代理8081埠;包含edu時,代理8080埠,~ 表示后面是正則運算式的形式
2.負載均衡
2.1 輪詢演算法(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除
我在兩個tomcat 中配置了 , 相同的路徑和資源.
upstream myserver{
server 101.43.181.85:8080;
server 101.43.181.85:8081;
}
server {
listen 8801;
server_name 101.43.181.85;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}

上述配置, 監聽了8801 埠, 組態檔中 upstream myserver 配置在 http全域塊中,在location 中配置proxy_pass,并指向 upstream myserver.
myserve 是定義組名.location中將請求轉發到 組名為myserve 的組
2.2 加權輪詢(權重)演算法(weight)
upstream myserver{
server 101.43.181.85:8080 weight=5;
server 101.43.181.85:8081 weight=10;
}
server {
listen 8801;
server_name 101.43.181.85;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
上述配置中, 和默認輪詢的寫法不同的就是 , 在組中,url后面多了 weight, 配置了權重.
當為服務器指定權重引數時, 權重將作為負載均衡決策的一部分,

2.3 ip_hash
2.3.1 ip_hash介紹
- ip_hash是根據用戶請求過來的ip,然后映射成hash值,然后分配到一個特定的服務器里面;
- 使用ip_hash這種負載均衡以后,可以保證用戶的每一次會話都只會發送到同一臺特定的Tomcat里面,它的session不會跨到其他的tomcat里面去的;

-
首先通過將ip地址映射成一個hash值,然后將hash值對Tomcat的數量3取模,得到Tomcat的索引0、1、2;
-
比如:5%3=2,則把這個請求發送到Tomcat3服務器,以此類推;
-
這樣一來,只要用戶的IP不發生改變,當前用戶的會話就能夠一直保持;

nginx的ip_hash演算法是取ip地址的前三段數字進行hash映射,如果只有最后一段不一樣,也會發送到同一個Tomcat里面
2.3.2 ip_hash 配置
upstream myserver{
ip_hash;
server 101.43.181.85:8080 weight=5;
server 101.43.181.85:8081 weight=10;
}
server {
listen 8801;
server_name 101.43.181.85;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
在nginx里面使用ip_hash,直接添加ip_hash關鍵字即可,后續同一ip的訪問將只會請求同一個服務器,
2.3.3 注意事項
-
一旦使用了ip_hash,當我們需要移除一臺服務器的時候,不能直接洗掉這個配置項,而是需要在這臺服務器配置后面加上關鍵字down,表示不可用;
-
upstream myserver { ip_hash; server 192.168.11.73:8080; server 192.168.11.74:8080 down; server 192.168.11.75:8080; } -
因為如果直接移除配置項,會導致hash演算法發生更改,后續所有的請求都會發生混亂;
2.4 least_conn
按節點連接數分配,把請求優先分配給連接數少的節點,該策略主要為了解決,各個節點請求處理時間長短不一造成某些節點超負荷的情況,
按照nginx檔案的說法,請求將被傳遞給當前擁有最少活躍連接的server,同時考慮權重weight的因素,
upstream myserver{
least_conn;
server 192.168.9.134:8081;
server 192.168.9.134:8082;
}
在nginx里面使用least_conn,直接添加least_conn關鍵字即可,
2.5 fair(第三方)
按后端服務器的回應時間來分配請求,回應時間短的將會被優先分配
需要安裝 nginx-upstream-fair-master 第三方模塊
下載地址:https://github.com/gnosek/nginx-upstream-fair
重新檢測nginx編譯環境
編譯時需要指定添加模塊的絕對路徑
[root@localhost nginx-1.18.0]# ./configure --with-http_ssl_module --add-module=/root/nginx-upstream-fair-master
若出現以下報錯
error: ‘ngx_http_upstream_srv_conf_t’ has no member named ‘default_port’
解決方法
修改NGINX下的ngx_http_upstream.h檔案
[root@localhost ~]# vim nginx-1.18.0/src/http/ngx_http_upstream.h
在ngx_http_upstream_srv_conf_s結構添加一行 in_port_t default_port

然后重新編譯安裝就可以了
修改NGINX的組態檔,指定演算法為fair演算法
upstream myserver{
server 192.168.9.134:8081;
server 192.168.9.134:8082;
fail;
}
五、nginx 動靜分離
1.基本介紹
- 動靜分離指的是將動態請求和靜態請求分隔開,然后分別路由到相應的后端服務器,
- 通常用戶的請求中,一部分需要后臺程式處理,例如查詢資料庫或者進行一些資料運算,這類請求我們稱之為動態請求;
- 還有一部分不需要后臺程式處理,如請求 css、html、js、圖片等靜態資源,這類請求我們稱之為靜態請求,
- Nginx 實作動靜分離的基礎是它可以根據配置對不同的請求做不同的轉發,動靜分離有利于提高整個服務器系統的性能,

Nginx 動靜分離簡單來說就是把動態跟靜態請求分開,不能理解成只是單純的把動態頁面和靜態頁面物理分離,嚴格意義上說應該是動態請求跟靜態請求分開,可以理解成使用 Nginx 處理靜態頁面,Tomcat 處理動態頁面,動靜分離從目前實作角度來講大致分為兩種,
一種是純粹把靜態檔案獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案;
另外一種方法就是動態跟靜態檔案混合在一起發布,通過 nginx 來分開,通過 location 指定不同的后綴名實作不同的請求轉發,通過 expires 引數設定,可以使瀏覽器快取過期時間,減少與服務器之前的請求和流量,具體 Expires 定義:是給一個資源設定一個過期時間,也就是說無需去服務端驗證,直接通過瀏覽器自身確認是否過期即可,所以不會產生額外的流量,此種方法非常適合不經常變動的資源,(如果經常更新的檔案,不建議使用 Expires 來快取),我這里設定 3d,表示在這 3 天之內訪問這個 URL,發送一個請求,比對服務器該檔案最后更新時間沒有變化,則不會從服務器抓取,回傳狀態碼304,如果有修改,則直接從服務器重新下載,回傳狀態碼 200,
2.配置

我準備了兩個靜態資源
/data/test/www/a.html
/data/test/image/001.jpg
server {
listen 8802;
server_name 101.43.181.85;
location /www/ {
root /data/test/;
index index.html index.htm;
}
location /image/ {
root /data/test/;
autoindex on;
}
}
上述配置location 部分, 當我們路徑為www時, 會匹配到 對應的location,到/data/test/www 路徑下,尋找對應資源;
當我們路徑為image時, 匹配到對應的location,到/data/test/image路徑下,尋找對應資源


autoindex on 的作用是列出 檔案夾下的內容

六、nginx高可用
1.什么是高可用?
高可用(High availability,縮寫為 HA),是指系統無中斷的執行其功能的能力,代表系統的可用性程度,高可用的主要目的就是為了保障“業務的連續性”,即在用戶的眼里,業務永遠都是正常對外提供服務的,它通常是指,通過設計減少系統不能提供服務的時間,
假設系統一直能夠提供服務,我們說系統的可用性是100%,如果系統每運行100個時間單位,會有1個時間單位無法提供服務,我們說系統的可用性是99%,很多公司的高可用目標是4個9,也就是99.99%,這就意味著,系統的年停機時間為8.76個小時,
常見的互聯網分層架構

常見互聯網分布式架構如上,分為:
(1)客戶端層:典型呼叫方是瀏覽器browser或者手機應用APP
(2)反向代理層:系統入口,反向代理
(3)站點應用層:實作核心應用邏輯,回傳html或者json
(4)服務層:如果實作了服務化,就有這一層
(5)資料-快取層:快取加速訪問存盤
(6)資料-資料庫層:資料庫固化資料存盤
整個系統的高可用,又是通過每一層的冗余+自動故障轉移來綜合實作的,
2.nginx 高可用
nginx作為負載均衡器,所有請求都到了nginx,可見nginx處于非常重點的位置,如果nginx服務器宕機后端web服務將無法提供服務,影響嚴重,
為了屏蔽負載均衡服務器的宕機,需要建立一個備份機,主服務器和備份機上都運行高可用(High Availability)監控程式,通過傳送諸如“I am alive”這樣的資訊來監控對方的運行狀況,當備份機不能在一定的時間內收到這樣的資訊時,它就接管主服務器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的資訊時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務,
2.1keepalived+nginx實作主備
2.1.1 什么是keepalived
keepalived 是集群管理中保證集群高可用的一個服務軟體,用來防止單點故障,
Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或作業出現故障,Keepalived將檢測到,并將有故障的web服務器從系統中剔除,當web服務器作業正常后Keepalived自動將web服務器加入到服務器群中,這些作業全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器,
2.1.2 keepalived作業原理
keepalived是以VRRP協議為實作基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議,
虛擬路由冗余協議,可以認為是實作路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(VIP = Virtual IP Address,虛擬IP地址,該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到VRRP包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master,這樣的話就可以保證路由器的高可用了,
keepalived主要有三個模塊,分別是core、check和VRRP,core模塊為keepalived的核心,負責主行程的啟動、維護以及全域組態檔的加載和決議,check負責健康檢查,包括常見的各種檢查方式,VRRP模塊是來實作VRRP協議的,
2.1.3 keepalived+nginx實作主備程序
初始狀態
主機宕機
主機恢復

基礎環境準備
(1)安裝Nginx:
# 添加源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安裝Nginx
sudo yum install -y nginx
# 啟動Nginx
sudo systemctl start nginx.service
# 瀏覽器訪問測驗
http://192.168.253.11/
http://192.168.253.12/
(2)安裝KeepAlived可使用yum直接安裝:
yum -y install keepalived
查看KeepAlived組態檔:
cat /etc/keepalived/keepalived.conf
接下來就是要對該組態檔進行修改,該組態檔在/etc/keepalived/路徑下,在默認的keepalive.conf里面還有 virtual_server,real_server 這樣的配置,它是為lvs準備的,
(3)關閉防火墻(默認關閉)
(4)關閉selinux(如果不關閉,KeepAlived不生效)
臨時關閉
[root@localhost ~]# getenforce Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
永久關閉:
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改為 SELINUX=disabled
重啟服務reboot
配置主備模式
(1) 修改主組態檔:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id master11
}
# nginx掛了,實作vip自動漂移,使用如下腳本控制
vrrp_script check_nginx {
script "/usr/local/nginx/nginx_check.sh"
interval 2 # 機器宕機執行的次數
weight 2
}
# 當前實體配置
vrrp_instance VI_1 {
state MASTER # 主機
interface ens33 # 系結的網卡
virtual_router_id 51 # 組id,需要一致
priority 100 # 優先級
advert_int 1 # 檢查間隔,默認1s
# 呼叫nginx掛了之后進行vip漂移的函式
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1111
}
# 配置vip
virtual_ipaddress {
192.168.253.50/24 dev ens33 label ens33:1 scope global
}
}
在默認的keepalive.conf里面還有 virtual_server,real_server 這樣的配置,我們這用不到,它是為lvs準備的,
(2) 腳本檔案
/usr/local/nginx/nginx_check.sh :
# 在/usr/local下新建目錄nginx
mkdir nginx
# 新建檔案
touch nginx_check.sh
# 編輯內容
#!/bin/bash
A=`ps -C nginx --no-header |wc -l` #查看nginx行程是否存在
#if [ $A -eq 0 ];then
/usr/sbin/nginx #重啟nginx
if [ $A -eq 0 ];then #nginx重啟失敗
exit 1 # keepalived執行腳本,回傳非0結果,ip漂移
else
exit 0 # keepalived執行腳本,回傳0,ip不漂移
fi
#else
# exit 0
#fi
需要給nginx_check.sh檔案加可執行權限
chmod +x nginx_check.sh
(3)修改從機keepalived.conf組態檔
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id backup
}
vrrp_script check_nginx {
script "/usr/local/nginx/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 從機
interface ens33
virtual_router_id 51 # 組id,需要一致
priority 99 # 優先級
advert_int 1
# 呼叫nginx掛了之后進行vip漂移的函式
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1111
}
# 配置vip
virtual_ipaddress {
192.168.253.50/24 dev eth0 label ens33:1 scope global
}
}
同樣需要在/usr/local/nginx/路徑下放上nginx_check.sh腳本檔案,
(4) 啟動nginx、keepalived
#主從啟動
sudo systemctl restart nginx.service
#主從啟動
systemctl start keepalived
(5) 訪問測驗
為效果明顯,可以修改Nginx首頁,將主從IP地址放置首頁以便區分,
訪問http://192.168.253.50 or curl 192.168.253.50
查看Nginx日志
cd /var/log/nginx/
cat access.log
查看主服務器keepalived日志:
Keepalived默認所有的日志都是寫入到/var/log/message ,
你可以使用命令 tail -f /var/log/messages|grep Keepalived 進行查看
查看ens33網卡資訊:
ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
pfifo_fast state UNKNOWN group default qlen 1000
inet 192.168.253.11/24 brd 192.168.253.255 scope
global noprefixroute ens33
inet 192.168.253.50/24 scope global secondary ens33:1
#VIP已漂移到主機,vip只能選擇一個機器進行系結
(6)停掉主服務器的nginx
通過瀏覽器訪問:http://192.168.253.50
查看主機KeepAlived日志:
tail -f /var/log/messages|grep Keepalived
# 強制停止
pkill -9 nginx
# 查看Nginx行程
ps -ef | grep nginx
# 等待幾秒后再次查看Nginx行程,發現已經通過檢查腳本自啟
# 因為在keepalived腳本中,進行了nginx重啟操作
則會執行腳本nginx_check.sh進行nginx啟動!
如果master上的nginx服務掛了,則nginx會自動重啟,重啟失敗后會自動關閉keepalived,這樣vip資源也會轉移到slave上,
master和slave兩邊都開啟nginx服務,無論master還是slave,當其中的一個keepalived服務停止后,vip都會漂移到keepalived服務還在的節點上;
如果要想使nginx服務掛了,vip也漂移到另一個節點,則必須用腳本或者在組態檔里面用shell命令來控制,(nginx服務宕停后會自動啟動,啟動失敗后會會致使vip資源漂移到另一臺機器上)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/498492.html
標籤:Java
上一篇:Optional類詳解
