雖然之前搭建自己的服務(wù)時(shí),有配置過 Nginx,但沒有很深入去了解。
這次因?yàn)楣ぷ餍枰?,要整理?Nginx 的配置。就仔細(xì)去看了下相關(guān)介紹。
這回算是補(bǔ)上知識的盲區(qū)了。
關(guān)于 server_name
當(dāng)各個(gè) server 的 listen 端口各不一樣時(shí),可以不用寫 server_name。
但當(dāng)多個(gè) server 共用一個(gè) listen 端口時(shí),server_name 就需要寫了。
關(guān)于 head
Nginx 在做轉(zhuǎn)發(fā)時(shí),會丟棄部分 head,所以在處理部分業(yè)務(wù)的時(shí)候,需要補(bǔ)上。
如果是一個(gè) Web API 應(yīng)用,那么下面幾個(gè)需要補(bǔ)上
proxy_set_header Host $host; # 如果需要用域名在一些處理時(shí),會有幫助
proxy_set_header X-Real-IP $remote_addr; #不補(bǔ)的話,后端服務(wù)看到的是nginx 的 ip,比如127.0.0.1
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #看到的是完整的 ip 鏈路
proxy_set_header X-Forwarded-Proto $scheme; # 用的是 http 還是 https 還是其他
具體講下兩個(gè)和 ip 相關(guān)的:
$remote_addr 獲得的是訪問 Nginx 的 IP,也就是“直連”IP(可能是代理)
$proxy_add_x_forwarded_for 比如 我(比如1.1.1.1) 通過某個(gè)代理訪問(比如2.2.2.2) Nginx,那么這里獲得的 IP 就是 1.1.1.1, 2.2.2.2
當(dāng)需要使用 WebSocket 的時(shí)候,需要添加以下配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
只有 http1.1 才支持 WebSocket,另外兩個(gè) head 也是配置 ws 需要的。
不寫proxy_http_version時(shí),默認(rèn)是1.0。寫 1.1 不會有問題,性能更好。
關(guān)于速度
配置http2,可以讓客戶端訪問 Nginx 更好更快。如果客戶端不支持http2,會自動降級,不用操心。(配置位置見下面的代碼)
配置 proxy_http_version 可以讓 Nginx 訪問后端服務(wù)更好更快。
如果想看這些$參數(shù)的值,可以放到 head 里,比如
# debug.conf
server {
listen 8080 ssl; # 1.25以下,要開啟 http2 的話:listen 8080 ssl http2
http2 on; # nginx 1.25以上配置在這里
location /debug { # 注意,下面這些X-Debug-*都是自定義的,不寫 X-Debug 也OK
add_header X-Debug-Upgrade $http_upgrade;
add_header X-Debug-Connection $http_connection;
add_header X-Debug-Real-IP $remote_addr;
add_header X-Debug-Host $host;
add_header X-Debug-Proto $scheme;
add_header X-Debug-request_uri $request_uri;
add_header X-Debug-Forwarded-For $proxy_add_x_forwarded_for;
return 200 "OK\n";
}
}
然后可以通過 curl -v http://...../debug 來查看上面添加的 header,也可以通過其他工具如 chrome。
配置里參數(shù)位置的介紹
- server 里 location 之外的配置 —— 作用于“客戶端到 Nginx”這段(協(xié)議、監(jiān)聽、SSL、路由)
- location 里的配置 —— 作用于“Nginx 到后端”這段(代理、header、upgrade、timeout)
一個(gè) Web API 的基礎(chǔ)代理配置
server {
listen 8080;
http2 on;
location / {
proxy_pass http://192.168.101.1:18080;
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_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
一個(gè) WebSocket 游戲服的基礎(chǔ)代理配置
server {
listen 8081;
http2 on;
location / {
proxy_pass http://192.168.1.1:18081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
proxy_connect_timeout 4s;
}
}