Nginx反向代理配置全流程实战:从环境搭建到HTTPS部署

在开发和部署Web应用时,反向代理是实现负载均衡、SSL证书管理和域名访问的关键技术。本文将以Nginx为例,详细记录如何配置反向代理,解决"域名+端口可访问但直接域名访问失败"的问题,并最终实现HTTPS加密访问(全程基于实际操作场景,避免冗余步骤)。

一、问题背景与核心需求

  • 场景 :后端服务运行在服务器3000端口,通过your-domain.com:3000可正常访问,但直接输入your-domain.com(默认80端口)时无法加载页面。
  • 目标:配置Nginx反向代理,让域名(不带端口)直接指向后端服务,并启用HTTPS加密。

二、Nginx反向代理核心配置流程

1. 环境准备:创建站点配置目录

Nginx默认没有sites-available目录,需手动创建(用于集中管理单个站点的配置文件,便于后续维护):

bash 复制代码
# 创建站点配置目录(存放反向代理配置文件)
sudo mkdir -p /etc/nginx/sites-available

2. 修改主配置文件(nginx.conf):引入自定义配置

Nginx主配置文件位于/etc/nginx/nginx.conf,关键是在http块内添加include指令,让Nginx能读取sites-available目录下的配置:

nginx 复制代码
# 编辑主配置文件
sudo vim /etc/nginx/nginx.conf

# 在http块内添加以下内容(示例核心结构)
http {
    # 原有默认配置(如log_format、sendfile、include mime.types等,保留不变)
    
    # 关键:引入sites-available目录下的所有.conf配置文件
    include /etc/nginx/sites-available/*.conf;
}

注意:include指令必须放在http块内,否则会报"server directive is not allowed here"错误(server块只能在http层级下生效)。

3. 编写反向代理配置文件

sites-available目录下创建当前域名的配置文件(如your-domain.com.conf),内容包含"HTTP自动跳HTTPS"和"HTTPS反向代理"两部分:

bash 复制代码
# 创建并编辑反向代理配置文件
sudo vim /etc/nginx/sites-available/your-domain.com.conf

配置文件内容(替换your-domain.com为实际域名,证书路径为实际路径):

nginx 复制代码
# 1. HTTP请求(80端口)自动跳转HTTPS(强制加密访问)
server {
    listen 80;                  # 监听默认HTTP端口
    server_name your-domain.com; # 绑定你的域名

    # 所有HTTP请求301重定向到HTTPS
    return 301 https://$server_name$request_uri;
}

# 2. HTTPS请求(443端口)反向代理到后端3000端口
server {
    listen 443 ssl;             # 监听HTTPS默认端口
    server_name your-domain.com; # 绑定你的域名

    # SSL证书配置(替换为实际证书路径)
    ssl_certificate /etc/nginx/ssl/your-domain.com.pem;   # 公钥(PEM格式)
    ssl_certificate_key /etc/nginx/ssl/your-domain.com.key; # 私钥

    # 核心:反向代理到后端服务(3000端口)
    location / {
        proxy_pass http://127.0.0.1:3000;  # 转发到本地3000端口
        # 传递客户端真实IP和请求信息(后端服务可获取真实访问来源)
        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协议
    }
}

4. 验证配置并生效

配置写完后,必须检查语法是否正确,再重新加载Nginx服务:

bash 复制代码
# 1. 检查Nginx配置语法(关键!避免配置错误导致服务无法启动)
sudo nginx -t

# 若输出以下内容,说明语法正确:
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

# 2. 重新加载配置(不中断现有连接,平滑生效)
sudo nginx -s reload

三、后端服务关键调整(以NestJS为例)

反向代理生效的前提是后端服务能正确响应Nginx的转发请求,需注意两点:

1. 绑定地址:允许所有IP访问

确保后端服务绑定到0.0.0.0(而非127.0.0.1),否则仅能本地访问,Nginx无法转发:

javascript 复制代码
// 后端启动文件(如main.js)
async function bootstrap() {
    const app = await NestFactory.create(AppModule);
    // 绑定0.0.0.0:3000,允许服务器所有IP(包括127.0.0.1)访问
    await app.listen(3000, '0.0.0.0');
    console.log('后端服务启动:http://localhost:3000');
}
bootstrap();

2. 协议统一:后端禁用HTTPS(让Nginx处理加密)

若后端服务自己配置了HTTPS(如加载证书),会与Nginx的HTTPS形成"协议冲突"(Nginx用HTTP转发到后端HTTPS端口,导致连接被拒绝)。
正确做法:后端仅用HTTP,让Nginx统一处理SSL加密(简化架构,便于证书管理)。

四、常见错误排查(实战踩坑记录)

1. 502 Bad Gateway错误

  • 现象 :访问域名显示"502",Nginx日志提示"upstream prematurely closed connection"。
  • 原因:Nginx能连接后端端口,但后端未返回响应(如协议冲突、后端崩溃)。
  • 排查步骤
    1. 测试本地访问后端:curl http://127.0.0.1:3000(若返回"Empty reply",说明后端服务异常);
    2. 查看后端日志:pm2 logs(若用PM2管理,检查是否有代码报错或证书加载失败);
    3. 确认后端协议:确保后端是HTTP,而非HTTPS。

2. 配置语法错误

  • 现象nginx -t报错"server directive is not allowed here"。
  • 原因include /etc/nginx/sites-available/*.conf;写在了http块外面。
  • 解决 :将include指令移到nginx.confhttp块内。

3. 域名无法访问(但域名+端口可访问)

  • 现象your-domain.com:3000能打开,your-domain.com打不开。
  • 原因:80/443端口未开放,或Nginx未监听80/443端口。
  • 解决
    1. 开放端口(以firewalld为例):

      bash 复制代码
      sudo firewall-cmd --add-port=80/tcp --permanent
      sudo firewall-cmd --add-port=443/tcp --permanent
      sudo firewall-cmd --reload
    2. 确认Nginx监听端口:netstat -tulpn | grep nginx(需显示0.0.0.0:800.0.0.0:443)。

五、最终验证与最佳实践

1. 验证反向代理生效

  • 浏览器访问 :输入https://your-domain.com,应直接显示后端服务内容(无需加3000端口);
  • 命令行验证curl -v https://your-domain.com(查看响应是否来自后端服务)。

2. 最佳实践建议

  • 配置分离 :用sites-available管理单站点配置,避免主配置文件臃肿;

  • 证书权限 :确保Nginx能读取证书文件,执行chown nginx:nginx /etc/nginx/ssl/*

  • 日志监控 :定期查看Nginx错误日志:tail -f /var/log/nginx/error.log(快速定位问题);

  • 性能优化 :在http块内添加Gzip压缩(减少传输体积):

    nginx 复制代码
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;

六、总结

Nginx反向代理的核心是"配置路径正确+协议统一":

  1. 主配置nginx.confhttp块内必须引入sites-available目录;
  2. 后端服务绑定0.0.0.0且用HTTP,让Nginx处理HTTPS;
  3. 配置后先nginx -t检查语法,再reload生效,避免服务中断。

按此流程操作,即可解决"域名+端口可访问但直接域名不可访问"的问题,实现安全、规范的Web服务部署。

相关推荐
EMTime6 小时前
Docker运行OpenWRT
运维·docker·容器
lolo大魔王6 小时前
Linux 文件系统超全面详解(原理、结构、挂载、分区、inode、日志、管理命令)
linux·运维·服务器
zyl837218 小时前
Docker 使用手册
运维·docker·容器
古月方枘Fry9 小时前
MGRE实验
运维·服务器
stolentime9 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
bush411 小时前
嵌入式linux学习记录四
linux·运维·学习
lihao lihao12 小时前
软硬链接
linux·运维·服务器
TOWE technology12 小时前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
楼田莉子12 小时前
Docker学习:Docker介绍及其架构介绍
运维·后端·学习·docker·容器·架构
大明者省12 小时前
IIS 端口绑定正常访问的原理说明与常见误区澄清
运维·服务器·笔记