應(yīng)用架構(gòu)之【Nginx+Keepalived】Web 集群方案

Nginx 是一個(gè)開(kāi)源(遵循 BSD 協(xié)議)、高性能、高可靠的 Web 和反向代理服務(wù)器。主要用于 Web 應(yīng)用的緩存和負(fù)載均衡,支持熱部署、占用內(nèi)存少、并發(fā)能力強(qiáng),能支持高達(dá) 5w 個(gè)并發(fā)連接數(shù)。

Nginx 主要應(yīng)用場(chǎng)景包括:
1、靜態(tài)資源(靜態(tài) HTML 網(wǎng)站、文件、圖片、音視頻)的 Web 服務(wù)器;
2、Web 應(yīng)用和服務(wù)的反向代理(負(fù)載均衡、緩存)服務(wù)器。

Keepalived是一個(gè)開(kāi)源(遵循 GPLv2 協(xié)議)的、基于 VRRP 協(xié)議的輕量級(jí)服務(wù)高可用和負(fù)載均衡方案,提供避免服務(wù)器單點(diǎn)故障和請(qǐng)求分流的能力。它為 Nginx 擴(kuò)展了高可用能力,共同組成完整的 Web 服務(wù)集群模式(高可用+負(fù)載均衡)。

目錄

1.集群部署拓?fù)鋱D

2.Web 應(yīng)用服務(wù)器部署

3.Nginx 代理服務(wù)器的安裝和配置

4.Keepalived 高可用中間件的安裝和配置

附錄一 Nginx 配置文件詳解

附錄二 Nginx 配置虛擬主機(jī)頭

附錄三 擴(kuò)展 Nginx 客戶端身份認(rèn)證

附錄四 擴(kuò)展 Nginx 跨域訪問(wèn)

附錄五 擴(kuò)展 Nginx 網(wǎng)頁(yè)壓縮

附錄六 Nginx 四層網(wǎng)絡(luò)協(xié)議負(fù)載均衡


1.集群部署拓?fù)鋱D

Web應(yīng)用集群部署拓?fù)鋱D

網(wǎng)絡(luò)資源規(guī)劃:

1、Web 應(yīng)用服務(wù)器節(jié)點(diǎn)

節(jié)點(diǎn)名 主機(jī)名 IP:PORT 程序 操作系統(tǒng)
Web 集群節(jié)點(diǎn)-1 Web-1 192.168.216.1:80 Python HttpServer CentOS8
Web 集群節(jié)點(diǎn)-2 Web-2 192.168.216.2:80 Python HttpServer CentOS8
Web 集群節(jié)點(diǎn)≥3 Web-3 192.168.216.3:80 Python HttpServer CentOS8

2、Nginx 高可用服務(wù)器節(jié)點(diǎn)

節(jié)點(diǎn)名 主機(jī)名 IP:PORT 程序 操作系統(tǒng)
Nginx 集群節(jié)點(diǎn)-1 Proxy-1 192.168.216.128:80 / 112 Nginx / Keepalived CentOS8
Nginx 集群節(jié)點(diǎn)≥2 Proxy-2 192.168.216.129:80 / 112 Nginx / Keepalived CentOS8

Keepalived Virtual IP:192.168.216.130。


2.Web 應(yīng)用服務(wù)器部署

Web 應(yīng)用服務(wù)器可以使用任何中間件部署 WebSite 、WebApp 或者是通過(guò) Http 協(xié)議提供服務(wù)的資源。需要注意的是:作為 Web 負(fù)載均衡的節(jié)點(diǎn),發(fā)布的服務(wù)通常需要具備完全一致性,包括但不限于:數(shù)據(jù)源一致性、程序一致性、配置一致性。

常見(jiàn)的 Web 開(kāi)源中間件:

產(chǎn)品 獨(dú)立部署 SpringBoot 嵌入 靜態(tài)資源 靜態(tài)站點(diǎn) JavaWeb SSL
Tomcat
Undertow ×
Jetty ×
Nginx × ×
Apache Httpd × ×
Python HttpServer × × ×

本例采用 Python HttpServer 搭建靜態(tài)站點(diǎn)的演示環(huán)境。

在各個(gè) "Web 應(yīng)用服務(wù)器節(jié)點(diǎn)" (Web-1、Web-2、Web-3)上制作、發(fā)布靜態(tài)站點(diǎn)。以節(jié)點(diǎn) "Web-1" 為例:

1、在用戶主目錄下創(chuàng)建靜態(tài)站點(diǎn)。

使用文本編輯器創(chuàng)建 HTML 文件:

[centos@Web-1 ~ ]$ mkdir website
[centos@Web-1 ~ ]$ gedit ~/website/index.html

在文件中編寫以下內(nèi)容并保存:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>website-1</title>
  </head>
  <body>
    【Nginx+Keepalived】Web 集群演示
  </body>
</html>

注意: 為了演示 Nginx 負(fù)載均衡特性,"<title />"中定義各個(gè)站點(diǎn)的標(biāo)識(shí),三個(gè) Web 站點(diǎn)依次為:"website-1"、"website-2"、"website-3";"<body />"中定義的內(nèi)容必須一致,體現(xiàn)發(fā)布服務(wù)的一致性。

2、進(jìn)入靜態(tài)站點(diǎn)目錄并發(fā)布站點(diǎn)。

[centos@Web-1 ~ ]$ cd website
[centos@Web-1 website ]$ sudo python3 -m http.server 80

3、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"80"端口訪問(wèn)服務(wù)器。

[centos@Web-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
[centos@Web-1 ~ ]$ sudo firewall-cmd --reload

4、使用瀏覽器訪問(wèn) Web 服務(wù)。

Web 服務(wù)測(cè)試頁(yè)面

注意:其他 "Web 應(yīng)用服務(wù)器節(jié)點(diǎn)" 全部需要按照以上步驟配置。


3.Nginx 代理服務(wù)器的安裝和配置

在各個(gè) "Proxy 集群節(jié)點(diǎn)" (Proxy-1、Proxy-2)安裝、配置 Nginx,以 "Proxy-1" 為例:

1、打開(kāi) Nginx 下載頁(yè)面【http://nginx.org/en/download.html】,下載 Nginx 的源代碼 tar.gz 包到用戶主目錄中。

Nginx 下載頁(yè)面

2、驗(yàn)證并安裝依賴軟件。通過(guò)源代碼編譯的方式安裝 Nginx,需要依賴軟件"make"、"gcc"、"pcre"、"pcre-devel"、"zlib"、"zlib-devel"、"openssl"、"openssl-devel",驗(yàn)證或安裝依賴軟件。

[centos@Proxy-1 ~]$ sudo dnf install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

補(bǔ)充知識(shí):

① "gcc"是一個(gè)C/C++、FORTRAN、JAVA、OBJC、ADA等多種語(yǔ)言的編譯器,用來(lái)將源代碼編譯成可發(fā)布的軟件程序。

② "make"是一個(gè)工程管理工具,能夠根據(jù) Makefile 中的腳本執(zhí)行編譯、安裝流程。

③ "pcre"是一個(gè)正則表達(dá)式函數(shù)庫(kù);"pcre-devel"是它的開(kāi)發(fā)庫(kù)。

④ "zlib"是一個(gè)數(shù)據(jù)壓縮函數(shù)庫(kù);"zib-devel"是它的開(kāi)發(fā)庫(kù)。

⑤ "openssl"是一個(gè)實(shí)現(xiàn)安全通信,避免竊聽(tīng),同時(shí)確認(rèn)另一端連接者身份的軟件程序;"openssl-devel"是它的開(kāi)發(fā)庫(kù)。

3、解壓縮 Nginx 的源代碼 tar 包到用戶主目錄下。

[centos@Proxy-1 ~]$ tar -zxvf nginx-1.18.0.tar.gz
[centos@Proxy-1 ~]$ ll
drwxr-xr-x.  8 centos centos    4096 4月  21 22:09 nginx-1.18.0

4、安裝 Nginx,進(jìn)入源代碼目錄,配置、編譯、安裝程序。

[centos@Proxy-1 ~]$ cd nginx-1.18.0
[centos@Proxy-1 nginx-1.18.0]$ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --with-stream
Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

[centos@Proxy-1 nginx-1.18.0]$ make
[centos@Proxy-1 nginx-1.18.0]$ sudo make install

[centos@Proxy-1 ~]$ ll /usr/local/nginx
drwxr-xr-x. 2 root root 4096 5月  18 09:39 conf
drwxr-xr-x. 2 root root   40 5月  18 09:39 html
drwxr-xr-x. 2 root root    6 5月  18 09:39 logs
drwxr-xr-x. 2 root root   19 5月  18 09:39 sbin

程序安裝目錄是"/usr/local/nginx"。

5、設(shè)置 Nginx 配置文件參數(shù)。

使用文本編輯器打開(kāi)配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或驗(yàn)證文件中的以下參數(shù)并保存(七層代理):

http {
    
    # 負(fù)載均衡
    upstream website {
        server 192.168.216.1:80 weight=1;
        server 192.168.216.2:80 weight=1;
        server 192.168.216.3:80 weight=1;
    }
    
    server {
        # 監(jiān)聽(tīng)端口
        listen       80;
        
        # 服務(wù)器域名(主機(jī)頭)
        server_name  localhost;

        # 代理 Web 服務(wù)的 Url 前綴,一般是 Web 服務(wù)的虛擬目錄(可以是正則表達(dá)式)。
        location / {
            proxy_pass http://website;
        }
    }
}

在文件中追加以下參數(shù)并保存(四層代理):

stream {
    
    # 負(fù)載均衡
    upstream website {
        server 192.168.216.1:80 weight=1;
        server 192.168.216.2:80 weight=1;
        server 192.168.216.3:80 weight=1;
    }
    
    server {
        # 監(jiān)聽(tīng)端口
        listen       80;
        
        # 代理服務(wù)位置
        proxy_pass website;
    }
}

注意:兩種方案二選一即可。

Web 代理一般使用七層協(xié)議代理,以便于實(shí)現(xiàn)主機(jī)頭等站點(diǎn)路由功能;
四層協(xié)議可用于 Web 代理以外的負(fù)載均衡場(chǎng)景,如:MySQL 數(shù)據(jù)庫(kù)只讀連接等。

6、配置 Nginx 開(kāi)機(jī)自啟動(dòng)。

使用文本編輯器創(chuàng)建配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /usr/lib/systemd/system/nginx.service

編寫文件內(nèi)容并保存如下:

[Unit]
Description=Nginx
After=syslog.target network.target

[Service]
Type=forking
User=root
Group=root

ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

設(shè)置開(kāi)機(jī)啟動(dòng):

[centos@Proxy-1 ~ ]$ sudo systemctl daemon-reload
[centos@Proxy-1 ~ ]$ sudo systemctl enable nginx.service

7、啟動(dòng) Nginx 服務(wù)。

[centos@Proxy-1 ~ ]$ sudo systemctl start nginx.service

8、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"80"端口(Nginx 默認(rèn)端口)訪問(wèn)服務(wù)器。

[centos@Proxy-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
[centos@Proxy-1 ~ ]$ sudo firewall-cmd --reload

注意:其他 "Proxy 集群節(jié)點(diǎn)" 全部需要按照以上步驟配置。

9、Nginx 運(yùn)維管理。

1)啟動(dòng) Nginx 服務(wù)(任選一種方式)

[centos@Proxy-1 ~ ]$ sudo systemctl start nginx.service

或者

[centos@Proxy-1 ~ ]$ sudo -u /usr/local/nginx/sbin/nginx

2)停止 Nginx 服務(wù)(任選一種方式)

[centos@Proxy-1 ~ ]$ sudo systemctl stop nginx.service

或者

[centos@Proxy-1 ~ ]$ /usr/local/nginx/sbin/nginx -s quit

3)重啟 Nginx 服務(wù)

[centos@Proxy-1 ~ ]$ sudo systemctl restart nginx.service

或者

[centos@Proxy-1 ~ ]$ /usr/local/nginx/sbin/nginx -s reload

4)查看 Nginx 服務(wù)狀態(tài)

[centos@Proxy-1 ~ ]$ sudo systemctl status nginx.service

或者

[centos@Proxy-1 ~ ]$ sudo ps -ef | grep nginx
root     119777      1  0 10:16 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx

[centos@Proxy-1 ~ ]$ sudo netstat -ntap | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      119777/nginx: maste

[centos@Proxy-1 ~ ]$ sudo tail /usr/local/nginx/logs/error.log
[centos@Proxy-1 ~ ]$ sudo tail /usr/local/nginx/logs/access.log

5)啟用 Nginx 服務(wù)開(kāi)機(jī)自啟動(dòng)

[centos@Proxy-1 ~ ]$ sudo systemctl enable nginx.service

6)禁用 Nginx 服務(wù)開(kāi)機(jī)自啟動(dòng)

[centos@Proxy-1 ~ ]$ sudo systemctl disable nginx.service

4.Keepalived 高可用中間件的安裝和配置

在各個(gè) "Proxy 集群節(jié)點(diǎn)" (Proxy-1、Proxy-2)安裝、配置 Keepalived,以 "Proxy-1" 為例:

1、安裝 EPEL 的 Yum源。

使用文本編輯器創(chuàng)建倉(cāng)庫(kù)配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo

在文件中編寫以下內(nèi)容并保存:

[epel-modular]
name=Extra Packages for Enterprise Linux Modular $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8

[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8

更新 Yum 源:

[centos@Proxy-1 ~]$ sudo dnf clean all
[centos@Proxy-1 ~]$ sudo dnf makecache
Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB     00:00    
Extra Packages for Enterprise Linux 8 - x86_64  3.7 MB/s | 6.9 MB     00:01    
元數(shù)據(jù)緩存已建立。

EPEL(Extra Packages for Enterprise Linux)是企業(yè)級(jí) Linux 操作系統(tǒng)的擴(kuò)展包倉(cāng)庫(kù),為 Redhat/CentOS系統(tǒng)提供大量的額外軟件包。

2、安裝 Keepalived。

[centos@Proxy-1 ~]$ sudo dnf install keepalived

程序安裝目錄是"/usr/sbin",配置文件目錄是"/etc/keepalived"。

3、設(shè)置 Keepalived 配置文件參數(shù)。

使用文本編輯器打開(kāi)配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /etc/keepalived/keepalived.conf

在文件中編寫以下內(nèi)容并保存:

# 定義全局配置
global_defs {
    # 本地節(jié)點(diǎn) ID 標(biāo)識(shí),一般設(shè)置為主機(jī)名。
    router_id proxy-1
}

# 定義周期性執(zhí)行的腳本,腳本的退出狀態(tài)碼會(huì)被調(diào)用它的所有的 vrrp_instance 記錄。
vrrp_script chk_nginx {
    # 執(zhí)行腳本的路徑。
    script "/etc/keepalived/nginx_check.sh"
    # 腳本執(zhí)行的間隔(單位是秒)。默認(rèn)為1s。
    interval 2
    # 當(dāng)腳本調(diào)整優(yōu)先級(jí),從 -254 到 254。默認(rèn)為2。
    # 1. 如果腳本執(zhí)行成功(退出狀態(tài)碼為0),weight大于0,則priority增加。
    # 2. 如果腳本執(zhí)行失敗(退出狀態(tài)碼為非0),weight小于0,則priority減少。
    # 3. 其他情況下,priority不變。
    weight -20
    # 當(dāng)腳本執(zhí)行超過(guò)時(shí)長(zhǎng)(單位是秒)則被認(rèn)為執(zhí)行失敗。
    # 運(yùn)行腳本的用戶和組。
    user root root
    # timeout 30
    # 當(dāng)腳本執(zhí)行成功到設(shè)定次數(shù)時(shí),才認(rèn)為是成功。
    # rise 1
    # 當(dāng)腳本執(zhí)行失敗到設(shè)定次數(shù)時(shí),才認(rèn)為是失敗。
    # fall 3
}

# 定義虛擬路由,可以定義多個(gè)。
vrrp_instance VI_1 {
    # 本地節(jié)點(diǎn)初始狀態(tài),包括 MASTER(主節(jié)點(diǎn)) 和 BACKUP (備節(jié)點(diǎn))。
    state MASTER
    # 本地節(jié)點(diǎn)綁定虛擬 IP 的網(wǎng)絡(luò)接口。
    interface ens33
    # 本地節(jié)點(diǎn)優(yōu)先級(jí),優(yōu)先級(jí)高的節(jié)點(diǎn)將動(dòng)態(tài)變成 MASTER 節(jié)點(diǎn),接管 VIP 。初始狀態(tài)下,MASTER 節(jié)點(diǎn)的優(yōu)先級(jí)必須高于 BACKUP 節(jié)點(diǎn)。
    priority 100
    # VRRP 實(shí)例 ID,范圍是0-255。同一集群的所有節(jié)點(diǎn)應(yīng)設(shè)置一致的值。
    virtual_router_id 216
    # 組播信息發(fā)送時(shí)間間隔。同一集群的所有節(jié)點(diǎn)必須設(shè)置一樣,默認(rèn)為1秒。
    advert_int 1
    # 設(shè)置驗(yàn)證信息。同一集群的所有節(jié)點(diǎn)必須一致
    authentication {
        # 指定認(rèn)證方式。PASS 表示簡(jiǎn)單密碼認(rèn)證(推薦);AH:IPSEC認(rèn)證(不推薦)。
        auth_type PASS
        # 指定認(rèn)證所使用的密碼,最多8位。
        auth_pass 1111
    }

    # 聲明調(diào)用已定義的 vrrp_script 腳本。
    track_script {
        chk_nginx
    }

    # 定義虛擬 IP 地址。
    virtual_ipaddress {
        192.168.216.130
    }
}
# 定義對(duì)外提供服務(wù) LVS (負(fù)載均衡)的 VIP 和 端口(當(dāng)端口號(hào)設(shè)置為【0】時(shí),表示所有端口),只實(shí)現(xiàn)高可用時(shí)可不配置。
# 注意:本方案中,通過(guò) Nginx 實(shí)現(xiàn) Web 負(fù)載均衡,Keepalived 只實(shí)現(xiàn)高可用,因此負(fù)載均衡既可以不配置,也可以配置成 Nginx 的負(fù)載均衡;當(dāng)沒(méi)有 Ngxin 時(shí),可以直接配置成 Web 的負(fù)載均衡。
virtual_server 192.168.216.130 80 {  
    # 設(shè)置健康檢查時(shí)間,單位是秒
    delay_loop 6 
    #負(fù)載均衡調(diào)度算法
    lb_algo rr
    # 設(shè)置LVS實(shí)現(xiàn)負(fù)載的機(jī)制,有NAT、TUN、DR三個(gè)模式    
    lb_kind DR
    # VIP 子網(wǎng)掩碼
    nat_mask 255.255.255.0
    # 會(huì)話保持時(shí)間,一定時(shí)間之內(nèi)用戶無(wú)響應(yīng)則下一次用戶請(qǐng)求時(shí)需重新路由,一般設(shè)為0,表示不需要    
    persistence_timeout 0
    # 網(wǎng)絡(luò)協(xié)議
    protocol TCP
    # 定義后端 RealServer 的真實(shí)服務(wù)器屬性,IP 地址和端口(當(dāng)端口號(hào)設(shè)置為【0】時(shí),表示所有端口)
    real_server 192.168.216.128 80 { 
        # 配置節(jié)點(diǎn)權(quán)值,數(shù)字越大權(quán)重越高 
        weight 1
        TCP_CHECK {  
            connect_timeout 10         
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 80  
        }  
    }  
    real_server 192.168.216.129 80 {
        weight 1
        TCP_CHECK {  
            connect_timeout 10  
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 80  
        }  
    }  
}

初始化的主節(jié)點(diǎn)和備節(jié)點(diǎn)的區(qū)別體現(xiàn)在以下參數(shù)中:

  • 初始主節(jié)點(diǎn)
vrrp_instance VI_1 {
    # 必須設(shè)置為 MASTER 。
    state MASTER
    # 必須設(shè)置為最大值。
    priority 100
}
  • 初始備節(jié)點(diǎn)
vrrp_instance VI_1 {
    # 必須設(shè)置為 BACKUP 。
    state BACKUP
    # 必須設(shè)置為小于主節(jié)點(diǎn)的值。
    priority 90
}

4、創(chuàng)建或編輯 Nginx 檢測(cè)腳本文件。文件路徑對(duì)應(yīng)配置文件中 vrrp_script 的 script 設(shè)置值。

使用文本編輯器創(chuàng)建腳本文件:

[centos@Proxy-1 ~ ]$ sudo gedit /etc/keepalived/nginx_check.sh

在腳本文件中編寫以下內(nèi)容并保存:

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        killall -9 keepalived
    fi
fi

給腳本文件增加可執(zhí)行權(quán)限:

[centos@Proxy-1 ~ ]$ sudo chmod 755 /etc/keepalived/nginx_check.sh

5、配置 Keepalived 系統(tǒng)服務(wù)。

使用文本編輯器創(chuàng)建配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /usr/lib/systemd/system/keepalived.service

驗(yàn)證或修改文件內(nèi)容并保存如下:

[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target nginx.service
Wants=network-online.target
Requires=nginx.service

[Service]
Type=forking
User=root
Group=root
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

重新加載系統(tǒng)服務(wù)管理器:

[centos@Proxy-1 ~ ]$ sudo systemctl daemon-reload

6、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"112"端口(Keepalived 默認(rèn)端口)訪問(wèn)服務(wù)器。

[centos@Proxy-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=112/tcp --permanent
[centos@Proxy-1 ~ ]$ sudo firewall-cmd --reload

7、啟動(dòng)/重啟 Keepalived 服務(wù)(不建議設(shè)置為開(kāi)機(jī)自啟動(dòng))。

啟動(dòng) Keepalived 服務(wù)之前,應(yīng)確保已正確啟動(dòng)了各節(jié)點(diǎn)的 Nginx 服務(wù)。各節(jié)點(diǎn)的啟動(dòng)或重啟的順序?yàn)椋孩?啟動(dòng) Keepalived 主節(jié)點(diǎn);② 依次啟動(dòng) Keepalived 備節(jié)點(diǎn)。

[centos@Proxy-1 ~ ]$ sudo systemctl restart keepalived.service

8、啟動(dòng) Keepalived 可能因?yàn)楦鞣N未知的原因失敗,主要是由于引發(fā)了 SELinux 異常。有關(guān)如何解決 SELinux 引起的異常,請(qǐng)閱讀文章《RedHat/CentOS8【SELinux】引起的安全策略問(wèn)題解決方案》,文章地址【http://www.itdecent.cn/p/a13f974f8bae】。

注意:其他 "Proxy 集群節(jié)點(diǎn)" 全部需要按照以上步驟配置。

8、使用瀏覽器通過(guò)虛擬 IP 訪問(wèn) Web 代理服務(wù)。

通過(guò)虛擬 IP 訪問(wèn) Web 代理服務(wù)


附錄一 Nginx 配置文件詳解

位于程序配置目錄 "/usr/local/nginx/conf" 下的 "nginx.conf" 是 Nginx 的主配置文件。主配置文件的參數(shù)包括:

#定義Nginx運(yùn)行的用戶和用戶組
user root root;

#nginx進(jìn)程數(shù),建議設(shè)置為等于CPU總核心數(shù)。
worker_processes 8;

#全局錯(cuò)誤日志定義類型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#進(jìn)程文件
pid /var/run/nginx.pid;

#一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述符數(shù)目,理論值應(yīng)該是最多打開(kāi)文件數(shù)(系統(tǒng)的值ulimit -n)與nginx進(jìn)程數(shù)相除,但是nginx分配請(qǐng)求并不均勻,所以建議與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式與連接數(shù)上限
events{
#參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本內(nèi)核中的高性能網(wǎng)絡(luò)I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#單個(gè)進(jìn)程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進(jìn)程數(shù))
worker_connections 65535;
}

#四層負(fù)載均衡(以 MySQL 為例)
stream{
    upstream mysql {
        server 192.168.80.121:3306 weight=1;
        server 192.168.80.122:3306 weight=2;
        server 192.168.80.123:3306 weight=3;
    }

    server {
        #監(jiān)聽(tīng)端口
        listen 3306;
        proxy_pass mysql;
    }
}

#設(shè)定http服務(wù)器
http{
    include mime.types; #文件擴(kuò)展名與文件類型映射表
    default_type application/octet-stream; #默認(rèn)文件類型
    charset utf-8; #默認(rèn)編碼
    server_names_hash_bucket_size 128; #服務(wù)器名字的hash表大小
    client_header_buffer_size 32k; #上傳文件大小限制
    large_client_header_buffers 4 64k; #設(shè)定請(qǐng)求緩
    client_max_body_size 8m; #設(shè)定請(qǐng)求緩
    #開(kāi)啟高效文件傳輸模式,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來(lái)輸出文件,對(duì)于普通應(yīng)用設(shè)為 on,如果用來(lái)進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負(fù)載。注意:如果圖片顯示不正常把這個(gè)改成off。
    sendfile on; 
    autoindex on; #開(kāi)啟目錄列表訪問(wèn),合適下載服務(wù)器,默認(rèn)關(guān)閉。
    tcp_nopush on; #防止網(wǎng)絡(luò)阻塞
    tcp_nodelay on; #防止網(wǎng)絡(luò)阻塞
    keepalive_timeout 120; #長(zhǎng)連接超時(shí)時(shí)間,單位是秒

    #FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用,提高訪問(wèn)速度。下面參數(shù)看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模塊設(shè)置
    gzip on; #開(kāi)啟gzip壓縮輸出
    gzip_min_length 1k; #最小壓縮文件大小
    gzip_buffers 4 16k; #壓縮緩沖區(qū)
    gzip_http_version 1.0; #壓縮版本(默認(rèn)1.1,前端如果是squid2.5請(qǐng)使用1.0)
    gzip_comp_level 2; #壓縮等級(jí)
    gzip_types text/plain application/x-javascript text/css application/xml;
    #壓縮類型,默認(rèn)就已經(jīng)包含text/html,所以下面就不用再寫了,寫上去也不會(huì)有問(wèn)題,但是會(huì)有一個(gè)warn。
    gzip_vary on;
    #limit_zone crawler $binary_remote_addr 10m; #開(kāi)啟限制IP連接數(shù)的時(shí)候需要使用

    #upstream的動(dòng)態(tài)負(fù)載均衡,weight是權(quán)重,可以根據(jù)機(jī)器配置定義權(quán)重。weigth參數(shù)表示權(quán)值,權(quán)值越高被分配到的幾率越大。
    upstream www.example.com {
        server 192.168.80.121:80 weight=1;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;
    }

    #虛擬主機(jī)的配置
    server {
        #監(jiān)聽(tīng)端口
        listen 80;
        #域名可以有多個(gè),用空格隔開(kāi)
        server_name www.example.com example.com;
        #設(shè)置默認(rèn)主頁(yè)
        index index.html index.htm index.php;
        #所有靜態(tài)文件直接訪問(wèn)的物理磁盤的位置
        root /data/www/example;
        location ~ .*\.(php|php5)?${
            fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          include fastcgi.conf;
        }
        #圖片緩存時(shí)間設(shè)置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
            expires 10d;
        }
        #JS和CSS緩存時(shí)間設(shè)置
        location ~ .*\.(js|css)?${
          expires 1h;
        }
        #日志格式設(shè)定
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
        #定義本虛擬主機(jī)的訪問(wèn)日志
        access_log /var/log/nginx/ha97access.log access;

        #對(duì) "/" 啟用反向代理
        location / {
            proxy_pass www.example.com # http://127.0.0.1:80;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服務(wù)器可以通過(guò)X-Forwarded-For獲取用戶真實(shí)IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #以下是一些反向代理的配置,可選。
            proxy_set_header Host $host;
            client_max_body_size 10m; #允許客戶端請(qǐng)求的最大單文件字節(jié)數(shù)
            client_body_buffer_size 128k; #緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù),
            proxy_connect_timeout 90; #nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
            proxy_send_timeout 90; #后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí))
            proxy_read_timeout 90; #連接成功后,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
            proxy_buffer_size 4k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
            proxy_buffers 4 32k; #proxy_buffers緩沖區(qū),網(wǎng)頁(yè)平均在32k以下的設(shè)置
            proxy_busy_buffers_size 64k; #高負(fù)荷下緩沖大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;
            #設(shè)定緩存文件夾大小,大于這個(gè)值,將從upstream服務(wù)器傳
        }

        #設(shè)定查看Nginx狀態(tài)的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd文件的內(nèi)容可以用apache提供的htpasswd工具來(lái)產(chǎn)生。
        }

        #本地動(dòng)靜分離反向代理配置
        #所有jsp的頁(yè)面均交由tomcat或resin處理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
        #所有靜態(tài)文件由nginx直接讀取不經(jīng)過(guò)tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        { 
            expires 15d;
        }
        location ~ .*.(js|css)?$
        { 
             expires 1h; 
        }
    }
}

說(shuō)明:

1、"server" 包含多個(gè) "location","location" 屬性用于匹配 uri,語(yǔ)法:

location [ = | ~ | ~* | ^~] uri {
...
}
  • 【=】表示精確匹配路徑,用于不含正則表達(dá)式的 uri 前,如果匹配成功,不再進(jìn)行后續(xù)的查找;
  • 【^~】表示如果該符號(hào)后面的字符是最佳匹配,用于不含正則表達(dá)式的 uri 前綴,如果匹配成功,不再進(jìn)行后續(xù)的查找;
  • 【~】表示用該符號(hào)后面的正則去匹配路徑,區(qū)分大小寫;
  • 【~*】表示用該符號(hào)后面的正則去匹配路徑,不區(qū)分大小寫。跟 ~ 優(yōu)先級(jí)都比較低,如有多個(gè) "location" 的正則能匹配的話,則使用正則表達(dá)式最長(zhǎng)的那個(gè)。
  • 如果 uri 包含正則表達(dá)式,則必須要有 ~ 或 ~* 標(biāo)志。

2、Nginx 預(yù)定義了一些全局變量,可以在配置的任何位置使用它們,如下表:

變量名 功能說(shuō)明
$host 請(qǐng)求信息中的 Host,如果請(qǐng)求中沒(méi)有 Host 行,則等于設(shè)置的服務(wù)器名,不包含端口
$request_method 客戶端請(qǐng)求類型,如 GET、POST
$remote_addr 客戶端的 IP 地址
$args 請(qǐng)求中的參數(shù)
$arg_PARAMETER GET 請(qǐng)求中變量名 PARAMETER 參數(shù)的值,例如:$http_user_agent(Uaer-Agent 值)
$content_length 請(qǐng)求頭中的 Content-length 字段
$http_user_agent 客戶端agent信息
$http_cookie 客戶端 cookie 信息
$remote_addr 客戶端的 IP 地址
$remote_port 客戶端的端口
$server_protocol 請(qǐng)求使用的協(xié)議,如 HTTP/1.0、HTTP/1.1
$server_addr 服務(wù)器 IP 地址
$server_name 服務(wù)器名稱
$server_port 服務(wù)器的端口號(hào)
$scheme HTTP 方法(如http,https)

其他預(yù)定義變量可在互聯(lián)網(wǎng)上查詢學(xué)習(xí)。


附錄二 Nginx 配置虛擬主機(jī)頭

使用文本編輯器打開(kāi)配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或驗(yàn)證文件中的以下參數(shù)并保存:

http {
    server {
        # 監(jiān)聽(tīng)端口
        listen       80;
        # 服務(wù)器域名(主機(jī)頭)
        server_name  www.web1.net;
        # 代理 Web 服務(wù)的 Url 前綴,一般是 Web 服務(wù)的虛擬目錄(可以是正則表達(dá)式)。
        location / {
            proxy_pass http://127.0.0.1:81;
        }
    }
    server {
        # 監(jiān)聽(tīng)端口
        listen       80;
        # 服務(wù)器域名(主機(jī)頭)
        server_name  www.web2.net;
        # 代理 Web 服務(wù)的 Url 前綴,一般是 Web 服務(wù)的虛擬目錄(可以是正則表達(dá)式)。
        location / {
            proxy_pass http://127.0.0.1:82;
        }
    }
}

注意:

  • 兩個(gè) "server" 使用 "server_name" 定義的主機(jī)頭來(lái)區(qū)分。 客戶端在訪問(wèn)時(shí),只能通過(guò)主機(jī)頭定義的域名訪問(wèn)(如:http://www.web1.net 或者 http://www.web1.net)??蛻舳诵枰诒镜?DNS 文件(/etc/hosts)中定義域名解析記錄,或者在網(wǎng)卡中設(shè)置能夠解析主機(jī)頭的私有 DNS 服務(wù)器。
  • 如果客戶端通過(guò) IP 地址訪問(wèn)(如:http://192.168.216.128 ),則等同于使用最后一個(gè) "server" 的配置(本例中為: "server_name" 為 "www.web2.net" 的 "server")。

2、重新啟動(dòng) Nginx 服務(wù)。

[centos@host ~ ]$ sudo systemctl restart nginx.service

附錄三 擴(kuò)展 Nginx 客戶端身份認(rèn)證

1、安裝 httpd-tools 。

[centos@host ~ ]$ sudo dnf install httpd-tools

2、創(chuàng)建賬戶/口令數(shù)據(jù)文件。

[centos@host ~ ]$ sudo htpasswd -bc /usr/local/nginx/conf/auth.db root password

指令格式為:htpasswd -b[c] <數(shù)據(jù)文件位置> <賬號(hào)> <口令>。參數(shù) b 表示創(chuàng)建一組賬號(hào)/口令,參數(shù) c 表示創(chuàng)建數(shù)據(jù)文件。

3、設(shè)置 Nginx 配置文件參數(shù)。

使用文本編輯器打開(kāi)配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或驗(yàn)證文件中的以下參數(shù)并保存:

http {
    server {
        ......
        location / {
            ......
            auth_basic "input password";
            auth_basic_user_file /usr/local/nginx/conf/auth.db;
        }
    }
}

4、重新啟動(dòng) Nginx 服務(wù)。

[centos@host ~ ]$ sudo systemctl restart nginx.service

附錄四 擴(kuò)展 Nginx 跨域訪問(wèn)

1、設(shè)置 Nginx 配置文件參數(shù)。

使用文本編輯器打開(kāi)配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或驗(yàn)證文件中的以下參數(shù)并保存:

http {
    server {
        ......
        # 全局變量獲得當(dāng)前請(qǐng)求origin,帶cookie的請(qǐng)求不支持 "*" 。
        add_header 'Access-Control-Allow-Origin' $http_origin;
        # 設(shè)置為 "true" 表示傳遞 cookie 。
        add_header 'Access-Control-Allow-Credentials' 'true';
        # 允許跨域請(qǐng)求的方法。
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
        # 允許請(qǐng)求的 header,可以為 "*" 。
        add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers; 
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

        if ($request_method = 'OPTIONS') {
            # OPTIONS 請(qǐng)求的有效期,在有效期內(nèi)不用發(fā)出另一條預(yù)檢請(qǐng)求
            add_header 'Access-Control-Max-Age' 1728000;   
            add_header 'Content-Type' 'text/plain; charset=utf-8';
            add_header 'Content-Length' 0;
    
            return 204; 
        }
        
        location / {
            ......
        }
    }
}

2、重新啟動(dòng) Nginx 服務(wù)。

[centos@host ~ ]$ sudo systemctl restart nginx.service

附錄五 擴(kuò)展 Nginx 網(wǎng)頁(yè)壓縮

1、設(shè)置 Nginx 配置文件參數(shù)。

使用文本編輯器打開(kāi)配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或驗(yàn)證文件中的以下參數(shù)并保存:

http {
    server {
        ......
        # 是否開(kāi)啟 gzip , on 表示開(kāi)啟,off 表示禁用。默認(rèn)off。
        gzip on;
        # 壓縮 MIME 文件的類型,其中 text/html 被系統(tǒng)強(qiáng)制啟用。
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        location / {
            ......
        }
    }
}

2、重新啟動(dòng) Nginx 服務(wù)。

[centos@host ~ ]$ sudo systemctl restart nginx.service

附錄六 Nginx 四層網(wǎng)絡(luò)協(xié)議負(fù)載均衡

1、設(shè)置 Nginx 配置文件參數(shù)。

使用文本編輯器打開(kāi)配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或驗(yàn)證文件中的以下參數(shù)并保存:

#四層負(fù)載均衡(以 MySQL 為例)
stream{
    upstream mysql {
        server 192.168.80.121:3306 weight=1;
        server 192.168.80.122:3306 weight=2;
        server 192.168.80.123:3306 weight=3;
    }

    server {
        #監(jiān)聽(tīng)端口
        listen 3306;
        proxy_pass mysql;
    }
}

2、重新啟動(dòng) Nginx 服務(wù)。

[centos@host ~ ]$ sudo systemctl restart nginx.service

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容