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_timeout、proxy_read_timeout、proxy_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. 日志管理:配置日志轮转,避免日志文件过大占满磁盘,定期分析访问日志和错误日志,优化代理配置
相关推荐
2601_9656196921 小时前
AI视频制作:财经数据可视化视频怎么做:AI 自动生成图表动画的实操流程
人工智能·nginx·音视频
2601_9656196921 小时前
历史解说视频怎么做:青铜器瓷器文物画面自动对齐的完整教程
运维·nginx·音视频
姜鱼问生1 天前
每次开机手动检查 6 样东西?我写了个 2 秒自检脚本
运维·网络·nginx·docker·容器
xixingzhe22 天前
Nginx 看懂请求耗时瓶颈
服务器·前端·nginx
北风toto3 天前
Windows 下用 OpenSSL 生成 SSL 密钥并配置 Nginx 教程
windows·nginx·ssl
卜锦元3 天前
Docker Compose 部署 Nginx 1.30.6 完整指南
nginx·docker·容器
小小龙学IT3 天前
Nginx 开源 Web 服务器与反向代理深度解
前端·nginx·开源
Coisinier4 天前
docker命令管理镜像及容器
linux·运维·nginx·docker·容器·操作系统
2301_32241428044 天前
基于web的校园失物招领管理系统59695-计算机毕设 原创(免费领源码+部署教程+开发环境)
mysql·nginx·php·apache·thinkphp·phpstudy·wampserver
flytalei4 天前
从YAML到Nginx服务访问:动手理解 Kubernetes Pod、Deployment 与 Service
运维·nginx·kubernetes