修改Nginx配置文件后，nginx -t检查通过，通过nginx -s reload重新加载配置，发现配置未生效。无异常报错日志，以下是对该问题的排查分析过程。[...]
Nginx 502 no live upstreams while connecting to upstream 问题
Nginx转发两个后端服务，请求返回502，没有进入到后端服务，排查Nginx日志发现：no live upstreams while connecting to upstream造成该问题的原因:转发到upstream两个节点的请求都出现了超时(upstream timed out (110: Connection timed out) while reading response header from upstream)，Nginx认为upstream中的两个节点都挂掉了，无法使用，所以拒绝新请求的连接，返回502。需要等待fail_timeout时间后，才能继续尝试转发，这是属于Nginx的被动健康检查机制。[...]
变量值来源是否显示端口说明$host按照 请求行中的Host > 请求头中的Host > server_name 的值 优先级获取否"Host:port"显示值为a:b的时候，只显示a$http_host请求头中的Host是"Host:port"，port存在就显示，请求头中Host是多少 $http_host就是多少$proxy_hostproxy_pass 指定的地址是（默认80不显示）"Host:port" proxy_pass指定的 "Host:port"，当port为80的时候只有“Host”，其它端口，正常显示为 “Host:port”[...]
Nginx 报错 413 client intended to send too large body 处理
promtail通过nginx向loki发送数据，收到以下报错level=error ts=2025-05-08T01:21:05.955472787Z caller=client.go:380 component=client host=local-loki:3100 msg="final error sending batch" status=413 error="server returned HTTP status 413 Request Entity Too Large (413): "排查nginx日志，发现2025/05/08 09:21:06 [error] 21#21: *62769236 client intended to send too large body: 1312028 bytes, client: 10.40.30.155, server: , request: "POST /loki/api/v1/push HTTP/1.1", host: "local-loki:3100" - | 10.40.30.155 | - | 08/May/2025:09:21:06 +0800 | POST /loki/api/v1/push HTTP/1.1 | 413 | 183 | - | promtail/2.6.1 | - | 0.032 | - | - | - | local-loki:3100触发了Nginx的最大请求体限制，收到了 413 (Request Entity Too Large) error[...]
官方文档: 从源代码构建Nginx基于源码，定制编译Nginx，提供了关于源码编译Nginx的示例不使用外部模块编译Nginx使用外部模块编译Nginx编译环境Nginx版本: 1.27.5操作系统: Ubuntu 18.04$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.6 LTS Release: 18.04 Codename: bionic[...]
通过 ngx_stream_ssl_preread_module 模块(1.11.5) 实现HTTPS和SSH共用一个端口根据 $ssl_preread_protocol 变量 判断SSL协议版本，选择上游。使ssh连接到ssh端口，HTTPS连接到https端口nginx版本必须大于1.15.2，因为 nginx 1.15.2 版本之后新增了一个属性$ssl_preread_protocol，可以让stream区分web ssl/tls和其他协议流程1.ssh端口2.https端口3.通过stream模块实现四层协议的转发，根据 $ssl_preread_protocol 判断进入ssh还是https端口[...]
sub_filter 属于 ngx_http_sub_module 模块，不是默认构建的，需要通过 --with-http_sub_module 配置参数启用。配置示例 proxy_set_header Accept-Encoding ''; # 清除请求头中的Accept-Encoding,让后端服务器返回未压缩格式 sub_filter_types *; # 替换所有类型 sub_filter_once off; # 查找所有内容替换，而不是只替换一次 sub_filter 'old_address:8080' 'new_address:8888'; # 示例，将响应中的内容 old_address:8080 替换成 new_address:8888[...]
官方文档WebSocket代理添加配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";示例upstream ws-prod { server 192.168.1.1:9090; } server { listen 8081; charset utf-8; location / { # 向后端服务器传递自定义的请求头信息 # proxy_set_header Host $host; proxy_set_header Host '192.168.1.1:9090'; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://ws-prod; # WebSocket 配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # 日志配置 access_log /var/log/nginx/ws-prod_access.log main; error_log /var/log/nginx/ws-prod_error.log; }
示例配置：static.confserver { listen 80; server_name www.example.com; charset utf-8; location / { root /home/www; # 指定根目录 index NON_EXISTENT_FILE; # 指定index是一个不存在的文件，这样就可以通过ngx_http_autoindex_module模块处理 autoindex on; # 启用目录列表输出 } access_log /var/log/nginx/static_access.log main; error_log /var/log/nginx/static_error.log; }公开静态站点，站点根目录就是 /home/www 中的文件[...]