虽然之前搭建自己的服务时,有配置过 Nginx,但没有很深入去了解。
这次因为工作需要,要整理下 Nginx 的配置。就仔细去看了下相关介绍。
这回算是补上知识的盲区了。
关于 server_name
当各个 server 的 listen 端口各不一样时,可以不用写 server_name。
但当多个 server 共用一个 listen 端口时,server_name 就需要写了。
关于 head
Nginx 在做转发时,会丢弃部分 head,所以在处理部分业务的时候,需要补上。
如果是一个 Web API 应用,那么下面几个需要补上
proxy_set_header Host $host; # 如果需要用域名在一些处理时,会有帮助
proxy_set_header X-Real-IP $remote_addr; #不补的话,后端服务看到的是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 还是其他
具体讲下两个和 ip 相关的:
$remote_addr 获得的是访问 Nginx 的 IP,也就是“直连”IP(可能是代理)
$proxy_add_x_forwarded_for 比如 我(比如1.1.1.1) 通过某个代理访问(比如2.2.2.2) Nginx,那么这里获得的 IP 就是 1.1.1.1, 2.2.2.2
当需要使用 WebSocket 的时候,需要添加以下配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
只有 http1.1 才支持 WebSocket,另外两个 head 也是配置 ws 需要的。
不写proxy_http_version时,默认是1.0。写 1.1 不会有问题,性能更好。
关于速度
配置http2,可以让客户端访问 Nginx 更好更快。如果客户端不支持http2,会自动降级,不用操心。(配置位置见下面的代码)
配置 proxy_http_version 可以让 Nginx 访问后端服务更好更快。
如果想看这些$参数的值,可以放到 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。
配置里参数位置的介绍
- server 里 location 之外的配置 —— 作用于“客户端到 Nginx”这段(协议、监听、SSL、路由)
- location 里的配置 —— 作用于“Nginx 到后端”这段(代理、header、upgrade、timeout)
一个 Web API 的基础代理配置
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;
}
}
一个 WebSocket 游戏服的基础代理配置
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;
}
}