Nginx 反向代理配置入门:从零搭建网站流量转发
Nginx 反向代理配置入门:从零搭建网站流量转发
什么是反向代理
反向代理(Reverse Proxy)是指以代理服务器(如 Nginx)代表真实后端站点接收客户端请求,再由代理把请求转发到后端的 Web 服务,最后把后端的响应原样返回给客户端。对客户端而言,它只和代理打交道,看不到后端的 IP 与端口。与正向代理不同,正向代理代替的是客户端,而反向代理代替的是服务端。
在实际项目中,反向代理常用于负载均衡、隐藏后端真实地址、统一入口域名、TLS 终结(HTTPS 解密由 Nginx 完成,后端仅用 HTTP)以及按路径将请求分发给不同的微服务。
为什么要用反向代理
- 安全隔离:后端服务不需要对外暴露端口,只暴露 Nginx 的 80/443。
- 负载均衡:把流量分摊到多台后端实例,提高可用性和吞吐。
- 协议转换:对外提供 HTTPS,内部用 HTTP 与后端通信,降低后端 TLS 开销。
- 按路径/域名路由:同一台 Nginx 可以把 /api 发给 A 服务,/admin 发给 B 服务。
- 静态资源加速与压缩:Nginx 处理 gzip、缓存、Range 请求,后端只负责业务逻辑。
环境准备
本文示例在一台 Linux 服务器上完成,已安装 Nginx 与一台后端应用。操作要点如下:
- 安装 Nginx(以 Ubuntu/Debian 为例使用 apt,CentOS/AlmaLinux 使用 yum/dnf)。
- 确认 Nginx 服务已启动并监听 80 端口。
- 准备一台后端应用,监听在本地回环地址的某个端口上(例如 8080),可用任何 Web 框架或静态目录模拟。
- 确保防火墙/安全组放行 80 端口(以及 443 若启用 HTTPS)。
最简反向代理配置
打开 Nginx 主配置或站点配置文件(通常在 sites-enabled 目录下),在 server 块内使用 proxy_pass 指令将请求转发给后端。
server {
listen 80;
server_name 你的域名;
location / {
proxy_pass http://后端地址:后端端口;
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_pass:指定后端目标地址。写 http:// 开头,后面跟上后端地址与端口。
- proxy_set_header Host $host:把客户端请求中的 Host 原样传给后端,避免后端拿不到正确域名。
- X-Real-IP / X-Forwarded-For:把真实客户端 IP 透传给后端,方便后端记录日志和做限流。
- X-Forwarded-Proto:告知后端客户端最初使用的是 http 还是 https。
配完后执行配置语法检查(nginx -t),无误后重载服务(systemctl reload nginx)即可生效。
按路径分发到不同后端
当多个服务共用同一域名时,可以用 location 前缀把不同路径路由到不同后端。
server {
listen 80;
server_name 你的域名;
location /api {
proxy_pass http://api后端地址:api后端端口;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /admin {
proxy_pass http://admin后端地址:admin后端端口;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass http://默认后端地址:默认后端端口;
proxy_set_header Host $host;
}
}
注意:location 前缀匹配时,/api 会命中所有以 /api 开头的路径。如果不想影响 /api-docs 这类路径,可改用正则 location ~ ^/api(/.*)?$ 或借助 try_files 与精确匹配 location = /api。
另外,proxy_pass 末尾是否带斜杠会影响 URI 的改写规则:不带斜杠时,匹配的 location 前缀会被拼接到后端 URI 中;带斜杠时,前缀会被丢弃。实际使用时建议在测试环境先用 curl 验证转发后的 URI 是否符合预期。
启用 HTTPS 与自动续期
对外提供 HTTPS 时,Nginx 作为 TLS 终结代理,证书放在 Nginx 层即可,后端仍然只用 HTTP。
server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate /etc/ssl/certs/域名.crt;
ssl_certificate_key /etc/ssl/private/域名.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 推荐的安全密码套件;
location / {
proxy_pass http://后端地址:后端端口;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name 你的域名;
return 301 https://$host$request_uri;
}
证书可通过 Let’s Encrypt 的 certbot 申请,并配置 systemd 定时任务或 cron 自动续期。续期完成后重载 Nginx 即可无缝更新。
常见坑与排错
- 502 Bad Gateway:通常是后端没有监听配置的地址/端口,或后端地址写错。用 ss -tlnp 或 netstat 确认后端确实在监听目标端口,并用 curl 从 Nginx 所在机器直接请求后端地址验证。
- 后端拿到的 Host 是后端地址而非用户域名:漏配 proxy_set_header Host $host,或者后端框架忽略了 Host 头。
- 客户端真实 IP 全是代理服务器 IP:未透传 X-Real-IP / X-Forwarded-For,或后端未从这些头中取 IP。
- 大文件上传 413 Request Entity Too Large:Nginx 默认 client_max_body_size 为 1M,需在 server 或 location 中调大,例如 client_max_body_size 100M。
- 长连接/WebSocket 被 10054 断开:需配置 proxy_read_timeout 与 proxy_send_timeout,WebSocket 还需加上 Upgrade 与 Connection 头的透传。
小结
Nginx 反向代理是把流量分发、安全隔离和协议转换统一到入口层的常用做法。掌握 proxy_pass 与四个基础头(Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto)后,按路径路由、HTTPS 终结、负载均衡等场景都可以在此基础上组合。首次上线前建议用 curl 从代理机器直连后端验证,用浏览器访问入口域名观察响应,并检查后端日志中的真实客户端 IP 与 Host 是否符合预期。
- 点赞
- 收藏
- 关注作者
评论(0)