当前位置: 首页 > news >正文

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

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

一、问题背景与核心需求

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

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

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

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

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

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

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

# 编辑主配置文件
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反向代理”两部分:

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

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

# 1. HTTP请求(80端口)自动跳转HTTPS(强制加密访问)
server {listen 80;                  # 监听默认HTTP端口server_name your-domain.com; # 绑定你的域名# 所有HTTP请求301重定向到HTTPSreturn 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服务:

# 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无法转发:

// 后端启动文件(如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为例):
      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压缩(减少传输体积):
    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服务部署。

http://www.dtcms.com/a/398653.html

相关文章:

  • HTTPS 能抓包吗?实战答案与逐步可行方案(HTTPS 抓包原理、证书Pinning双向认证应对、工具对比)
  • 对网站建设的讲话wordpress 自定义面板
  • 【23】C++实战篇——C++报错:LNK2001:无法解析的外部符号 ,LNK2019: 无法解析的外部符号,原因分析及解决方法
  • 东莞建设银行官方网站礼品网站制作
  • TiDB Cloud 可观测性最佳实践
  • python+springboot毕业季旅游一站式定制服务系统
  • docker 启用容器端口被占用报错500
  • 无人机台风天通信技术要点
  • ParaZero-无人机降落伞领先开发商:SafeAir降落伞系统、DropAir精确空投系统、DefendAir反无人机系统
  • 手机怎样创建网站网站内容保护
  • 电路基础与PCB设计(一)电路
  • YOLO入门教程(四):搭建YOLOv1网络
  • k8s中的Gateway API 和istio
  • K8S (使用步骤)
  • k8s 跟 nacos 关于服务注册以及服务发现
  • 专业的家居网站建设深圳高端网站建设公司
  • Ubuntu vscode软件的安装和使用
  • [Maven 基础课程]10_Maven 私服
  • Python11-集成学习
  • 代做网站灰色关键词青州网站搭建
  • Spring-MVC响应
  • 正确看待和使用TDD测试驱动开发
  • 红外热成像与数字图像相关(DIC)技术耦合在金属热变形分析中的应用
  • 做拍卖网站有哪些教做宝宝辅食的网站
  • 第一章:Go语言的起源-云原生时代的C位语言​​
  • Auto_CVE - 自动化漏洞挖掘系统
  • python+springboot+vue的旅游门票信息系统web
  • 上网行为安全(3)
  • 晨控CK-FR08-E00与三菱QJ71E71-100模块配置MODBUSTCP通讯连接手册
  • 免费网站建站平台网络服务器配置与管理学习报告