OpsDaiLou - Nginx
type: channel
link: https://blog.opsdailou.top/index.php/tag/nginx/
items: Nginx reload未生效问题排查处理
items: Nginx 502 no live upstreams while connecting to upstream 问题
items: Nginx中 $host $http_host $proxy_host的区别
items: Nginx 报错 413 client intended to send too large body 处理
items: 从源代码构建定制Nginx
items: Nginx PHP代理
items: Nginx 实现HTTPS与SSH端口复用
items: Nginx 通过sub_filter替换响应内容
items: Nginx WebSocket代理
items: Nginx 静态下载站点

Nginx reload未生效问题排查处理
type: item
date: 2026-03-09T10:32:00+00:00
description: 修改Nginx配置文件后，nginx -t检查通过，通过nginx -s reload重新加载配置，发现配置未生效。无异常报错日志，以下是对该问题的排查分析过程。[...]

Nginx 502 no live upstreams while connecting to upstream 问题
type: item
date: 2025-10-22T07:59:00+00:00
description: 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的被动健康检查机制。[...]

Nginx中 $host $http_host $proxy_host的区别
type: item
date: 2025-05-13T04:12:32+00:00
description: 变量值来源是否显示端口说明$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 处理
type: item
date: 2025-05-08T04:04:00+00:00
description: 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
type: item
date: 2025-04-18T06:09:00+00:00
description: 官方文档: 从源代码构建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[...]

Nginx PHP代理
type: item
date: 2025-04-15T09:05:47+00:00
description: 计划1.php服务相关文件。2.后端使用php-fpm容器启动3.前端使用本地nginx代理，或者使用容器nginx代理（可不映射php-fpm端口）php项目目录/var/www/example/Index.php文件在该目录示例1.使用本地nginx+容器php-fpm服务部署2.使用容器nginx+容器php-fpm服务部署[...]

Nginx 实现HTTPS与SSH端口复用
type: item
date: 2025-04-15T08:03:05+00:00
description: 通过 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端口[...]

Nginx 通过sub_filter替换响应内容
type: item
date: 2025-04-15T02:35:00+00:00
description: 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[...]

Nginx WebSocket代理
type: item
date: 2025-04-14T09:58:00+00:00
description: 官方文档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; }

Nginx 静态下载站点
type: item
date: 2025-04-14T08:55:00+00:00
description: 示例配置：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 中的文件[...]