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

news/2025/9/28 13:03:56/文章来源:https://www.cnblogs.com/tlnshuju/p/19116463

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

2025-09-28 13:02  tlnshuju  阅读(0)  评论(0)    收藏  举报

在开发和部署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. 域名无法访问(但域名+端口可访问)

五、最终验证与最佳实践

1. 验证反向代理生效

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.mzph.cn/news/920666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站开发数据流程图怎么画手机上传视频网站开发

1 Java IO流的概念,分类1.1 Java IO流的概念java的IO是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。流的本质是数据传输&#xff0c…

web3实战工程 - hardhat框架

web3实战工程 - hardhat框架pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

重组蛋白表达中包涵体的形成与优化策略

重组蛋白表达中包涵体的形成与优化策略 重组蛋白广泛应用于基础研究、生物制药和工业酶制剂等领域。大肠杆菌(Escherichia coli)因生长快、操作简便、成本低、表达量高,长期作为主要的重组蛋白宿主。然而高水平表达…

【MySQL】性能优化与核心机制深度解析 - 详解

【MySQL】性能优化与核心机制深度解析 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

程序员究竟要不要写文章

写在前面 时光飞逝,一晃已经从业七年有余,若从接触编程的时间算起,恐怕还要再加个四五年,可以堂而皇之地自称为拥有十多年的编程经验了,哈哈。 一路上,经常会有人问我,我们为什么要写文章甚至博客,有什么意义吗…

B4375 [蓝桥杯青少年组省赛 2025] 庆典队列B4376 [蓝桥杯青少年组省赛 2025] 茶具套装B4377 [蓝桥杯青少年组省赛 2025] 平衡奇偶位置的字符交换

好久不见,最近参加了蓝桥的省赛,虽然只是省二,但是还是要总结一下 今儿个三合一,前三道 1.B4375 [蓝桥杯青少年组省赛 2025] 庆典队列 题目描述 有 \(n\) 名志愿者参加了一场庆典活动,我们希望将这些人排成一个矩…

2025 年纽扣电池厂家:力源电池以 TWS 适配技术与定制服务,打造多场景电源解决方案

在 5G 技术全面普及与智能穿戴设备市场爆发的双重驱动下,纽扣电池市场需求持续攀升,2024 年全球市场规模已达 49.58 亿美元,预计 2025 年将保持 6.3% 的复合增长率。其中 TWS 耳机作为核心应用场景占比达 18%,对电…

web3hardhat 框架实战-ERC20 - 指南

web3hardhat 框架实战-ERC20 - 指南2025-09-28 12:46 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

网站开发人员定罪案例汽车网站建设公司哪家好

如果网站跑在了LAMP环境中,就无法使用php-fpm的slow log了,那如何分析瓶颈点?没关系你还可以使用这个XdebugWebgrind,其中Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析…

网站建设与管理报告市场运营和市场营销的区别

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析1.X-S-HEADER参数2.请求参数data3.响应机密值data一、前言 网址: aHR0cHM6Ly93d3cubGFnb3UuY29t…

网站访问工具wordpress文章模块化插件

在网络通信中,密钥的安全分发和公钥的有效认证是确保系统安全的关键。本文将为基础小白介绍密钥分发与公钥认证的基本概念和实际应用,帮助大家更好地理解这些技术如何保障我们的网络通信安全。 1. 密钥分发与公钥认证的背景 由于密码算法是公开的&…

wordpress中怎么排序上饶网站优化

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

crewCTF 2025 -- WASM Vault

从 js 中看出,先把输入的 flag 存到 wasm 的内存为 0 的位置,然后调用 vault.wasm 导出的 unlock() 函数判断 这里用开源项目 wabt 把 wasm 转成 c 文件,再用 gcc 编译成二进制文件,这样就可以拖到 ida 里分析了 w…

东莞做网站的模块网站怎么做

1 非静态代码块非静态代码块特点①可以为实例变量(非静态的属性)初始化②每次创建对象的时候,都会执行一次,且先于构造器执行③若有多个非静态的代码块,那么按照定义的顺序从上到下依次执行④代码块中既可以调用非静态的变量和方法&#xff0…

神经网络常见的40多种激活函数(应用场景+数学公式+代码实现+函数图象)

长文预警:经典的、大模型用的、探索研究的,这里都有什么是激活函数 激活函数,属于神经网络中的概念。 激活函数,就像神经元的开关,决定了输入信号能否被传递,以及以什么形式传递。 为应对不同的场景,激活函数不…

oppo-r9m线刷刷机教程

前言全局说明oppo-r9m线刷刷机教程一、说明 1.1 环境: Windows 7 旗舰版二、刷机首次刷机,电脑需要安装驱动2.1 打开刷机工具 找到”刷机工具.exe”双击打开如下图 (如果工具打不开以管理员身份运行打开。)2.2 手机…

【DateTime】日期时间:时间处理的基础

【DateTime】日期时间:时间处理的基础教学说明:本篇因 DateTime 数据类型需要,将提前使用 Get-Date 函数。该函数会在后续 “初级篇” 中详细讲解,此处仅用于演示 DateTime 类型的基本操作。 在编程中,日期时间(…

网站建设行业新闻南宁网站建设推广服务

(2011-10-08 17:08:43) 转载▼标签: 杂谈 分类: Javatry{//代码区}catch(Exception e){//异常处理}代码区如果有错误,就会返回所写异常的处理。 首先要清楚,如果没有try的话,出现异常会导致程序崩溃。而try则可以保证…

地图制作网站小程序定制开发和模板有什么区别

大家好,我是写代码的篮球。计算机专业的小伙伴,在学校期间一定学过 C 语言。它是众多高级语言的鼻祖,深入学习这门语言会对计算机原理、操作系统、内存管理等等底层相关的知识会有更深入的了解,所以我在直播的时候,多次…

完整教程:蒸汽机革命后工业生产方式的变革与AI智能名片S2B2C商城小程序的影响

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …