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

【Nginx反向代理】通过Nginx反向代理将多个后端server统一到同一个端口上的方法

文章目录

  • 前言
  • 解决方案:使用 Nginx 做统一反向代理

前言

在多人开发任务中,如果不同人负责不同的后端接口服务开发,那么就面临着每个人的服务部署到不同的端口上,甚至有的人的服务部署在不同的服务器上。这时候前端如果想要调用后端的接口,就非常麻烦。

比如下面这种情况:

  • 开发者 A 的接口部署在 http://localhost:5051/api/…

  • 开发者 B 的接口部署在 http://localhost:5351/api/…

  • 开发者 C 的服务部署在另一台服务器上:http://remote-server.com:8000/items/…

前端要分别调用这些接口,就需要处理多个端口、多个 IP 地址,还要配置跨域等问题,既复杂又容易出错。

解决方案:使用 Nginx 做统一反向代理

我们可以通过部署一个 Nginx 服务来统一入口端口,例如统一通过 http://api.example.com:5053 访问不同的后端接口,内部再根据请求路径转发给对应的服务。这样,前端只需要记住一个地址和端口,调用 /api1/、/api2/、/api3/ 即可访问不同的服务。

服务器端nginx安装命令:

#  在 Ubuntu上安装
sudo apt update
sudo apt install nginx -y# 在 CentOS上安装
sudo yum install epel-release -y
sudo yum install nginx -y

Nginx 配置示例:
在服务器上安装 Nginx 后,编辑配置文件(如 /etc/nginx/conf.d/api_gateway.conf),示例如下:
编辑命令:sudo vi /etc/nginx/nginx.conf

server {listen 5053;server_name api.example.com;# 代理开发者 A 的服务:本机 5051 端口location /api1/ {proxy_pass http://127.0.0.1:5051/api/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}# 代理开发者 B 的服务:本机 5351 端口location /api2/ {proxy_pass http://127.0.0.1:5351/api/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}# 代理开发者 C 的服务:远程服务器location /api3/ {proxy_pass http://remote-server.com:8000/items/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

请求映射关系

前端请求路径实际代理后的路径
http://api.example.com:5053/api1/xxxhttp://127.0.0.1:5051/api/xxx
http://api.example.com:5053/api2/xxxhttp://127.0.0.1:5351/api/xxx
http://api.example.com:5053/api3/xxxhttp://remote-server.com:8000/items/xxx

这样做的好处是:

  • 安全性更高(隐藏内部服务细节)
  • 跨域问题由后端集中处理(CORS配置)
  • 负载均衡和路由管理更灵活
  • 前端无需处理多端口逻辑

Nginx常用命令:

操作命令说明
启动 Nginxsudo systemctl start nginx启动服务
停止 Nginxsudo systemctl stop nginx停止服务
重启 Nginxsudo systemctl restart nginx重启服务(配置变更后常用)
重新加载配置sudo nginx -s reload热重载配置文件(不中断服务)
查看状态sudo systemctl status nginx查看服务是否运行中
查看版本nginx -v查看安装版本
测试配置sudo nginx -t检查配置文件语法是否正确
http://www.lryc.cn/news/607564.html

相关文章:

  • 算法题——数组
  • Implement recovery based on PITR using dump file and binlog
  • Deep Height Decoupling for Precise Vision-based 3D Occupancy Prediction
  • 【JAVA面试】基础篇
  • 代码随想录算法训练营三十三天|动态规划part06
  • GenieWizard: Multimodal App Feature Discovery with LargeLanguage Models
  • 直播平台中的美白滤镜实现:美颜SDK的核心架构与性能优化指南
  • Java 22 新特性解析与代码示例
  • Corrosion2靶机攻略
  • three.js实现随机山脉波纹效果
  • 【LeetCode刷题指南】--单值二叉树,相同的树
  • RustFS:高性能文件存储与部署解决方案(MinIO替代方案)
  • session和cookie作用详解
  • Solana:解决Anchor Build编译程序报错 no method named `source_file` found for struct
  • 设计模式1:创建型模式
  • 后台管理系统权限管理:前端实现详解
  • PDFsam免费开源!PDF分割合并工具
  • unity学习——视觉小说开发(一)
  • AI应用UX设计:让技术更懂用户
  • Android Jetpack 系列(五)Room 本地数据库实战详解
  • 第一个大语言模型的微调
  • Transformer架构全解析:搭建AI的“神经网络大厦“
  • Spring之【循环引用】
  • 插件升级:Chat/Builder 合并,支持自定义 Agent、MCP、Rules
  • 小学阶段的学习机推荐:科大讯飞T30、Lumie 10学习机暑期16项AI功能升级
  • 代码随想录day52图论3
  • Effective C++ 条款15:在资源管理类中提供对原始资源的访问
  • ICML 2025 | 深度剖析时序 Transformer:为何有效,瓶颈何在?
  • qt中的手势
  • STM32学习记录--Day5