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 官方源,安装最新稳定版(系统自带源版本通常较旧)
-
配置 Nginx 官方 yum 源
创建源配置文件
vi /etc/yum.repos.d/nginx.repo
-
写入以下源配置,保存退出
[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 -
安装 Nginx
yum install -y nginx
方式 2:APT 安装(Debian/Ubuntu 系列)
-
导入 Nginx 官方签名密钥
curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
-
配置官方 apt 源
Debian系统执行
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian
lsb_release -csnginx" | tee /etc/apt/sources.list.d/nginx.listUbuntu系统执行
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu
lsb_release -csnginx" | tee /etc/apt/sources.list.d/nginx.list -
安装 Nginx
apt update && apt install -y nginx
方式 3:源码编译安装(自定义模块 / 最新版本)
适合需要添加第三方模块、自定义编译参数的场景,以最新稳定版 1.24.0 为例
-
下载并解压源码包
进入/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 -
配置编译参数(核心!按需添加模块)
./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 等必须)
-
编译并安装
make && make install
-
配置 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
-
重载系统服务配置
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 等)。
操作步骤
-
进入子配置目录,创建代理配置文件
包管理器安装执行
cd /etc/nginx/conf.d
源码安装执行,需先在nginx.conf中include此目录
cd /usr/local/nginx/conf/conf.d
创建配置文件
vi test.example.com.conf
-
写入以下完整配置(带详细注释)
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; }}
-
验证配置语法是否正确
nginx -t
出现nginx: configuration file /etc/nginx/nginx.conf test is successful,代表配置无语法错误。
-
重载配置使配置生效
systemctl reload nginx
-
效果测试
- 域名场景:将
test.example.com解析到服务器公网 IP,浏览器访问http://test.example.com,即可访问到后端 8080 端口的服务。 - 无域名场景:浏览器访问
http://服务器公网IP,即可访问到后端服务。
六、实战场景 2:正向代理配置
场景说明
实现客户端通过 Nginx 服务器访问外网,典型场景:内网服务器无外网权限,通过 Nginx 正向代理访问外网资源;客户端通过代理实现上网管控。
1. HTTP 正向代理配置
-
创建正向代理配置文件
vi /etc/nginx/conf.d/forward_proxy.conf
-
写入配置
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; }}
-
验证配置并重载
nginx -t
systemctl reload nginx -
客户端配置
- 浏览器 / 系统代理配置:代理地址填 Nginx 服务器公网 IP,端口 8080,类型 HTTP 代理。
- 内网服务器终端代理配置:
export http_proxy=http://Nginx服务器IP:8080,即可通过代理访问外网。
2. HTTPS 正向代理配置
HTTP 正向代理无法处理 HTTPS 请求,需通过ngx_http_proxy_connect_module模块实现,该模块需手动编译添加到 Nginx 中,步骤如下:
-
下载模块源码
cd /usr/local
git clone https://github.com/chobits/ngx_http_proxy_connect_module.git -
进入 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
-
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; }}
-
验证重载后,客户端配置 HTTPS 代理,地址为 Nginx 服务器 IP,端口 8443,即可代理 HTTPS 请求。
七、实战场景 3:反向代理 + 负载均衡
场景说明
当后端服务部署多台节点,通过 Nginx 反向代理实现请求分发,提升服务可用性和并发能力,核心依赖upstream模块。
完整配置示例
-
创建负载均衡配置文件
vi /etc/nginx/conf.d/load_balance.conf
-
写入完整配置
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;
}
}
-
验证配置并重载生效
nginx -t
systemctl reload nginx
效果:访问
www.example.com,Nginx 会按照配置的策略,将请求分发到后端多个节点,实现负载均衡。
八、实战场景 4:HTTPS/SSL 反向代理(443 端口)
场景说明
为域名配置 SSL 证书,实现 HTTPS 加密访问,同时反向代理到后端 HTTP 服务,是生产环境必备配置,俗称「SSL 卸载」。
前置准备
- 已完成域名解析,将域名指向 Nginx 服务器公网 IP。
- 已申请域名对应的 SSL 证书(可在阿里云、腾讯云、Let's Encrypt 免费申请),证书文件通常包含:
- 公钥文件:
fullchain.pem/xxx.crt - 私钥文件:
privkey.pem/xxx.key
- 公钥文件:
- 将证书文件上传到服务器,建议路径:
/etc/nginx/ssl/
完整 HTTPS 代理配置
-
创建配置文件
vi /etc/nginx/conf.d/https.example.com.conf
-
写入完整配置(带 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; }}
-
验证配置并重载生效
nginx -t
systemctl reload nginx -
效果测试:浏览器访问
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 块平级。
-
找到主配置文件
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配置不变
...
} -
验证配置并重载生效
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;
}
}
十、新手必看:代理配置排错全指南
核心排错步骤
- 先执行
nginx -t,检查配置是否有语法错误,语法错误会导致配置不生效。 - 查看 Nginx 运行状态
systemctl status nginx,确认服务正常运行。 - 查看错误日志
tail -f /var/log/nginx/error.log,这是定位问题的核心,所有错误都会记录在这里。 - 检查后端服务是否正常运行,端口是否可通:
curl http://127.0.0.1:8080,确认后端服务本身无问题。 - 检查防火墙和 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 代理最佳实践与优化
- 配置文件规范 :每个域名 / 业务单独创建一个
.conf配置文件,不要全部写在主配置文件中,便于管理和排查。 - 安全加固 :
- 隐藏 Nginx 版本号:在 http 块中添加
server_tokens off;,避免版本泄露被针对性攻击。 - 配置访问控制:通过
allow 192.168.1.0/24; deny all;限制后台接口的访问 IP。 - 配置限流:通过
limit_req模块限制请求频率,防 CC 攻击。
- 隐藏 Nginx 版本号:在 http 块中添加
- 性能优化 :
worker_processes auto;,工作进程数和 CPU 核心数一致。- 开启
sendfile on;和tcp_nopush on;,提升文件传输性能。 - 合理设置缓冲区
proxy_buffering on;,减少磁盘 IO。 - 静态资源开启浏览器缓存
expires,减少重复请求。
- 高可用配置:生产环境建议部署双机 Nginx,通过 Keepalived 实现主备切换,避免单点故障。
- 日志管理:配置日志轮转,避免日志文件过大占满磁盘,定期分析访问日志和错误日志,优化代理配置
