高效管理多后端服务:Nginx 配置与实践指南

news2025/5/21 2:36:44

在现代的 Web 开发和运维中,一个系统往往由多个后端服务组成,每个服务负责不同的功能模块。例如,一个电商网站可能包括用户服务、订单服务和支付服务,每个服务都运行在独立的服务器或容器中。为了高效地管理这些服务并提供统一的访问接口,Nginx 作为反向代理服务器的角色变得至关重要。

场景概述

假设我们有以下三个后端服务,每个服务对应不同的域名:

  • A 服务:域名 demoai.cn,后端运行在 http://127.0.0.1:8815
  • B 服务:域名 bb.demoai.cn,后端运行在 http://127.0.0.1:8816
  • C 服务:域名 cc.demoai.cn,后端运行在 http://127.0.0.1:8817

我们的目标是通过 Nginx 配置,将用户对这些域名的请求正确地转发到对应的后端服务,并确保整个过程安全、高效。

Nginx 配置详解

1. 全局配置

首先,我们定义 Nginx 的全局配置,包括工作进程数和每个进程的最大连接数:

worker_processes  1;
events {
    worker_connections  1024;
}
  • worker_processes:设置 Nginx 使用的工作进程数。对于小型应用或开发环境,设置为 1 是足够的。在生产环境中,通常会设置为 CPU 核心数。
  • worker_connections:每个工作进程可以处理的最大连接数。根据你的服务器性能和预期流量调整此值。

2. HTTP 配置

接下来,我们定义 HTTP 配置块,包含一些通用的设置:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  • include mime.types:加载 MIME 类型配置文件,确保 Nginx 能够正确处理各种文件类型。
  • default_type:设置默认的 MIME 类型。
  • sendfile on:启用高效文件传输,适用于静态文件服务。
  • keepalive_timeout:设置客户端连接保持活动的时间。

3. HTTP 重定向到 HTTPS

为了确保所有 HTTP 请求都被重定向到 HTTPS,我们配置一个 server 块:

server {
    listen       80;
    server_name  demoai.cn bb.demoai.cn cc.demoai.cn;
    rewrite ^(.*)$ https://$host$1 permanent;
}
  • listen 80:监听 HTTP 端口 80。
  • server_name:包含所有可能的域名。
  • rewrite:将所有 HTTP 请求重定向到 HTTPS,使用 301 永久重定向。

4. HTTPS 配置

为每个域名配置一个独立的 server 块,指定不同的 proxy_pass 目标,将请求转发到对应的后端服务。

A 服务(demoai.cn
server {
    listen       443 ssl;
    server_name  demoai.cn;
    ssl_certificate /root/card/demoai.cn_bundle.pem;
    ssl_certificate_key /root/card/demoai.cn.key;

    location / {
        proxy_pass http://127.0.0.1:8815;  # A服务的后端地址
        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;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
B 服务(bb.demoai.cn
server {
    listen       443 ssl;
    server_name  bb.demoai.cn;
    ssl_certificate /root/card/demoai.cn_bundle.pem;
    ssl_certificate_key /root/card/demoai.cn.key;

    location / {
        proxy_pass http://127.0.0.1:8816;  # B服务的后端地址
        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;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
C 服务(cc.demoai.cn
server {
    listen       443 ssl;
    server_name  cc.demoai.cn;
    ssl_certificate /root/card/demoai.cn_bundle.pem;
    ssl_certificate_key /root/card/demoai.cn.key;

    location / {
        proxy_pass http://127.0.0.1:8817;  # C服务的后端地址
        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;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

5. 通用配置

每个 server 块中都包含了以下通用配置:

  • proxy_set_header:设置转发的 HTTP 头,确保后端服务可以获取正确的客户端信息。
  • error_page:定义错误页面的路径。
  • location = /50x.html:指定错误页面的根目录。

后端服务部署

确保每个后端服务(如 Docker 容器)正在运行,并且监听在指定的端口上。例如:

# 启动 A 服务
docker run -d --name a-service -p 8815:80 aa-website:latest

# 启动 B 服务
docker run -d --name b-service -p 8816:80 bb-website:latest

# 启动 C 服务
docker run -d --name c-service -p 8817:80 cc-website:latest

测试与验证

  1. 检查 Nginx 配置

    nginx -t
    

    确保配置文件没有语法错误。

  2. 重新加载 Nginx

    nginx -s reload
    
  3. 访问服务

    • 访问 https://demoai.cn,应转发到 http://127.0.0.1:8815
    • 访问 https://bb.demoai.cn,应转发到 http://127.0.0.1:8816
    • 访问 https://cc.demoai.cn,应转发到 http://127.0.0.1:8817

常见问题与解决方法

1. 网络问题

如果你在访问某些服务时遇到问题(如无法解析 http://127.0.0.1:8815),可能是由于以下原因之一:

  • 后端服务未运行:确保 Docker 容器正在运行。
    docker ps
    
  • 网络问题:确保本地网络没有问题,可以尝试直接访问后端服务的地址。
    curl http://127.0.0.1:8815
    
  • 防火墙限制:确保没有防火墙规则阻止访问指定端口。
    sudo ufw allow 8815/tcp
    sudo ufw allow 8816/tcp
    sudo ufw allow 8817/tcp
    

2. 配置错误

检查 Nginx 配置文件是否有拼写错误或逻辑问题。可以使用以下命令测试配置文件:

nginx -t

3. SSL 证书问题

确保 SSL 证书和私钥路径正确,并且文件权限正确。例如:

ls -l /root/card/demoai.cn_bundle.pem
ls -l /root/card/demoai.cn.key

结论

通过合理配置 Nginx,可以高效地管理多个后端服务,确保每个域名的请求都被正确转发到对应的后端服务。这种配置不仅提高了系统的可维护性,还增强了安全性(通过 HTTPS)。希望本文的示例和解决方法能帮助你在实际项目中快速实现高效的多后端服务管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380395.html

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

相关文章

阻塞队列:线程安全与生产者消费者模型解析

一、阻塞队列 阻塞队列就是基于普通队列做出扩展 1.线程安全的 如果针对一个已经满了的队列进行入队列,此时入队列操作就会阻塞,一直阻塞到队列不满(其他线程出队列元素)之后 如果针对一个已经空了的队列进行出队列&#xff0c…

【入门|Docker】基础知识扫盲:什么是 Docker?

文章目录 基础知识扫盲:什么是 Docker?Docker 是什么?Docker 核心组件Docker 与虚拟机的区别Docker 在现代开发中的核心角色Docker 的局限性 基础知识扫盲:什么是 Docker? 最近打算开始系统性地学习与云计算相关的技术…

【MYSQL】基本查询,表的增删查改

📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 |🗃️ mysql 摘要:本文详细介绍了MySQL中的CRUD操作(创…

Android Studio 日志系统详解

文章目录 一、Android 日志系统基础1. Log 类2. 日志级别 二、Android Studio 中的 Logcat1. 打开 Logcat2. Logcat 界面组成3. 常用 Logcat 命令 三、高级日志技巧1. 自定义日志工具类2. 打印方法调用栈3. 打印长日志4. JSON 和 XML 格式化输出 四、Logcat 高级功能1. 自定义日…

Feign异步模式丢失上下文问题

Feign异步模式丢失上下文问题 问题描述 当我们使用异步对我们代码进行操作优化时,代码中使用了RequestContextHolder去获取上下文的数据,当我们执行原来可以执行的业务时发现报了空指针异常或数据为空,这是为什么呢? 原理解释 …

【AWS入门】Amazon SageMaker简介

【AWS入门】Amazon SageMaker简介 [AWS Essentials] Brief Introduction to Amazon SageMaker By JacksonML 机器学习(Machine Learning,简称ML) 是当代流行的计算机科学分支技术。通常,人们在本地部署搭建环境,以满足机器学习的要求。 AWS…

MYSQL 故障排查与生产环境优化

目录 一.前置知识点 1. 案例需求 (1)mysql 常见故障解决 (2)mysql 性能优化 2.案例实施思路 (1)单库常见故障分析 (2)主从常见故障分析 (3)从几个不同…

解决使用@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss“, timezone = “GMT+8“)时区转换无效的问题

前言 对于一些时间的字段,我们从数据库查询出来通常需要转换后返回给前端展示,前端需要的格式一般为yyyy-MM-dd HH:mm:ss,可以通过JsonFormat注解来作转换和时区转换。 问题场景 原因 LocalDateTime类本身不带时区信息所以转换无效 解决办…

计算机网络概要

⽹络相关基础知识 协议 两设备之间使⽤光电信号传输信息数据 要想传递不同信息 那么⼆者ᳵ就需要约定好的数据格式 层 封装 继承 多态是计算机的性质 它们⽀持了软硬件分层的实现 同层协议可以ᳵ接通信 同层协议ᳵ不直接通信 是各⾃调⽤下层提供的结构能⼒完成通信 分层…

Word压缩解决方案

Word压缩解决方案:基于图片压缩的 .docx 优化实践 📌 背景 在日常科研写作或项目文档整理中,Word 文档(.docx)往往因为插入大量高清图表、扫描图像、公式图等导致文件体积过大,或者毕业学位论文查重要求上…

TDengine 2025年产品路线图

TDengine OSS 之 2025 年年度路线图如下表所示。 季度功能2025Q1 虚拟表查询能力:REGEXP、GREATEST、LEAST、CAST 函数支持判断表达式、单行选择函数的其他列值、INTERP 支持插值时间范围存储能力:支持将查询结果写入超级表、超级表支持 KEEP 参数、STM…

Ubuntu服务器部署多语言项目(Node.js/Python)方式实践

Ubuntu服务器部署多语言项目(Node.js/Python)方式实践 服务器脚本运行方式命令行直接执行nohup后台执行进程 Screen概述安装基本操作命令启动 Screen退出当前会话(不终止进程)查看所有会话重连会话关闭会话 常用快捷键典型使用场景…

计算机网络 - 2.基础协议

1.TCP协议 1.TCP(Transmission Control Protocol):传输控制协议2.TCP协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议 1.面向连接:两个使用TCP协议的应用(通常一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接2.可靠的 1.数据传输之前都要建立…

初识css,css语法怎样学好css以及常见问题与避坑

一、CSS 是什么? CSS(Cascading Style Sheets)是一种用于描述网页文档(HTML 或 XML)呈现样式的语言。它负责控制网页元素的视觉表现,如颜色、字体、布局等,使内容与展示分离。 二、CSS 语法结构…

Axure疑难杂症:垂直菜单展开与收回(4大核心问题与专家级解决方案)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:垂直菜单展开与收回 主要内容:超长菜单实现、展开与收回bug解释、Axure9版本限制等问题解…

vue2.0 组件生命周期

个人简介 👨‍💻‍个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…

在Linux服务器上部署Jupyter Notebook并实现ssh无密码远程访问

Jupyter notebook版本7.4.2(这个版本AI提示我Jupyter7(底层是 jupyter_server 2.x) 服务器开启服务 安装Jupyter notebook 7.4.2成功后,终端输入 jupyter notebook --generate-config 这将在 ~/.jupyter/ 目录下生成 jupyter_…

GPU 超级节点:AWS Trainium2 UltraServer

目录 文章目录 目录时间线Inferentia1Trainium1Inferentia2Trainium2Trainium2 ServerTrainium2 UltraServerTrainium2 UltraClustersTrainium3AWS GPU 实例矩阵与竞品分析SuperNode RackTrn2 ServerTrn2U Server ScaleUp 网络PCIe Gen5:CPU-Trainium2 ScaleUpNeuro…

git仓库中.git 文件很大,怎么清理掉一部分

查询 .git 文件大小,在 git-bash 里执行(后面有些命令不能执行,也请在 git-bash 里执行) windows11 安装好后右键没有 git bash 命令-CSDN博客 du -sh .git // 592m .git 操作前最好先备份一份,避免推送到远程时出错…

MySQL安装实战指南:Mac、Windows与Docker全平台详解

MySQL作为世界上最流行的开源关系型数据库,是每位开发者必须掌握的基础技能。本指南将手把手带你完成三大平台的MySQL安装,从下载到配置,每个步骤都配有详细说明和截图,特别适合新手学习。 一、Mac系统安装MySQL 1.1 通过Homebre…