nginx 安裝設定記錄稿

2020-08-10 07:18:39

以下記錄收集網路資源整理而成

1 nginx安裝

1.1 下載

官方網址:http://nginx.org/en/download.html
其中 「Stable version」 代表最新穩定版本

我這裏下載的是 nginx-1.16.1.tar.gz 壓縮包

1.2 上傳至Linux

下載完成後使用工具(如:xftp等)上傳到 Linux 系統上

在这里插入图片描述

1.2 準備安裝

1.2.1 安裝依賴環境

  1. gcc環境

yum install -y gcc-c++

  1. pcre庫,用於解析正則表達式

yum install -y pcre pcre-devel

  1. zlib庫,用於壓縮和解壓縮

yum install -y zlib zlib-devel

  1. openssl庫,用於SSL

yum install -y openssl openssl-devel

1.2.2 編譯及安裝

解壓壓縮包,解壓得到的是原始碼,需要編譯

tar zxf nginx-1.16.1.tar.gz

建立臨時目錄,注意應該是 /var/temp/nginx 目錄

mkdir -p /var/temp/nginx

進入到之前解壓得到的原始碼目錄(nginx-1.16.1)
執行以下命令,建立makefile檔案

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
  • 注: \代表在命令列中換行,用於提高可讀性
  • 設定命令解釋:
命令 解釋
–prefix 指定nginx安裝目錄
–pid-path 指向nginx的pid
–lock-path 鎖定安裝檔案,防止被惡意篡改或誤操作
–error-log 錯誤日誌
–http-log-path http日誌
–with-http_gzip_static_module 啓用gzip模組,線上實時壓縮輸出數據流
–http-client-body-temp-path 設定用戶端請求的臨時目錄
–http-proxy-temp-path 設定http代理臨時目錄
–http-fastcgi-temp-path 設定fastcgi臨時目錄
–http-uwsgi-temp-path 設定uwsgi臨時目錄
–http-scgi-temp-path 設定scgi臨時目錄

命令執行完成後,可以看到出現了Makefile檔案
在这里插入图片描述
開始編譯

make

安裝

make install

成功後,執行

whereis nginx

命令,發現安裝在了/usr/local/nginx目錄下
進入到whereis 查詢到的目錄,我這裏是/usr/local/nginx,
會發現存在三個目錄,分別是:conf,html以及sbin
進入sbin目錄,執行

./nginx

此時nginx 進程已經啓動,通過ps -ef命令可以檢視
在这里插入图片描述
可以看到存在一個master進程和一個worker進程
關閉linux防火牆後(注我這裏是虛擬機器環境)

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啓動

在瀏覽器就可以存取目標linux主機ip,出現如下圖
在这里插入图片描述
至此 nginx安裝成功

2 簡單設定

2.1 組態檔介紹

在nginx的目錄下的conf資料夾下存在一個nginx.conf檔案就是linux的組態檔
在这里插入图片描述
nginx.conf的設定結構

main 全域性設定
event 工作模式及連線數
http{ http模組相關設定
	upstream 叢集,內網伺服器
	server{ 虛擬主機設定,可以有多個
		location 路由規則
	}
}

核心組態檔解析

#worker進程的操作使用者
#user  nobody;
#worker進程數量,一般不大於CPU核心數
worker_processes  1;

#日誌級別 debug info notice warn error crit
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
	# 工作模式,預設使用epoll
	use epoll
	# 每個worker允許的最大連線數
    worker_connections  1024;
}

http {
	# 包含的檔案
    include       mime.types;
    default_type  application/octet-stream;
	
	#main代表變數名,可以在下方直接參照,$開頭的是nginx預設參數
    #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 使用高效檔案傳輸,提升傳輸效能。
	#啓用後才能 纔能使用 tcp_nopush ,是指當數據表累積一定大小後才發送,提高了效率。
    sendfile        on;
    #tcp_nopush     on;

	#keepalive_timeout 設定用戶端與伺服器端請求的超時時間,保證用戶端多次請求的時候不會重複建立新的連線,節約資源損耗
    keepalive_timeout  65;

	#gzip 啓用壓縮,html/js/css壓縮後傳輸會更快
    #gzip  on;

	# server 可以在 http 指令塊中設定多個虛擬主機
    server {
		#listen 監聽埠 
		#server_name localhost、ip、域名 
		#location 請求路由對映,匹配攔截 
		#root 請求位置 
		#index 首頁設定
		
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

日誌預設參數解析

參數名 參數意義
$remote_addr 用戶端ip
$remote_user 遠端用戶端使用者名稱,一般爲:’-’
$time_local 時間和時區
$request 請求的url以及method
$status 響應狀態碼
$body_bytes_send 響應用戶端內容位元組數
$http_referer 記錄使用者從哪個鏈接跳轉過來的
$http_user_agent 使用者所使用的代理,一般來時都是瀏覽器
$http_x_forwarded_for 通過代理伺服器來記錄用戶端的ip

2.2 定時切割日誌

建立一個shell檔案,我是在"/usr/local/nginx/sbin"目錄下

vi cut_my_log.sh

開啓檔案,複製以下內容,並儲存退出

#!/bin/bash 
LOG_PATH="/var/log/nginx/" 
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M) 
PID=/var/run/nginx/nginx.pid 
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log 
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log 
 
#向Nginx主進程發送信號,用於重新開啓日誌檔案 
kill -USR1 `cat $PID`

注意LOG_PATH路徑以及PID,通過

./nginx -V

命令可以檢視自己的相關設定

爲剛纔的指令碼新增可執行許可權

chmod +x cut_my_log.sh

手動執行

./cut_my_log.sh

命令,檢視log路徑,發現日誌已切割

在这里插入图片描述
安裝定時任務(有可能已經存在)

yum install -y crontabs

crontab -e 編輯並且新增一行新的任務

*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh

爲做測試,這裏是每隔1分鐘執行一次指令碼
重新啓動定時任務

systemctl restart crond
或者是
service crond restart

一段時間後,可以發現日誌已經定時切割
在这里插入图片描述
crond 常用命令

systemctl start crond //啓動服務
systemctl stop crond //關閉服務
systemctl restart crond //重新啓動服務
systemctl reload crond //重新載入設定
crontab -e // 編輯任務
crontab -l // 檢視任務列表

Cron表達式是,分爲5或6個域,每個域代表一個含義,如下所示:
在这里插入图片描述
常用表達式:

每分鐘執行:
*/1 * * * *
每日凌晨(每天晚上23:59)執行:
59 23 * * *
每日凌晨1點執行:
0 1 * * *

使用crontab -e命令可以修改表達式,比如將之前表達式修改爲每日1點執行一次

2.3 提供靜態資源服務

2.3.1 簡單使用

首先上傳幾個檔案,我放在了/opt/static檔案下
在这里插入图片描述
修改nginx.conf檔案,修改server模組

server {
        listen       80;
        server_name  localhost;

        location / {
            root   /opt/static;
            index  index.html;
        }
    }

使用 /usr/local/nginx/sbin/nginx -t 命令檢查組態檔,發現沒有問題
在这里插入图片描述
重新載入設定

/usr/local/nginx/sbin/nginx -s reload

在瀏覽器輸入ip即可開啓index.html

使用 ip/檔名 ,即可存取具體的某個檔案,比如
http://192.168.2.30/2.jpg
會顯示之前上傳的2.jpg這個檔案

複製改寫一個server

server {
        listen       81;
        server_name  localhost;

        location / {
            root   /opt;
            index  index.html;
        }
    }

重新載入設定
瀏覽器輸入 ip:port ,會顯示Forbidden,因爲我們在/opt目錄下沒有一個叫index.html的檔案
在这里插入图片描述
此時需要輸入 ip:port/static 纔可以顯示index.html
除了 root 還有一個 alias 可以起到類似的效果
改寫一個server,當location 只包含 /時,需要在alias最後面加一個/,否則會找不到檔案,我下面 下麪的例子實際上可以不在最後加/

server {
        listen       82;
        server_name  localhost;

        location /ss {
            alias   /opt/static/;
            index  index.html;
        }
    }

載入設定後,使用 ip:port/ss 可以存取資源

2.3.2 root 和 alias

rootalias存取路徑的解釋:
假設伺服器存在 /opt/static/2.jpg 這個檔案

  • root 路徑完全匹配存取
    設定的時候爲:
location /static {
     root   /opt;
}

存取路徑就是 ip:port/static/2.jpg,這個請求被解釋爲
root + location + 後續url路徑/opt + /static + 2.jpg,
顯然在伺服器裡的確存在一個 /opt/static/2.jpg 的資源
也就是 ip:port後面的url路徑在你的伺服器裏面必須真實存在,否則存取不到

  • alias 可以爲你的路徑做一個別名,對使用者透明
    設定的時候爲:
 location /ss {
      alias   /opt;
 }

存取路徑就是 ip:port/ss/static/2.jpg,這個請求被解釋爲
(location 替換爲 alias) + 後續url路徑(/ss 替換爲 /opt) + /static/2.jpg
也就是 /opt/static/2.jpg
相關於給 /opt 起了一個別名叫 /ss

2.3.3 location

  • 空格 :預設匹配,普通匹配
location / {
	root /opt;
}
  • = :精確匹配
location = /static/a.txt{
   root /opt;
}
  • ~* :匹配正則表達式,不區分大小寫
#符合圖片的顯示
location ~*  \.(jpg|png|jpeg) {
	root /opt;
}
  • ~ :匹配正則表達式,區分大小寫
#png必須小寫才能 纔能匹配到
location ~ \.(TXT|jpg|png|jpeg) {
	root /opt;
}
  • ^~ :以某個字元路徑開頭
location ^~ /static{
	root /opt;
}

3 跨域支援及防盜鏈

在server塊中加入以下設定

		#允許跨域請求的域,*代表所有 
		add_header 'Access-Control-Allow-Origin' *; 
		#允許帶上cookie請求 
		add_header 'Access-Control-Allow-Credentials' 'true'; 
		#允許請求的方法,比如 GET/POST/PUT/DELETE 
		add_header 'Access-Control-Allow-Methods' *; 
		#允許請求的header 
		add_header 'Access-Control-Allow-Headers' *; 
		
		#對源站點驗證,校驗域名或IP 
		valid_referers *.abc.com;  
		#非法引入會進入下方判斷 
		if ($invalid_referer) {     return 404; } 

4 反向代理及負載均衡

首先啓動幾個應用伺服器,我這裏是啓動了springBoot打包的jar,在不同埠上

在http模組中加入upstream模組

upstream myJar{
		server 192.168.2.1:80;
		server 192.168.2.1:81;
		server 192.168.2.1:82;
}

server {
        listen       80;
        server_name  localhost;
        location / {
			proxy_pass http://myJar;
		}
}

載入設定後,存取ip可以看到返回結果確實是應用伺服器的結果,此時預設的負載均衡策略是輪詢
在这里插入图片描述
預設情況下是普通輪詢,權重都是1
下面 下麪看一下加權輪詢負載均衡

upstream myJar{
		server 192.168.2.1:80 weight=2;
		server 192.168.2.1:81;
		server 192.168.2.1:82;
	}

發現80埠的伺服器,會響應兩次,81和82的只會響應一次,如此往復

ip_hash負載均衡

upstream myJar{
		ip_hash;
		server 192.168.2.1:80;
		server 192.168.2.1:81 down;
		server 192.168.2.1:82;
}

注意 如果需要將後臺伺服器臨時移除,應標記 down
參考:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

當應用伺服器擴容或宕機後,nginx會重新進行hash,可能導致session丟失(本來a請求存取的一直是伺服器1,結果伺服器2宕機了,重新hash後,導致a請求存取到了伺服器3,但是之前session一直維持在伺服器1中)

針對ip_hash的缺點,出現了一致性hash演算法,可以減小服務擴容或宕機帶來的影響
一致性hash需要安裝第三方模組 ngx_http_consistent_hash,這裏暫時不展開

url_hash 負載均衡

upstream myJar{
		hash $request_uri; 
		server 192.168.2.1:80;
		server 192.168.2.1:81 down;
		server 192.168.2.1:82;
}

根據請求的url進行hash

least_conn負載均衡

upstream myJar{
		least_conn;
		server 192.168.2.1:80;
		server 192.168.2.1:81 down;
		server 192.168.2.1:82;
	}

會將請求轉發到連線數最少的那個伺服器上

在文件http://nginx.org/en/docs/http/ngx_http_upstream_module.html中可以看到server 後面可以帶上一些參數

參數 作用
max_conns 限制每台server的連線數,用於保護避免過載,可起到限流作用
max_fails 表示失敗幾次,則標記server已宕機,剔出上遊服務
fail_timeout 服務不可用的時間段;在fail_timeout時間內連續失敗max_fails次,表示服務不可用,在下一個fail_timeout時間段內不會有新請求鏈接到該伺服器,如此往復
backup 標記爲備用服務
down 標記服務永不可用
slow_start等 還有其他商業版本的參數不介紹了

使用 keepalive 提高吞吐量

	upstream myJar{
		least_conn;
		server 192.168.2.1:80;
		server 192.168.2.1:81;
		server 192.168.2.1:82;
		keepalive 16;
	}

    server {
        listen       80;
        server_name  localhost;
        location / {
			proxy_pass http://myJar;
			proxy_http_version 1.1;
            proxy_set_header Connection "";
		}
    }

其中
keepalived : 設定長連線處理的數量
proxy_http_version :設定長連線http版本爲1.1
proxy_set_header :清除connection header 資訊

5 快取

  • expires控制瀏覽器快取,新增在location模組中
expires 指令可以控制 HTTP 應答中的「 Expires 」和「 Cache-Control 」的頭標
(起到控制頁面快取的作用)
語法:expires [time|epoch|max|pff]
預設值:off
expires指令控制HTTP應答中的「Expires」和「Cache-Control」Header頭部資訊,啓動控制頁面快取的作用
time:可以使用正數或負數。「Expires」頭標的值將通過當前系統時間加上設定time值來設定。
time值還控制"Cache-Control"的值:
負數表示no-cache
正數或零表示max-age=time

epoch:指定「Expires」的值爲 1 January,1970,00:00:01 GMT
max:指定「Expires」的值爲31 December2037 23:59:59GMT,"Cache-Control"的值爲10年。
-1:指定「Expires」的值爲當前伺服器時間-1s,即永遠過期。
off:不修改「Expires」和"Cache-Control"的值

使用舉例

server {
        listen       80;
        server_name  localhost;
		location / {     
			alias /opt/static/;     
			# expires 10s;     
			# expires @10h30m;     
			# expires -1h;     
			# expires epoch;     
			# expires off;     
			expires max; 
		}	
    }
  • 反向代理快取
	# proxy_cache_path 設定快取目錄 
	#keys_zone 設定共用記憶體以及佔用空間大小 
	#max_size 設定快取大小 
	#inactive 超過此時間則被清理 
	#use_temp_path 臨時目錄,使用後會影響nginx效能 
	proxy_cache_path /usr/local/nginx/upstream_cache 
	keys_zone=mycache:5m max_size=1g 
	inactive=1m use_temp_path=off;
	
    server {
        listen       80;
        server_name  localhost;
		location / {     
			proxy_pass http://myJar;
			# 啓用快取,和keys_zone一致     
			proxy_cache mycache;     
			# 針對200和304狀態碼快取時間爲8小時     
			proxy_cache_valid   200 304 8h;
		}	
    }

存取請求後,可以發現在 /usr/local/nginx/upstream_cache 下面 下麪存在快取檔案

6 SSL

6.1加裝SSL模組

進入到nginx的解壓目錄/opt/nginx-1.16.1下
執行

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_ssl_module

再次執行編譯make,然後進入objs目錄下,
如果nginx還在執行的話,先關閉,然後複製nginx檔案到/usr/local/nginx/sbin 那裏
#關閉進程

/usr/local/nginx/sbin/nginx -s stop

#覆蓋nginx檔案

cp nginx /usr/local/nginx/sbin/

通過nginx -V可以檢視已經帶上了SSL模組
在这里插入图片描述

6.2 生成自簽名證書(有證書的話上傳證書檔案就好了)

進入要存放ssl檔案的目錄,我這裏是 /usr/local/nginx/mySSL

首先執行如下命令生成一個key
openssl genrsa -des3 -out ssl.key 1024
然後他會要求你輸入這個key檔案的密碼。不推薦輸入。因爲以後要給nginx使用。每次reload nginx設定時候都要你驗證這個PAM密碼的。
由於生成時候必須輸入密碼。你可以輸入後 再刪掉。

mv ssl.key xxx.key
openssl rsa -in xxx.key -out ssl.key
rm xxx.key
然後根據這個key檔案生成證書請求檔案
openssl req -new -key ssl.key -out ssl.csr
以上命令生成時候要填很多東西 一個個看着寫吧(可以隨便,畢竟這是自己生成的證書)

最後根據這2個檔案生成crt證書檔案

openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
這裏365是證書有效期 推薦3650哈哈。這個大家隨意。最後使用到的檔案是key和crt檔案。

摘自https://www.cnblogs.com/weifeng1463/p/7943633.html

6.3 設定nginx.conf

在nginx.conf中加入ssl相關設定

	upstream myJar{
		server 192.168.2.1:80;
		server 192.168.2.1:81;
		server 192.168.2.1:82;
	}


    server {
        listen       443 ssl;
        server_name  localhost;
		location / {     
			proxy_pass http://myJar;
		}
		
		#設定ssl證書
		ssl_certificate /usr/local/nginx/mySSL/ssl.crt;
		#設定證書祕鑰
		ssl_certificate_key /usr/local/nginx/mySSL/ssl.key;
		#ssl對談cache
		ssl_session_cache shared:SSL:1m;
		#ssl對談超時時間
		ssl_session_timeout 5m;
		#設定加密套件,寫法遵循openssl標準
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
		ssl_prefer_server_ciphers on;
    }

載入設定後,瀏覽器輸入https://ip:port即可存取

設定http自動跳轉https

server{
	listen   80;
    server_name  localhost;
	rewrite ^(.*)$ https://$host$1 permanent;
}

7 nginx 高可用

7.1 Keepalived

7.1.1 安裝

下載地址https://www.keepalived.org/download.html
我這裏使用的 keepalived-2.0.18.tar.gz 版本
上傳到linux,解壓
進入到解壓目錄,可以看到一個configure檔案

安裝依賴

yum install -y libnl libnl-devel

執行

./configure --prefix=/usr/local/keepalived --sysconf=/etc

編譯安裝

make && make install  

通過whereis命令檢視keepalived路徑
在这里插入图片描述

7.1.2 設定

使用ip addr 檢視網絡卡及ip
在这里插入图片描述
網絡卡名稱是ens33,ip是192.168.2.30

編輯 /etc/keepalived/keepalived.conf 檔案

global_defs {
	# 路由id:當前安裝keepalived的節點主機識別符號,保證全域性唯一
	router_id keep_30
}

vrrp_instance VI_1 {
    # 表示狀態是MASTER主機還是備用機BACKUP
	state MASTER
	# 該範例系結的網絡卡
	interface ens33
	# 保證主備節點一致即可
	virtual_router_id 51
	# 權重,master權重一般高於backup,如果有多個,那就是選舉,誰的權重高,誰就當選
	priority 100
	# 主備之間同步檢查時間間隔,單位秒
	advert_int 2
	# 認證許可權密碼,防止非法節點進入
	authentication {
	auth_type PASS
		auth_pass 1111
	}
	
	# 虛擬出來的ip,可以有多個(vip)
	virtual_ipaddress {
		192.168.2.29
	}
}

執行 /usr/local/keepalived/sbin/keepalived命令,
再次檢視ip,發現ens33網絡卡系結了192.168.2.29 虛擬ip
在这里插入图片描述
此時通過 http://192.168.2.29 可以存取應用服務

7.1.3 註冊爲系統服務

進入到keepalived的解壓目錄下,具體是/opt/keepalived-2.0.18/keepalived/etc
裏面存在init.dsysconfig資料夾
在这里插入图片描述
執行

cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
systemctl daemon-reload

這時就可以開始使用systemctl 開啓和關閉 keepalived 服務了
在这里插入图片描述

7.1.4 雙機主備高可用

準備另一臺linux系統機器,裏面安裝nginx和keepalived
我這裏直接使用虛擬機器的克隆,並更改ip爲192.168.2.31

修改31機器的keepalived組態檔/etc/keepalived/keepalived.conf

global_defs {
	# 路由id:當前安裝keepalived的節點主機識別符號,保證全域性唯一
	router_id keep_31
}

vrrp_instance VI_1 {
    # 表示狀態是MASTER主機還是備用機BACKUP
	state BACKUP
	# 該範例系結的網絡卡
	interface ens33
	# 保證主備節點一致即可
	virtual_router_id 51
	# 權重,master權重一般高於backup,如果有多個,那就是選舉,誰的權重高,誰就當選
	priority 50
	# 主備之間同步檢查時間間隔,單位秒
	advert_int 2
	# 認證許可權密碼,防止非法節點進入
	authentication {
	auth_type PASS
		auth_pass 1111
	}
	
	# 虛擬出來的ip,可以有多個(vip)
	virtual_ipaddress {
		192.168.2.29
	}
}

對比30機器的設定,其實就是修改了router_id,statepriority三項內容

兩機器的nginx設定nginx.conf加入以下設定

server{
		listen   80;
        server_name  localhost;
		location / {
			root html;
			index index.html;
		}
}

分別更改index.html,使之有區別

同時啓動兩機器的nginx和keepalived服務
執行以下步驟:

  1. 存取192.168.2.29
  2. 關閉30機器的keepalived服務
  3. 再次存取192.168.2.29
  4. 重新開啓30機器的keepalived服務
  5. 然後存取192.168.2.29

存取結果如下:
在这里插入图片描述
可以看到,當30宕機後,請求到達31機器,當30恢復後,請求重新回到了30機器,實現了高可用

以上方法在某個機器宕機後,可以自動轉移故障,但是僅當nginx宕機後,依舊會導致服務不可用

7.1.5 nginx自動重新啓動

編寫nginx重新啓動檢測指令碼

vi /etc/keepalived/check_nginx_status.sh
#!/bin/bash 
 
A=`ps -C nginx --no-header |wc -l` 
# 判斷nginx是否宕機,如果宕機了,嘗試重新啓動 
if [ $A -eq 0 ];then     
	/usr/local/nginx/sbin/nginx     
	# 等待一小會再次檢查nginx,如果沒有啓動成功,則停止keepalived,使其啓動備用機     
	sleep 3     
	if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then         
		killall keepalived    
	fi 
fi

進入檔案目錄,加上可執行許可權 chmod +x check_nginx_status.sh
設定keepalived監聽nginx指令碼

vrrp_script check_nginx_alive {     
	script "/etc/keepalived/check_nginx_status.sh"     
	interval 2 # 每隔兩秒執行上一行指令碼     
	weight 10 # 如果指令碼執行成功,則升級權重+10 
}

在 vrrp_instance 中新增監控的指令碼

track_script {     
		check_nginx_alive   # 追蹤 nginx 指令碼 
}

此時keepalived的完整檔案爲:

global_defs {
	# 路由id:當前安裝keepalived的節點主機識別符號,保證全域性唯一
	router_id keep_30
}

vrrp_script check_nginx_alive {     
	script "/etc/keepalived/check_nginx_status.sh"     
	interval 2 # 每隔兩秒執行上一行指令碼     
	weight 10 # 如果指令碼執行成功,則升級權重+10 
}

vrrp_instance VI_1 {
    # 表示狀態是MASTER主機還是備用機BACKUP
	state MASTER
	# 該範例系結的網絡卡
	interface ens33
	# 保證主備節點一致即可
	virtual_router_id 51
	# 權重,master權重一般高於backup,如果有多個,那就是選舉,誰的權重高,誰就當選
	priority 100
	# 主備之間同步檢查時間間隔,單位秒
	advert_int 2
	# 認證許可權密碼,防止非法節點進入
	authentication {
	auth_type PASS
		auth_pass 1111
	}
	
	track_script {     
		check_nginx_alive   # 追蹤 nginx 指令碼 
	}
	
	# 虛擬出來的ip,可以有多個(vip)
	virtual_ipaddress {
		192.168.2.29
	}

}

重新啓動keepalived 使設定生效 systemctl restart keepalived

手動關閉nginx進程,存取192.168.2.29可發現依舊正常,nginx服務被自動重新啓動

顯然,有一半的機器資源被浪費了

7.1.6 雙主熱備

修改30的keepalived組態檔
新增

vrrp_instance VI_2 {
    # 表示狀態是MASTER主機還是備用機BACKUP
	state BACKUP
	# 該範例系結的網絡卡
	interface ens33
	# 保證主備節點一致即可
	virtual_router_id 52
	# 權重,master權重一般高於backup,如果有多個,那就是選舉,誰的權重高,誰就當選
	priority 50
	# 主備之間同步檢查時間間隔,單位秒
	advert_int 2
	# 認證許可權密碼,防止非法節點進入
	authentication {
	auth_type PASS
		auth_pass 1111
	}
	# 虛擬出來的ip,可以有多個(vip)
	virtual_ipaddress {
		192.168.2.28
	}
}

修改了vrrp_instance,state,virtual_router_id,priority,virtual_ipaddress

修改31的keepalived組態檔
新增

vrrp_instance VI_2 {
    # 表示狀態是MASTER主機還是備用機BACKUP
	state MASTER
	# 該範例系結的網絡卡
	interface ens33
	# 保證主備節點一致即可
	virtual_router_id 52
	# 權重,master權重一般高於backup,如果有多個,那就是選舉,誰的權重高,誰就當選
	priority 100
	# 主備之間同步檢查時間間隔,單位秒
	advert_int 2
	# 認證許可權密碼,防止非法節點進入
	authentication {
	auth_type PASS
		auth_pass 1111
	}
	# 虛擬出來的ip,可以有多個(vip)
	virtual_ipaddress {
		192.168.2.28
	}
}

重新啓動30,31的keepalived服務
即30,31互爲主備,存在兩個虛擬ip192.168.2.29以及192.168.2.28,
通過DNS輪詢,可以使使用者請求發給29或28這兩個虛擬ip,使得兩個機器可以同時提供服務