使用Nginx實現(xiàn)反向代理、配置負載均衡詳解
1. Nginx 概述
1.1 Nginx 介紹
Nginx 是一款輕量級的 Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器。其特點是占有內(nèi)存少,并發(fā)能力強,實際上 Nginx 的并發(fā)能力在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好,國內(nèi)使用 Nginx 的網(wǎng)站有:百度、京東、淘寶、騰訊等。
Nginx 官網(wǎng):https://nginx.org/
1.2 Nginx 下載和安裝
Nginx 官網(wǎng)下載地址:https://nginx.org/en/download.html
Linux 安裝 Nginx 過程:
安裝依賴包
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
下載 Nginx 安裝包
wget https://nginx.org/download/nginx-1.16.1.tar.gz # 如果未安裝 wget 命令,則可以通過以下命令進行安裝 yum install wget
解壓
tar -zxvf nginx-1.16.1.tar.gz
配置 Nginx 安裝目錄為 /usr/local/nginx
# 先創(chuàng)建安裝的目錄 mkdir -p /usr/local/nginx # 配置安裝目錄 cd nginx-1.16.1 ./configure --prefix=/usr/local/nginx
如果不配置安裝的路徑,那么安裝后可執(zhí)行文件默認存放在 /usr/local/bin,庫文件默認存放在 /usr/local/lib,配置文件默認存放在 /usr/local/etc,其他的資源文件存放在 /usr/local/share。
編譯和安裝 Nginx
make && make install
通過以上步驟,Nginx 就已經(jīng)安裝好了,切換到其安裝目錄我們就能看到以下幾個目錄

1.3 Nginx 目錄結(jié)構(gòu)
安裝完 Nginx 后,我們就能看到以下幾個目錄:
| 目錄 | 說明 |
|---|---|
| conf | 存放配置文件 |
| html | 存放靜態(tài)文件(html、css、js) |
| logs | 存放日志文件 |
| sbin | 存放腳本文件 |
在這些目錄中還有幾個重要的文件:
| 文件 | 說明 |
|---|---|
| conf/nginx.conf | Nginx 配置文件 |
| sbin/nginx | 二進制文件,用于啟動、停止 Nginx 服務(wù) |
Nginx 目錄和文件總覽:

2. Nginx 命令
| 命令 | 說明 |
|---|---|
| ./nginx -v | 查看 Nginx 版本 |
| ./nginx -t | 檢查配置文件正確性 |
| ./nginx | 啟動 Nginx 服務(wù) |
| ./nginx -s stop | 停止 Nginx 服務(wù) |
| ./nginx -s reload | 重新加載配置文件(當修改 Nginx 配置文件后,需要重新加載才能生效) |
以上命令都需要進入 Nginx 的安裝目錄的 sbin 目錄才能執(zhí)行,因此執(zhí)行這些命令的時候其實是有點麻煩的。
為了解決這個問題,能夠在任何路徑都能執(zhí)行這些命令,可以將 Nginx 的二進制文件的路徑配置到系統(tǒng)的環(huán)境變量中。
配置方式:
進入 /etc/profile 文件進行編輯
vim /etc/profile
在 Path 變量后面追加 nginx 的 sbin 路徑

讓修改后的 /etc/profile 立即生效
source /etc/profile
3. Nginx 配置文件結(jié)構(gòu)
Nginx 配置文件(conf/nginx.conf)整體分為三部分:
全局塊:和 Nginx 運行相關(guān)的全局配置

events 塊:和網(wǎng)絡(luò)連接相關(guān)的配置

http 塊:代理、緩存、日志記錄、虛擬主機配置
- http 全局塊

- server 塊

- server 塊又可以分成 server 全局塊和 location 塊。
- 注意:http 中可以配置多個 server 塊,每個 server 塊又可以配置多個 location 塊。
4. Nginx 具體應(yīng)用
4.1 部署靜態(tài)資源
Nginx 可以作為靜態(tài) web 服務(wù)器來部署靜態(tài)資源。靜態(tài)資源指在服務(wù)端真實存在并且能夠直接展示的一些文件,比如 html、css、hs、圖片、視頻等資源。
相對于 Tomcat,Nginx 處理靜態(tài)資源的能力更加高效,所以在生產(chǎn)環(huán)境下,一般都會將靜態(tài)資源部署到 Nginx 中。將靜態(tài)資源部署到 Nginx 非常簡單,只需要將文件復(fù)制到 Nginx 安裝目錄的 html 目錄即可。
除此之外,如果有需要還可以對 Nginx 的配置文件的 http 塊的 server 塊的參數(shù)進行指定的修改,參數(shù)說明如下:

4.2 反向代理
4.2.1 介紹
代理就像是我們?nèi)ベ徺I海外的東西,找了個中間人幫我們?nèi)ベI物品并且?guī)Я嘶貋怼?/p>
從系統(tǒng)的角度來說,直接訪問就是瀏覽器的請求直接到了最終的服務(wù)器,中間沒有經(jīng)過任何的代理服務(wù)器,否則就是通過了代理的形式去訪問了服務(wù)器。
代理(proxy)又分為正向代理(forward proxy)和反向代理(reverse proxy)。
正向代理(forward proxy):
是一個位于客戶端和原始服務(wù)器之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個請求并指定目標(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端。
一個正向代理服務(wù)器并沒有直接響應(yīng)請求的能力,就像商店不生產(chǎn)方便面一樣,它不過是把請求轉(zhuǎn)發(fā)到最終的網(wǎng)頁服務(wù)器上,再把后者的響應(yīng)再轉(zhuǎn)發(fā)給請求者。
- 那么瀏覽器只知道最終瀏覽器的地址,但是如何知道代理服務(wù)器在哪呢?
- 這個需要我們主動的告訴瀏覽器,即主動配置代理服務(wù)器。
正向代理的典型用途是為在防火墻內(nèi)的局域網(wǎng)客戶端提供訪問 Internet 的途徑。
反向代理(reverse proxy):
反向代理服務(wù)器位于用戶于目標服務(wù)器之間,但是對于用戶而言,反向代理服務(wù)器就相當于目標服務(wù)器,即用戶直接訪問反向代理服務(wù)器就可以獲得目標服務(wù)器的資源,反向代理服務(wù)器負責(zé)將請求轉(zhuǎn)發(fā)給目標服務(wù)器。
用戶不需要知道目標服務(wù)器的地址,也無須在用戶端做任何設(shè)定。
反向代理與正向代理的一個很大區(qū)別就是,它不需要客戶端去做什么配置,并沒有什么配置代理服務(wù)器的操作。
如果說正向代理是主動配置,主動走代理,那么反向代理則是”被代理“。從這點上看,反向代理有時又稱為“透明代理”,也即是瀏覽器都不知道自己被代理了,瀏覽器以為發(fā)給它響應(yīng)的就是最終的網(wǎng)頁服務(wù)器,其實不過是個“代理”。

4.2.2 配置反向代理
配置反向代理只需要修改 nginx.conf 配置文件即可,需要配置的參數(shù)如下:
server {
listen 81; # 監(jiān)聽端口
server_name localhost; # 服務(wù)器名稱
location / {
proxy_pass http://目標服務(wù)器IP:端口號; #反向代理配置,將請求轉(zhuǎn)發(fā)到指定服務(wù)
}
}
配置后記得重新加載配置文件。
4.3 負載均衡
4.3.1 介紹
早期的網(wǎng)站流量和業(yè)務(wù)功能都比較簡單,單臺服務(wù)器就可以滿足基本需求,但是隨著互連網(wǎng)的發(fā)展,業(yè)務(wù)流量越來越大并且業(yè)務(wù)邏輯也越來越復(fù)雜,單臺服務(wù)器的性能及單點故障問題就凸顯出來了,因此需要多臺服務(wù)器組成應(yīng)用集群,進行性能的水平擴展以及避免單點故障出現(xiàn)。
- 應(yīng)用集群:將同一應(yīng)用部署到多臺機器上,組成應(yīng)用集群,接收負載均衡器分發(fā)的請求,進行業(yè)務(wù)處理并響應(yīng)返回數(shù)據(jù)。
- 負載均衡器:將用戶請求根據(jù)對應(yīng)的負載均衡算法分發(fā)到應(yīng)用集群中的一臺服務(wù)器進行處理。

4.3.2 配置負載均衡
配置負載均衡只需要修改 nginx.conf 配置文件即可,需要配置的參數(shù)如下:
upstream targetserver { # upstream 指令可以定義一組服務(wù)器
server 服務(wù)器1IP:端口號;
server 服務(wù)器2IP:端口號;
}
server {
listen 8080; # 監(jiān)聽端口
server_name localhost; # 服務(wù)器名稱
location / {
proxy_pass http://targetserver; # 請求轉(zhuǎn)發(fā)的一組服務(wù)器的名稱
}
}
配置后記得重新加載配置文件。
4.3.3 負載均衡策略
| 名稱 | 說明 |
|---|---|
| 輪詢 | 默認方式 |
| weight | 權(quán)重方式,權(quán)重越大分配的機率越高 |
| ip_hash | 依據(jù) ip 分配方式 |
| least_conn | 依據(jù)最少連接方式 |
| url_hash | 依據(jù) url 分配方式 |
| fair | 依據(jù)響應(yīng)時間方式 |
輪詢:默認方式,當刷新瀏覽器時,會發(fā)現(xiàn)目標服務(wù)器是被輪流著訪問。
upstream targetserver { # upstream 指令可以定義一組服務(wù)器
server 服務(wù)器1IP:端口號;
server 服務(wù)器2IP:端口號;
}
weight:通過分配權(quán)重的方式,權(quán)重越大分配的機率越高。
upstream targetserver { # upstream 指令可以定義一組服務(wù)器
server 服務(wù)器1IP:端口號 weight=10;
server 服務(wù)器2IP:端口號 weight=5;
}
ip_hash:通過客戶端的 ip 地址經(jīng)過哈希算法來分配到一個服務(wù)器上,之后同一個 ip 訪問時都會固定的訪問一個服務(wù)器。
通過 ip_hash 能夠解決 Session 丟失的問題,即用戶第一次在A服務(wù)器登陸后,如果下次請求訪問到B服務(wù)器的話,那么登錄信息則會丟失。
upstream targetserver { # upstream 指令可以定義一組服務(wù)器
ip_hash;
server 服務(wù)器1IP:端口號;
server 服務(wù)器2IP:端口號;
}
least_conn:分配服務(wù)器中最少連接的那個。
upstream targetserver { # upstream 指令可以定義一組服務(wù)器
least_conn;
server 服務(wù)器1IP:端口號;
server 服務(wù)器2IP:端口號;
}
url_hash:按照訪問的 url 經(jīng)過哈希算法來分配到一個服務(wù)器上,之后同一個 url 訪問都會訪問到固定的一個服務(wù)器。
適合后端服務(wù)器作為緩存時使用。
upstream targetserver { # upstream 指令可以定義一組服務(wù)器
hash $request_uri;
hash_methond cr32; # hash 算法
server 服務(wù)器1IP:端口號;
server 服務(wù)器2IP:端口號;
}
fair:根據(jù)后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的分配優(yōu)先。
upstream targetserver { # upstream 指令可以定義一組服務(wù)器
fair;
server 服務(wù)器1IP:端口號;
server 服務(wù)器2IP:端口號;
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx通過nginx-rtmp-module模塊搭建流媒體服務(wù)器實現(xiàn)直播
近日有客戶咨詢想用Nginx搭建流媒體服務(wù)器實現(xiàn)直播,方便他們打造自己的平臺,經(jīng)過各種測試發(fā)現(xiàn)如下文章不錯,特分享給需要的朋友2023-10-10
針對OpenSSL安全漏洞調(diào)整Nginx服務(wù)器的方法
這篇文章主要介紹了針對OpenSSL漏洞調(diào)整Nginx服務(wù)器的方法,2014年爆出的SSL安全漏洞震驚了全世界,需要的朋友可以參考下2015-06-06

