說到 大名鼎鼎的 Nginx, 大家肯定都不陌生,不管是做運維,做開發,還是做網絡的都應該對他很熟悉。Nginx的功能很多,很強大,今天我主要是分享一下 Nginx 反向代理的常見用法。
什么是反向代理?
舉個例子:
比如用戶去訪問百度,用戶在瀏覽器輸入www.baidu.com時,對于百度來說,瀏覽器就是客戶端。
客戶端將請求發送到百度的代理服務器,由代理服務器去選擇目標服務器獲取數據后,在返回給客戶端。
這樣做有三個好處:
1、隱藏了目標服務器IP地址,暴露出去的只是代理服務器
2、訪問量很大的時候可以輕松擴容,目標服務器可以有很多個
3、客戶端對代理是無感知的,客戶端不需要任何配置就可以訪問
看下面這張圖 可能更直觀一些

現在來看一些Nginx 反向代理的實戰用法:
1、Nginx 反代 websocket
server {
listen 80;
server_name XXXXX;
location / {
proxy_pass http://192.168.10.100:9504;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# 這里需要注意的是 proxy_http_version 1.1; 這個參數很重要
# 因為Nginx對HTTP的反向代理,默認使用HTTP 1.0連接到后端,那樣沒法保持長連接,后端作出HTTP響應后,連接就斷了,而websocket是長連接,所以啟用HTTP 1.1以支持長連接
2、nginx 七層 反向代理
# 七層就是應用層
例子1: 經典的LNMP
#在nginx 中添加如下配置:
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
# 表示把以php 結尾的請求都轉發到 127.0.0.1:9000 即 我設置的php-fpm 默認端口
例子2: 傳參式
location ~ ^/api/(.*)$ {
proxy_pass http://127.0.0.1:9901/$1;
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 可以包含傳輸協議、主機名稱或IP地址加端口號,URI等
# http://127.0.0.1:9901/$1 這里的 $1 就是我通過接口傳進來的參數
3、nginx 四層反向代理
# 四層是網絡層,
例子:允許某個IP 可以連接內網的MySQL 數據庫
stream {
upstream mysqldb {
hash $remote_addr consistent;
# $binary_remote_addr;
server 172.18.1.101:3306;
}
server {
listen 3306;
allow x.x.x.0/24;
deny all;
proxy_connect_timeout 10s;
proxy_timeout 900s;#設置客戶端和代理服務之間的超時時間,如果15分鐘內沒操作將自動斷開。
proxy_pass mysqldb;
}
}
#注意,需要nginx 有 stream模塊,在編譯的過程中加參數 --with-stream
nginx 反代的用法挺多的,我只是列舉出我覺得最實用的幾種,如果有錯誤的地方請指出來,大家共同學習。