Nginx代理配置全攻略:从入门到精通

Linux 系统 Nginx 代理超详细教程

本教程覆盖从 Nginx 安装、核心概念、基础代理配置到高阶实战、排错优化全流程,适配 CentOS/RHEL、Debian/Ubuntu 主流 Linux 发行版,新手可全程照着操作落地,同时满足生产环境专业配置需求。

一、前置准备与环境说明

1. 环境要求

  • 一台 Linux 服务器(CentOS 7+/Rocky Linux/AlmaLinux、Debian 10+/Ubuntu 20.04+)
  • 拥有服务器 root 权限(普通用户需加sudo执行命令)
  • 服务器网络通畅,可访问外网
  • 关闭或放行对应端口的防火墙(firewalld/ufw)

2. 前置依赖安装

编译安装需提前安装依赖,包管理器安装可跳过此步,直接看第二章安装环节。

复制代码
# CentOS/RHEL系列 安装依赖
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel

# Debian/Ubuntu系列 安装依赖
apt update && apt install -y gcc g++ make libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
  • 依赖说明:pcre用于正则匹配,zlib用于 gzip 压缩,openssl用于 HTTPS/SSL 代理。

二、Nginx 完整安装教程

提供 3 种安装方式,新手优先选包管理器安装,简单易维护;需要自定义模块 / 最新版本选源码编译安装。

方式 1:YUM 安装(CentOS/RHEL/Rocky Linux 系列)

配置 Nginx 官方源,安装最新稳定版(系统自带源版本通常较旧)

  1. 配置 Nginx 官方 yum 源

    创建源配置文件

    vi /etc/yum.repos.d/nginx.repo

  2. 写入以下源配置,保存退出

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

  3. 安装 Nginx

    yum install -y nginx

方式 2:APT 安装(Debian/Ubuntu 系列)

  1. 导入 Nginx 官方签名密钥

    curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

  2. 配置官方 apt 源

    Debian系统执行

    echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian lsb_release -cs nginx" | tee /etc/apt/sources.list.d/nginx.list

    Ubuntu系统执行

    echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu lsb_release -cs nginx" | tee /etc/apt/sources.list.d/nginx.list

  3. 安装 Nginx

    apt update && apt install -y nginx

方式 3:源码编译安装(自定义模块 / 最新版本)

适合需要添加第三方模块、自定义编译参数的场景,以最新稳定版 1.24.0 为例

  1. 下载并解压源码包

    进入/usr/local目录

    cd /usr/local

    下载源码(可去nginx.org替换最新版本号)

    wget http://nginx.org/download/nginx-1.24.0.tar.gz

    解压

    tar -zxvf nginx-1.24.0.tar.gz
    cd nginx-1.24.0

  2. 配置编译参数(核心!按需添加模块)

    ./configure
    --prefix=/usr/local/nginx
    --with-http_ssl_module
    --with-http_stub_status_module
    --with-http_realip_module
    --with-stream
    --with-stream_ssl_module

  • 核心参数说明:
    • --prefix:指定 Nginx 安装目录
    • --with-http_ssl_module:开启 HTTPS/SSL 代理支持
    • --with-stream:开启 TCP/UDP 四层代理支持(代理 MySQL/Redis 等必须)
  1. 编译并安装

    make && make install

  2. 配置 systemd 系统服务(实现开机自启、systemctl 管理)

    vi /usr/lib/systemd/system/nginx.service

写入以下内容,保存退出:

复制代码
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
  1. 重载系统服务配置

    systemctl daemon-reload

Nginx 基础管理命令(全版本通用)

复制代码
# 1. 开机自启
systemctl enable nginx

# 2. 启动Nginx
systemctl start nginx

# 3. 停止Nginx
systemctl stop nginx

# 4. 重载配置(热更新,不中断业务,修改配置后必执行)
systemctl reload nginx

# 5. 查看运行状态
systemctl status nginx

# 6. 验证配置文件语法是否正确(修改配置后必执行,避免配置错误导致服务中断)
nginx -t

# 7. 查看Nginx版本和编译参数
nginx -V

安装验证

执行systemctl start nginx启动服务后,浏览器访问服务器http://服务器IP,出现 Nginx 默认欢迎页,即为安装成功。

三、Nginx 代理核心概念扫盲

1. 什么是代理?

代理本质是中间转发层,在客户端和服务端之间搭建桥梁,实现请求转发、流量控制、隐藏真实节点、安全防护等能力,Nginx 是目前最主流的反向代理服务器。

2. 正向代理 VS 反向代理(核心区别,新手必懂)

表格

特性 正向代理 反向代理
代理对象 代理客户端,服务端不知道真实客户端 代理服务端,客户端不知道真实服务端
使用场景 翻墙、客户端上网管控、内网访问外网 网站负载均衡、隐藏后端服务、HTTPS 卸载、动静分离
部署位置 客户端侧,和客户端网络互通 服务端侧,和后端服务网络互通
客户端感知 客户端明确知道自己在使用代理,需手动配置代理地址 客户端无感知,以为代理服务器就是真实服务端

通俗举例:

  • 正向代理:你找海外代购帮你买商品,商家只知道代购,不知道你,代购帮你(客户端)完成请求。
  • 反向代理:你打 10086 客服电话,总机帮你转接空闲客服,你不知道最终是谁接的电话,总机帮服务端(客服)完成请求转发。

3. Nginx 代理核心模块

  • ngx_http_proxy_module:HTTP/HTTPS 七层代理核心模块,90% 的 Web 代理场景都用它,核心指令proxy_pass
  • ngx_stream_proxy_module:TCP/UDP 四层代理模块,用于代理非 HTTP 服务(MySQL、Redis、SSH 等),需编译时添加--with-stream参数。

四、Nginx 核心配置文件全解析

1. 配置文件默认路径

表格

安装方式 主配置文件路径 子配置文件目录 日志文件目录
YUM/APT 包管理器 /etc/nginx/nginx.conf /etc/nginx/conf.d/(.conf 后缀文件自动加载) /var/log/nginx/
源码编译 /usr/local/nginx/conf/nginx.conf 需手动在主配置中 include 引入 /usr/local/nginx/logs/

最佳实践:不要直接修改主配置文件nginx.conf,业务代理配置单独写在conf.d/目录下,以.conf为后缀,便于管理和排查。

2. 配置文件层级结构

Nginx 配置采用块级嵌套结构 ,核心层级如下,代理配置主要写在location块中:

复制代码
main(全局块)
├── events(事件块)
└── http(HTTP核心块)
    ├── upstream(负载均衡池块)
    ├── server(虚拟主机块)
    │   └── location(URL匹配块)
    │       └── proxy_pass(代理核心指令)
    └── 其他server块

3. 各层级核心作用与常用指令

(1)main 全局块

配置影响 Nginx 全局的指令,位于配置文件最顶部,示例:

复制代码
# 运行Nginx的用户,包管理器安装默认nginx,源码安装默认nobody
user nginx;
# 工作进程数,建议等于CPU核心数
worker_processes auto;
# 错误日志文件路径和日志级别
error_log /var/log/nginx/error.log warn;
# PID文件路径
pid /var/run/nginx.pid;
(2)events 块

配置 Nginx 服务器与用户网络连接的相关指令,示例:

复制代码
events {
    # 每个工作进程的最大连接数
    worker_connections 1024;
    # 开启高效网络连接模式
    use epoll;
}
(3)http 块

HTTP 代理的核心块,配置 HTTP 全局参数,可包含多个 server 块,示例:

复制代码
http {
    # 引入文件扩展名与文件类型映射表
    include       /etc/nginx/mime.types;
    # 默认文件类型
    default_type  application/octet-stream;

    # 日志格式定义
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 访问日志路径
    access_log  /var/log/nginx/access.log  main;

    # 开启高效文件传输
    sendfile        on;
    # 长连接超时时间
    keepalive_timeout  65;
    # 开启gzip压缩
    gzip  on;

    # 自动加载conf.d目录下所有.conf后缀的子配置文件
    include /etc/nginx/conf.d/*.conf;
}
(4)server 块

虚拟主机配置块,每个 server 块对应一个域名 / 端口的服务,核心指令:

复制代码
server {
    # 监听端口,HTTP默认80,HTTPS默认443
    listen       80;
    # 绑定的域名,无域名写服务器IP
    server_name  example.com www.example.com;
    # 网站根目录(静态资源场景用)
    root /usr/share/nginx/html;
    # 默认首页
    index index.html index.htm;

    # 多个location匹配规则
    location / {
        # 代理配置写在这里
    }
}
(5)location 块

URL 匹配块,是代理配置的核心,根据请求的 URL 路径匹配,执行对应的代理 / 处理规则,匹配优先级:精确匹配 = > 前缀匹配 ^~ > 正则匹配 ~ / ~* > 普通前缀匹配 > /通用匹配

4. 代理核心指令全解

表格

指令 作用 常用配置示例
proxy_pass 核心中的核心,指定后端服务的代理转发地址 proxy_pass http://127.0.0.1:8080;
proxy_set_header 设置转发给后端服务的请求头,传递客户端真实信息 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_connect_timeout Nginx 与后端服务的连接超时时间,默认 60s proxy_connect_timeout 30s;
proxy_read_timeout Nginx 读取后端服务响应的超时时间,默认 60s proxy_read_timeout 60s;
proxy_send_timeout Nginx 向后端服务发送请求的超时时间,默认 60s proxy_send_timeout 60s;
proxy_buffering 开启响应缓冲区,提升代理性能,默认 on proxy_buffering on;
proxy_redirect 重写后端服务返回的重定向地址,解决代理跳转异常 proxy_redirect default;

5. 新手必踩天坑:proxy_pass 末尾加 / 与不加 / 的本质区别

proxy_pass末尾的斜杠/,会直接影响 URL 转发的路径,90% 的新手 404 错误都源于此,务必记牢以下规则

核心规则

proxy_pass末尾加/,代表绝对路径代理 ,Nginx 会把 location 匹配的路径截断,剩余部分拼接到代理地址后;proxy_pass末尾不加/,代表相对路径代理,Nginx 会把完整的请求路径拼接到代理地址后。

实战示例(一看就懂)

假设客户端访问地址:http://example.com/api/user/list

示例 1:location 带 /api/,proxy_pass 末尾加 /
复制代码
location /api/ {
    proxy_pass http://127.0.0.1:8080/;
}

最终转发地址:http://127.0.0.1:8080/user/list

解析:/api/被截断,剩余user/list拼接到http://127.0.0.1:8080/

示例 2:location 带 /api/,proxy_pass 末尾不加 /
复制代码
location /api/ {
    proxy_pass http://127.0.0.1:8080;
}

最终转发地址:http://127.0.0.1:8080/api/user/list

解析:完整请求路径/api/user/list直接拼接到代理地址后

示例 3:location 带 /api,proxy_pass 末尾加 /
复制代码
location /api {
    proxy_pass http://127.0.0.1:8080/;
}

最终转发地址:http://127.0.0.1:8080//user/list(双斜杠,大概率 404)

避坑提示:location 末尾无 /,proxy_pass 末尾有 /,极易出现路径异常,非必要不这么写!

五、实战场景 1:基础 HTTP 反向代理(入门必学)

场景说明

最常用的场景:将域名test.example.com的所有请求,反向代理到服务器本地 8080 端口运行的后端服务(如 SpringBoot、Tomcat、Node.js 等)。

操作步骤

  1. 进入子配置目录,创建代理配置文件

    包管理器安装执行

    cd /etc/nginx/conf.d

    源码安装执行,需先在nginx.conf中include此目录

    cd /usr/local/nginx/conf/conf.d

    创建配置文件

    vi test.example.com.conf

  2. 写入以下完整配置(带详细注释)

    server {
    # 监听80端口(HTTP默认端口)
    listen 80;
    # 绑定你的域名,无域名则写服务器公网IP
    server_name test.example.com;

    复制代码
     # 通用匹配,所有请求都进入此规则
     location / {
         # 核心:转发到后端8080端口的服务
         proxy_pass http://127.0.0.1:8080;
    
         # 必配:传递客户端真实信息给后端服务
         # 传递域名给后端
         proxy_set_header Host $host;
         # 传递客户端真实IP
         proxy_set_header X-Real-IP $remote_addr;
         # 传递代理链路IP,多层代理场景必备
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         # 传递客户端请求协议(HTTP/HTTPS)
         proxy_set_header X-Forwarded-Proto $scheme;
    
         # 超时配置,避免后端处理慢导致504
         proxy_connect_timeout 30s;
         proxy_read_timeout 60s;
         proxy_send_timeout 60s;
    
         # 重写后端重定向地址,避免跳转暴露后端端口
         proxy_redirect default;
     }

    }

  3. 验证配置语法是否正确

    nginx -t

出现nginx: configuration file /etc/nginx/nginx.conf test is successful,代表配置无语法错误。

  1. 重载配置使配置生效

    systemctl reload nginx

  2. 效果测试

  • 域名场景:将test.example.com解析到服务器公网 IP,浏览器访问http://test.example.com,即可访问到后端 8080 端口的服务。
  • 无域名场景:浏览器访问http://服务器公网IP,即可访问到后端服务。

六、实战场景 2:正向代理配置

场景说明

实现客户端通过 Nginx 服务器访问外网,典型场景:内网服务器无外网权限,通过 Nginx 正向代理访问外网资源;客户端通过代理实现上网管控。

1. HTTP 正向代理配置

  1. 创建正向代理配置文件

    vi /etc/nginx/conf.d/forward_proxy.conf

  2. 写入配置

    server {
    # 监听代理端口,客户端配置此端口
    listen 8080;
    # 允许所有客户端访问,可指定IP段限制访问
    allow all;
    # 拒绝非法访问
    deny all;

    复制代码
     # 开启DNS解析,配置公共DNS服务器
     resolver 223.5.5.5 8.8.8.8 valid=300s;
     resolver_timeout 5s;
    
     # 正向代理核心配置
     location / {
         # 转发客户端请求的目标地址
         proxy_pass $scheme://$host$request_uri;
         # 关闭缓冲区,正向代理建议关闭
         proxy_buffering off;
         # 传递客户端信息
         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_connect_timeout 30s;
         proxy_read_timeout 60s;
         proxy_send_timeout 60s;
     }

    }

  3. 验证配置并重载

    nginx -t
    systemctl reload nginx

  4. 客户端配置

  • 浏览器 / 系统代理配置:代理地址填 Nginx 服务器公网 IP,端口 8080,类型 HTTP 代理。
  • 内网服务器终端代理配置:export http_proxy=http://Nginx服务器IP:8080,即可通过代理访问外网。

2. HTTPS 正向代理配置

HTTP 正向代理无法处理 HTTPS 请求,需通过ngx_http_proxy_connect_module模块实现,该模块需手动编译添加到 Nginx 中,步骤如下:

  1. 下载模块源码

    cd /usr/local
    git clone https://github.com/chobits/ngx_http_proxy_connect_module.git

  2. 进入 Nginx 源码目录,重新编译安装(需和之前的编译参数一致,新增模块)

    cd /usr/local/nginx-1.24.0

    打补丁(根据Nginx版本选择,1.24.0对应此补丁)

    patch -p1 < /usr/local/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_102101.patch

    重新配置,新增模块

    ./configure
    --prefix=/usr/local/nginx
    --with-http_ssl_module
    --with-http_stub_status_module
    --with-http_realip_module
    --with-stream
    --with-stream_ssl_module
    --add-module=/usr/local/ngx_http_proxy_connect_module

    编译安装(仅执行make install,不要make clean,避免覆盖原有配置)

    make && make install

  3. HTTPS 正向代理配置

    server {
    listen 8443;
    # DNS解析
    resolver 223.5.5.5 8.8.8.8 valid=300s;
    resolver_timeout 5s;

    复制代码
     # 开启HTTPS CONNECT隧道支持
     proxy_connect;
     # 允许代理的目标端口
     proxy_connect_allow 443 80;
     proxy_connect_connect_timeout 30s;
     proxy_connect_read_timeout 60s;
     proxy_connect_send_timeout 60s;
    
     # 匹配所有请求
     location / {
         proxy_pass $scheme://$host$request_uri;
         proxy_set_header Host $host;
         proxy_buffering off;
     }

    }

  4. 验证重载后,客户端配置 HTTPS 代理,地址为 Nginx 服务器 IP,端口 8443,即可代理 HTTPS 请求。

七、实战场景 3:反向代理 + 负载均衡

场景说明

当后端服务部署多台节点,通过 Nginx 反向代理实现请求分发,提升服务可用性和并发能力,核心依赖upstream模块。

完整配置示例

  1. 创建负载均衡配置文件

    vi /etc/nginx/conf.d/load_balance.conf

  2. 写入完整配置

nginx

复制代码
# 1. 定义后端服务池,名称自定义(这里叫backend_server)
upstream backend_server {
    # 负载均衡策略,默认轮询,不写则用轮询
    # 轮询:请求按顺序依次分发到各节点,节点宕机自动剔除
    # 权重weight:权重越高,分发的请求越多,适合配置不同的服务器
    server 192.168.1.101:8080 weight=3;
    server 192.168.1.102:8080 weight=2;
    server 192.168.1.103:8080 weight=1 backup; # backup:备用节点,其他节点都宕机才启用
    server 192.168.1.104:8080 down; # down:标记节点不可用,不参与分发

    # 其他常用策略(三选一,写在upstream块内)
    # ip_hash; # 按客户端IP哈希分发,同一个客户端始终访问同一个后端节点,解决session共享问题
    # least_conn; # 优先分发到当前连接数最少的节点,适合负载不均的场景
    # url_hash; # 按请求URL哈希分发,同一个URL始终访问同一个节点,适合缓存场景

    # 健康检查:节点连续失败3次,30s内不再次分发,30s后重试,仍失败则继续剔除
    max_fails 3;
    fail_timeout 30s;
}

# 2. 反向代理配置,转发到上面定义的服务池
server {
    listen 80;
    server_name  www.example.com;

    location / {
        # 核心:转发到upstream定义的服务池名称
        proxy_pass http://backend_server;

        # 通用代理配置(和基础反向代理一致)
        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_connect_timeout 30s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
        proxy_redirect default;
    }
}
  1. 验证配置并重载生效

    nginx -t
    systemctl reload nginx

效果:访问www.example.com,Nginx 会按照配置的策略,将请求分发到后端多个节点,实现负载均衡。

八、实战场景 4:HTTPS/SSL 反向代理(443 端口)

场景说明

为域名配置 SSL 证书,实现 HTTPS 加密访问,同时反向代理到后端 HTTP 服务,是生产环境必备配置,俗称「SSL 卸载」。

前置准备

  1. 已完成域名解析,将域名指向 Nginx 服务器公网 IP。
  2. 已申请域名对应的 SSL 证书(可在阿里云、腾讯云、Let's Encrypt 免费申请),证书文件通常包含:
    • 公钥文件:fullchain.pem / xxx.crt
    • 私钥文件:privkey.pem / xxx.key
  3. 将证书文件上传到服务器,建议路径:/etc/nginx/ssl/

完整 HTTPS 代理配置

  1. 创建配置文件

    vi /etc/nginx/conf.d/https.example.com.conf

  2. 写入完整配置(带 HTTP 强制跳转 HTTPS)

    1. HTTP 80端口配置,强制跳转到HTTPS 443端口

    server {
    listen 80;
    server_name example.com www.example.com;
    # 永久重定向301,临时重定向302
    return 301 https://hostrequest_uri;
    }

    2. HTTPS 443端口核心代理配置

    server {
    # 监听443端口,开启SSL
    listen 443 ssl http2;
    server_name example.com www.example.com;

    复制代码
     # 证书文件路径
     ssl_certificate /etc/nginx/ssl/fullchain.pem;
     ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    
     # SSL安全优化配置
     ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的SSLv3、TLSv1.0/TLSv1.1
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
     ssl_prefer_server_ciphers on;
     ssl_session_cache shared:SSL:10m;
     ssl_session_timeout 10m;
    
     # 反向代理核心配置
     location / {
         # 转发到后端服务,可替换为upstream负载均衡池
         proxy_pass http://127.0.0.1:8080;
    
         # 必配请求头
         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; # 必须传递https协议,避免后端跳转异常
    
         # 超时配置
         proxy_connect_timeout 30s;
         proxy_read_timeout 60s;
         proxy_send_timeout 60s;
         proxy_redirect default;
     }

    }

  3. 验证配置并重载生效

    nginx -t
    systemctl reload nginx

  4. 效果测试:浏览器访问https://你的域名,地址栏出现小锁标志,即为配置成功,同时所有 HTTP 请求会自动跳转到 HTTPS。

九、实战场景 5:高频进阶代理场景

1. 动静分离代理

核心逻辑:静态资源(图片、CSS、JS、HTML 等)由 Nginx 直接处理,动态接口请求转发到后端服务,大幅提升访问性能,减轻后端压力。

复制代码
server {
    listen 80;
    server_name example.com;
    # 静态资源根目录
    root /usr/share/nginx/static;

    # 1. 动态接口请求,转发到后端服务
    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 2. 静态资源请求,Nginx本地处理
    location ~* \.(jpg|jpeg|png|gif|css|js|ico|html)$ {
        # 缓存过期时间,浏览器缓存30天
        expires 30d;
        # 关闭日志,减少IO
        access_log off;
        # 开启gzip压缩
        gzip_static on;
    }

    # 3. 首页默认匹配
    location / {
        index index.html index.htm;
    }
}

2. WebSocket 代理配置

Nginx 代理 WebSocket,需额外配置协议升级和连接头,适配在线聊天、实时推送等场景。

复制代码
server {
    listen 80;
    server_name ws.example.com;

    location /ws/ {
        proxy_pass http://127.0.0.1:9090;

        # WebSocket核心配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 长连接超时时间,默认60s,WebSocket建议调大
        proxy_read_timeout 3600s;

        # 通用配置
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

3. TCP/UDP 四层代理(stream 模块)

用于代理非 HTTP 服务,如 MySQL、Redis、SSH 等,需 Nginx 编译时添加--with-stream参数,配置不写在 http 块内,和 http 块平级。

  1. 找到主配置文件nginx.conf,在 http 块外添加 stream 块配置

    四层代理核心块,和http块平级

    stream {
    # 日志格式
    log_format stream 'remote_addr [time_local] protocol status bytes_sent bytes_received $session_time';
    access_log /var/log/nginx/stream_access.log stream;

    复制代码
     # 代理MySQL服务,3306端口
     server {
         listen 3306;
         proxy_pass 192.168.1.200:3306; # 后端MySQL地址
         proxy_connect_timeout 30s;
         proxy_timeout 3600s; # 长连接超时
     }
    
     # 代理Redis服务,6379端口
     server {
         listen 6379;
         proxy_pass 192.168.1.201:6379; # 后端Redis地址
         proxy_connect_timeout 30s;
         proxy_timeout 3600s;
     }

    }

    http {
    # 原有http配置不变
    ...
    }

  2. 验证配置并重载生效

    nginx -t
    systemctl reload nginx

效果:访问 Nginx 服务器的 3306 端口,即可代理到后端 MySQL 服务,无需暴露数据库真实地址。

4. 代理解决跨域问题

前端跨域是高频问题,通过 Nginx 代理配置,可直接解决跨域,无需后端修改代码。

复制代码
server {
    listen 80;
    server_name front.example.com;

    location /api/ {
        proxy_pass http://backend.example.com/;

        # 跨域核心配置
        # 允许所有来源,生产环境建议指定具体域名,如http://front.example.com
        add_header Access-Control-Allow-Origin *;
        # 允许的请求方法
        add_header Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS";
        # 允许的请求头
        add_header Access-Control-Allow-Headers "Content-Type,Authorization,X-Requested-With";
        # 预检请求OPTIONS的有效期,20天内无需再次预检
        add_header Access-Control-Max-Age 1728000;

        # 处理OPTIONS预检请求,直接返回204,无需转发到后端
        if ($request_method = OPTIONS) {
            return 204;
        }

        # 通用代理配置
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

十、新手必看:代理配置排错全指南

核心排错步骤

  1. 先执行nginx -t,检查配置是否有语法错误,语法错误会导致配置不生效。
  2. 查看 Nginx 运行状态systemctl status nginx,确认服务正常运行。
  3. 查看错误日志tail -f /var/log/nginx/error.log,这是定位问题的核心,所有错误都会记录在这里。
  4. 检查后端服务是否正常运行,端口是否可通:curl http://127.0.0.1:8080,确认后端服务本身无问题。
  5. 检查防火墙和 SELinux 是否拦截。

常见错误与解决方案

1. 502 Bad Gateway 错误

最常见的代理错误,核心原因:Nginx 无法连接到后端服务。

  • 常见原因 1:后端服务未启动 / 端口错误,解决方案:检查后端服务状态,确认端口可正常访问。
  • 常见原因 2:CentOS 下 SELinux 拦截,解决方案:执行setsebool -P httpd_can_network_connect 1,放行 Nginx 网络连接权限(不建议直接关闭 SELinux)。
  • 常见原因 3:后端服务拒绝连接,解决方案:检查后端服务是否绑定了 127.0.0.1,是否允许 Nginx 服务器 IP 访问。
  • 常见原因 4:防火墙拦截,解决方案:放行对应端口,或临时关闭防火墙测试。
2. 504 Gateway Time-out 错误

核心原因:Nginx 连接上了后端服务,但后端服务处理超时,未在规定时间内返回响应。

  • 解决方案:调大proxy_connect_timeoutproxy_read_timeoutproxy_send_timeout超时时间,同时排查后端服务是否卡顿、接口处理慢。
3. 404 Not Found 错误

核心原因:转发路径错误,后端服务无对应接口。

  • 90% 的情况是proxy_pass末尾斜杠使用错误,参考第四章的斜杠规则,核对转发路径是否正确。
  • 解决方案:查看后端服务的访问日志,确认 Nginx 转发的 URL 路径是否符合后端预期,调整proxy_pass的斜杠配置。
4. 403 Forbidden 错误

核心原因:权限不足或访问被拒绝。

  • 常见原因 1:Nginx 运行用户无静态资源目录权限,解决方案:修改目录权限chown -R nginx:nginx 静态资源目录
  • 常见原因 2:配置了allow/deny访问控制,客户端 IP 被拒绝,解决方案:检查 IP 访问控制规则。
  • 常见原因 3:SELinux 拦截,解决方案:执行setsebool -P httpd_can_network_connect 1
5. 配置修改后不生效
  • 解决方案 1:必须执行systemctl reload nginx重载配置,仅 start/restart 不会热加载配置。
  • 解决方案 2:检查是否有多个配置文件监听了同一个端口 / 域名,导致配置冲突。
  • 解决方案 3:检查配置文件是否以.conf为后缀,是否在主配置的 include 目录内。

十一、Nginx 代理最佳实践与优化

  1. 配置文件规范 :每个域名 / 业务单独创建一个.conf配置文件,不要全部写在主配置文件中,便于管理和排查。
  2. 安全加固
    • 隐藏 Nginx 版本号:在 http 块中添加server_tokens off;,避免版本泄露被针对性攻击。
    • 配置访问控制:通过allow 192.168.1.0/24; deny all;限制后台接口的访问 IP。
    • 配置限流:通过limit_req模块限制请求频率,防 CC 攻击。
  3. 性能优化
    • worker_processes auto;,工作进程数和 CPU 核心数一致。
    • 开启sendfile on;tcp_nopush on;,提升文件传输性能。
    • 合理设置缓冲区proxy_buffering on;,减少磁盘 IO。
    • 静态资源开启浏览器缓存expires,减少重复请求。
  4. 高可用配置:生产环境建议部署双机 Nginx,通过 Keepalived 实现主备切换,避免单点故障。
  5. 日志管理:配置日志轮转,避免日志文件过大占满磁盘,定期分析访问日志和错误日志,优化代理配置
相关推荐
卤炖阑尾炎2 小时前
Nginx 核心功能全解析:正向代理、反向代理、缓存与 Rewrite 实战
运维·nginx·缓存
小尔¥3 小时前
Nginx核心功能
运维·网络·nginx
一直都在5725 小时前
nginx和docker面试题
nginx·docker·github
me83216 小时前
【Java】踩坑实录:Spring Boot + Nginx 本地部署404终极排查:从80端口被占用到配置生效全流程
java·spring boot·nginx
卤炖阑尾炎20 小时前
Web 技术基础与 Nginx 网站环境部署全解析
前端·nginx·microsoft
永远不会出bug20 小时前
调整nginx代理 并获取到访问你网站的用户本机 IP
运维·tcp/ip·nginx
BullSmall21 小时前
Nginx(反向代理、负载均衡)安全加固
nginx·安全·负载均衡
ego.iblacat1 天前
Web 技术与 Nginx 网站环境部署
运维·前端·nginx
西门吹雪分身1 天前
nginx的负载均衡配置
nginx·github·负载均衡