如何在 docker 容器使用 nginx 实现反向代理统一站点入口

news2025/1/11 5:13:10

在微服务架构下,我们会部署很多微服务来实现我们的系统。每个微服务会有不同的端口。而用户在访问我们的站点时希望通过统一的端口来访问所有的服务,因为在很多情况下用户只能通过 80 或者 443 端口访问外界服务。

这个时候我们就可以使用反向代理来实现统一网站访问入口的意图。
在这里插入图片描述
如上图所示,如果没有反向代理,用户通过浏览器访问 UI 服务需要使用 8080 端口,UI 服务调用 API 服务的资源去执行某个任务需要调用 8081 端口。如果用户的防火墙不能访问8081端口,那么用户的服务请求就会失败。另外把后台服务直接暴露给客户端,会把安全压力全都转给了每个后台服务上,另一方面每个服务都需要自己去实现诸如负载均衡、熔断、限流等防护措施。

在这里插入图片描述
如上图所示,使用反向代理,客户所有的访问统一经过80端口,通过不同的路径把请求路由到对应的服务上。比如使用 http://hostnamt/ui 访问 UI 服务,使用 http://hostname/api 访问 API 服务。

这样后台服务不再暴露给外界客户端,用户也不用担心因为防火墙限制而造成某些服务不能被访问的问题。

使用 nginx 容器实现反向代理

Docker 容器化的解决方案简化了微服务的部署。对于上图中的 3 个服务,我们可以用 3 个容器来实现,其中一个容器用 nginx 来做反向代理。具体步骤如下:

  1. 从 Docker hub 下载 nginx 容器镜像
  2. 运行这个镜像成为一个容器
  3. 从这个容器中复制 nginx 配置文件
  4. 增加 proxy_pass 配置,把访问路径指向后端服务
  5. 制作 dockfile 生成反向代理镜像文件

启动 nginx 服务

使用下面的命令启动 nginx 服务

sudo docker run -d --name mynginx -p 80:80 nginx:latest

从容器中复制 nginx 配置文件

sudo docker cp mynginx:/etc/nginx/conf.d/default.conf ~/default.conf

配置 nginx 增加一条反向代理

假设我们有一个服务的访问地址是:http://localhost:8080/ui, 另一个是 http://localhost:8081/api

那么我们可以给上面的 default.conf 文件增加两条反向代理指令,将来我们可以通过 http://localhost/ui 和 http://localhost/api 直接访问我们的后台服务。

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

	location /ui {
		proxy_pass http://localhost:8080/ui;
		proxy_buffering off;
  		proxy_set_header X-Real-IP $remote_addr;
	}

    location /api {
		proxy_pass http://localhost:8081/api;
		proxy_buffering off;
  		proxy_set_header X-Real-IP $remote_addr;
	}

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

制作 dockerfile

我们的 dockerfile应该类似于下面的样子。它的作用就是把我们修改后的 default.conf 文件代替原来的配置文件。

FROM nginx
COPY ~/default.conf /etc/nginx/conf.d/default.conf

运行下面的命令就可以生成我们的 nginx 反向代理容器镜像了。

docker build

结论

反向代理可以简化客户端访问后台服务的过程。我们通过改变 nginx Docker镜像可以给我们的 docker 容器化的微服务制作方向代理服务。

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

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

相关文章

云上“两地三中心”,中小企业都用得起的多保险灾备方案

在云时代,大部分中小型企业都奔跑在云上或是服务器托管公司。任何规模的数据中心服务中断都会让你的企业踩雷。据统计,80%的数据中心服务中断都是由服务器硬件造成的。 据万博智云不完全统计: 2021年3月,一场大火完全摧毁了OVH在…

[附源码]计算机毕业设计SpringBoot蛋糕购物商城

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

如何将pdf转word?这几个软件可以做到文档格式转换

我们在日常办公中使用较为频繁的就是pdf和word两种文件格式,pdf的兼容性较好,就算跨设备传输也不会出现乱码的情况;word文档可以直接进行编辑修改,各有各的好处。如果我们想对pdf的内容进行修改的话,就需要把pdf文件转…

优维低代码:Redirect 路由重定向If 条件渲染

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 连载…

Centos7扩容root分区

Background 安装centos7系统时,如果没有自定义分区,系统默认给root分配的空间只有50G,其他空间都分配给了你创建的普通用户/home目录。这里我们把home的空间匀出一部分给root。 1、首先要注意数据安全 备份home目录的数据 tar zcf /tmp/hom…

vue学习1~18

1. vue基础知识和原理 1.1 初识Vue 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象demo容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法demo容器里的代码被称为【Vue模板】Vue实例和容器是一一对应的真实开发中只有…

城市三维地理信息可视化 技术解析

一、三维地理信息系统分析空间数据的科学工具 三维地理信息系统,即三维GIS,是对包括大气层在内的地球表层,与地理有关的数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。 基于三维GIS将现实世界中三维对象的相关属性与空间位…

什么是CRM系统?CRM的价值体现在哪里?

图为简道云看板对企业来说,完整的工作流程可以概括为售前、售中和售后三个阶段。每一个阶段都需要不同的管理。而CRM客户关系管理系统,能够帮助企业在这三个阶段进行业务管理及客户管理,帮助企业更好地运营,提高企业的竞争力。 简…

软件设计与体系结构简答题汇总

假设系统中有三个类,分别为类 A 、类 B 和类 C 。在现有的设计中,让类 A 直接依赖类 B ,如果要将类 A 改为依赖类 C ,必须通过修改类 A 的代码来达成,请问这样的设计符合开闭原则吗( 2 分)&…

跟着官方帮助文档学ICEM网格划分(附视频教程)

作者 | 如鹰展翅上腾 导读:划分结构化网格是ICEM软件的一大特色,自学的话会比较耗时,如有人带的话,入门进阶都是比较快的,就像一层窗户纸一捅就破。软件是使我们研究的问题得以求解的工具,重点侧向于操作…

毕业设计 基于大数据的服务器数据分析与可视化系统 -python 可视化 大数据

文章目录0 前言1 课题背景2 实现效果3 数据收集分析过程**总体框架图****kafka 创建日志主题****flume 收集日志写到 kafka****python 读取 kafka 实时处理****数据分析可视化**4 Flask框架5 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升&…

企业数据流转5个大坑,你最烦哪个?

对于公司来说,注重数据安全已然是一个必须项,如何保护数据安全也是让公司管理者头痛的问题。 云宝贝罗列了公司5个常见的数据安全场景,并给出了应对方法,看看你公司有没有踩雷。 01、文件云端流转,不落地 “员工在公…

【初阶数据结构】——限定性线性表:栈 和 队列详解(C描述)

文章目录前言1. 栈1.1 栈的概念及结构1.2栈的实现1.2.1 动态or静态1.2.2 结构介绍1.2.3 初始化栈1.2.4 销毁栈1.2.5 压栈1.2.6 出栈1.2.7 判空1.2.8 取栈顶元素1.2.9 获取有效元素个数1.3 测试1.4 源码展示1.4.1 stack.h1.4.2 stack.c1.4.3 test.c2. 队列2.1 队列的概念及结构2…

2022年最新全国各省五级行政区划代码及名称数据(省-市-区县-乡镇-村)

1、数据来源:国家统计局 2、官方更新时间:2021年10月31日 3、数据样例: 包括字段:省份名称、城市代码、城市名称、区县代码、区县名称、乡镇街道代码、乡镇街道名称、居委会村代码、城乡分类代码、居委会村名称、完整五级地址 …

Java的JFrame窗体的创建(两种方法)

第一种直接创建 package com.jwz.h综合项目;import javax.swing.*;public class Test {public static void main(String[] args) {//创建宽高jFrame.setSize(488, 580);//创建窗口对象JFrame jFrame new JFrame();jFrame.setTitle("拼图游戏");//设置标题jFrame.se…

肝了47天最终上岸美团,这份最新版千页Java八股到底是有多全面?

上周接到美团HR打来的电话(吃惊!),居然约我面试。 一面和二面都是电话面试,一面的的时候美团小哥给我一个链接,需要手写代码就在那个页面里面写。一面比较顺利,感觉美团问得挺全面的。二面的时…

数据机构——顺序表的基本操作

一、实验要求 二、实验代码 # include "bits/stdc.h"using namespace std;#define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 //定义顺序表的最大长度//定义数据结构体 typedef struct book {int number; //编号string name; //名称float p…

二、CSS下拉菜单[颜色布局、子影响父]

一、源码 效果 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

python+pyautogui—PC端自动化(二)键盘鼠标及对话框操作

目录 鼠标操作 获取鼠标所在位置坐标 获取鼠标所在位置的RGB值 鼠标点击 鼠标按下和释放 鼠标移动 鼠标拖拽 滚轮滚动 键盘操作 输入英文字符 普通按键操作press 按下与抬起 组合键hotkey 持续按键hold 弹出对话框 alert confirm prompt password 鼠标操作 …

iconfont在vue项目中的使用及如何在一个项目中引入多个iconfont图标库

iconfont的使用 下载方式本文不做详细的展示 重点演示一下同一个项目如何使用两个图标库 有的时候在一个项目的基础上,把当前的项目改为另一个项目,不想影响到当前的字体图标,或者不知道之前的字体图标管理的图标库在哪里了.再引入一个新的字体图标库不失为一个好办法,那么如何…