0. 反向代理和正向代理
先上圖:
正向代理是針對client的,client發(fā)出的請求會經(jīng)過代理服務器,然后到達外面的internet,通過這樣來交流.
反向代理是針對server的,當代理服務器獲取到請求時,根據(jù)配置再分發(fā)給相應的server來處理.
負載均衡就是一種反向代理
1. 反向代理實例
代理的是Node.js服務器:
http {
upstream node_app {
server 127.0.0.1:3000; # 具體的地址
}
server {
listen *:80;
root /path/to/application/public; # 根目錄
location / { # 請求入口
try_files $uri $uri/index.html @node; # 從左到右try
}
location @node { # named location
proxy_pass http://node_app; # 傳遞到node_app
}
}
}
這個是nginx的配置,通過這個配置,nginx代理服務器運行后,接收到請求后會通過判斷進入127.0.0.1:3000
這個端口,而這個端口應該是node.js服務器監(jiān)聽的端口,這樣就代理過來了.
2. 自定義錯誤頁面
使用error_page
指令:
server {
listen *:80;
root /path/to/application/public;
location / {
error_page 404 /404.html; # 自定義 404頁面
error_page 500 502 503 504 /50x.html; # 自定義50x頁面
try_files $uri $uri/index.html @rails;
}
location @rails {
proxy_pass http://rails_app;
}
}
error_page
還可以做其他的:
location / {
error_page 500 =200 /index.html; # 改變狀態(tài)碼
error_page 500 http://www.google.com; # 轉向外部的網(wǎng)站
error_page 404 = @fallback; # 轉向內部的@fallback
}
location @fallback {
proxy_pass http://different_backend;
}
3. 添加header
反向代理的機制是重新打開一個新的連接到后端服務器,并且這個連接包含客戶端請求數(shù)據(jù).
新的連接只帶數(shù)據(jù)不帶header(協(xié)議,域名等).
3.1 添加請求協(xié)議
下面使用proxy_set_header
指令和$scheme
變量來設置:
server {
listen *:80;
root /path/to/application/public;
location / {
try_files $uri $uri/index.html @rails;
}
location @rails {
proxy_set_header X-Forwarded-Proto $scheme; # $scheme變量包含的是客戶端請求的協(xié)議http或https這些.
proxy_pass http://rails_app;
}
}
proxy_set_header
指令需要跟一個header,這個通常用X-Forwarded-Proto
來表示,具體的我也不清楚.......
使用proxy_set_header
之后將會將Host header
設置到$proxy_host
這個變量里面,然后它會把值傳遞到$proxy_pass
.
還可以重寫$host
:
proxy_set_header Host $host;
3.2 獲取真實IP
有這樣一個問題: 一個客戶端(203.0.113.1)發(fā)了一個請求到你的代理服務器(192.0.2.9),然后你的代理服務器將請求轉發(fā)到后端服務器,那后端服務器中解析到的客戶端ip是什么呢?
答案:192.0.2.9.因為后端服務器服務器接收到的是代理服務器發(fā)出的請求顷蟆。
后端服務器要獲取客戶端真實ip,首先要打開RealIP
模塊:--with-http_realip_module
.(默認打開的).然后在配置中用real_ip_header
指令設置header(默認X-REAL-IP
):
http {
real_ip_header X-Real-IP;
server {
...
}
}
- 當
RealIP
模塊安裝后是這個指令默認是打開的,但是最好還是在配置文件打開.- 可以直接這樣設置
proxy_set_header X-Real-IP $remote_addr;
.
還可以使用set_real_ip_from
指令來設置信任的ip來源,同理可以設置CIDR
來屏蔽:
http {
real_ip_header X-Real-IP;
set_real_ip_from 203.0.113.1;
set_real_ip_from 203.0.113.1;
set_real_ip_from 203.0.113.2;
set_real_ip_from 203.0.113.0/24;
server {
...
}
}