說(shuō)到 大名鼎鼎的 Nginx, 大家肯定都不陌生,不管是做運(yùn)維,做開發(fā),還是做網(wǎng)絡(luò)的都應(yīng)該對(duì)他很熟悉。Nginx的功能很多,很強(qiáng)大,今天我主要是分享一下 Nginx 反向代理的常見用法。
什么是反向代理?
舉個(gè)例子:
比如用戶去訪問(wèn)百度,用戶在瀏覽器輸入www.baidu.com時(shí),對(duì)于百度來(lái)說(shuō),瀏覽器就是客戶端。
客戶端將請(qǐng)求發(fā)送到百度的代理服務(wù)器,由代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后,在返回給客戶端。
這樣做有三個(gè)好處:
1、隱藏了目標(biāo)服務(wù)器IP地址,暴露出去的只是代理服務(wù)器
2、訪問(wèn)量很大的時(shí)候可以輕松擴(kuò)容,目標(biāo)服務(wù)器可以有很多個(gè)
3、客戶端對(duì)代理是無(wú)感知的,客戶端不需要任何配置就可以訪問(wèn)
看下面這張圖 可能更直觀一些
現(xiàn)在來(lái)看一些Nginx 反向代理的實(shí)戰(zhàn)用法:
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; 這個(gè)參數(shù)很重要
# 因?yàn)镹ginx對(duì)HTTP的反向代理,默認(rèn)使用HTTP 1.0連接到后端,那樣沒法保持長(zhǎng)連接,后端作出HTTP響應(yīng)后,連接就斷了,而websocket是長(zhǎng)連接,所以啟用HTTP 1.1以支持長(zhǎng)連接
2、nginx 七層 反向代理
# 七層就是應(yīng)用層
例子1: 經(jīng)典的LNMP
#在nginx 中添加如下配置:
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
# 表示把以php 結(jié)尾的請(qǐng)求都轉(zhuǎn)發(fā)到 127.0.0.1:9000 即 我設(shè)置的php-fpm 默認(rèn)端口
例子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 可以包含傳輸協(xié)議、主機(jī)名稱或IP地址加端口號(hào),URI等
# http://127.0.0.1:9901/$1 這里的 $1 就是我通過(guò)接口傳進(jìn)來(lái)的參數(shù)
3、nginx 四層反向代理
# 四層是網(wǎng)絡(luò)層,
例子:允許某個(gè)IP 可以連接內(nèi)網(wǎng)的MySQL 數(shù)據(jù)庫(kù)
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;#設(shè)置客戶端和代理服務(wù)之間的超時(shí)時(shí)間,如果15分鐘內(nèi)沒操作將自動(dòng)斷開。
proxy_pass mysqldb;
}
}
#注意,需要nginx 有 stream模塊,在編譯的過(guò)程中加參數(shù) --with-stream
nginx 反代的用法挺多的,我只是列舉出我覺得最實(shí)用的幾種,如果有錯(cuò)誤的地方請(qǐng)指出來(lái),大家共同學(xué)習(xí)。