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

網(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 應(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 包到用戶主目錄中。

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ù)。

附錄一 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