docker部署ng实现反向代理

场景

按规定尽可能减少开放到外网的端口,所以需要将多个服务部署到一个ip一个端口上。

方案

使用ng实现请求转发。根据http请求中的host与ng配置文件中的server_name匹配,转发到对应的机器上。
在docker上部署三个容器,每个容器中启动一个ng服务(这仨ng服务的欢迎页面不同,用以区分不同服务)。其中一个ng作为反向代理,另外ng作为http服务(之后这俩ng会被替换成其他服务,比如gitlab服务)。

实现

定制镜像

官方ng镜像中没有vim,而公司生产环境的电脑又不能直连互联网,所以需要在本地开发环境将ng镜像修改下然后部署到生产环境。

使用Dockerfile定制镜像。

FROM nginx:latest
RUN apt-get update && \apt-get install -y vim && \rm -rf /var/lib/apt/lists/*

在Dockerfile所在目录下执行如下命令

docker build -t nginx_wjl

不要使用docker commit定制镜像。具体原因参见《Docker从入门到实践 第三版》

成功定制镜像
在这里插入图片描述

部署

// 创建网络
docker network create ng_net// 反向代理
docker run --name mynginx0 --network ng_net -p 1080:80 -d nginx_wjl// 服务1
docker run --name mynginx1 --network ng_net -p 1081:80 -d nginx_wjl// 服务2
docker run --name mynginx2 --network ng_net -p 1082:80 -d nginx_wjl

修改文件

修改欢迎页面

vim /usr/share/nginx/html/index.html

修改反向代理的配置文件

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  'wjl $host wjl$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;server {listen 80;server_name server1.com;location / {proxy_pass http://mynginx1:80;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}server {listen 80;server_name server2.com;location / {proxy_pass http://mynginx2:80;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}

host

SwichHosts做如下配置

127.0.0.1 server1.com
127.0.0.1 server2.com

效果

反向代理欢迎页面
在这里插入图片描述

server1欢迎页面
在这里插入图片描述

server2欢迎页面
在这里插入图片描述

通过反向代理访问server1欢迎页面。虽然访问的是"server1.com",但由于之前修改了host,所以实际访问的ip是回环地址。
在这里插入图片描述

通过反向代理访问server2欢迎页面

在这里插入图片描述

其他

遇到的问题

host无效

用switchhosts配置完之后,命令行中可以发现功能都正常运行,但是在浏览器上就是无法访问相应服务。就好像浏览器没有将"server1.com"这个地址解析成回环地址。
询问ChatGPT,他告诉我可能是开了代理导致的。关闭代理后问题解决了。
在这里插入图片描述

docker网络

容器好像必须在一个docker网络下才能相互访问。docker网络这部分内容不太了解,有机会要学习下。

ng关键文件 欢迎页面 配置文件 日志

ng容器中的关键文件存储位置可能与平时本机或者win下的不一样。以下路径都是ChatGPT告诉我的,亲测有效。

// 欢迎页面
vim /usr/share/nginx/html/index.html// 配置文件
vim /etc/nginx/nginx.conf// 日志
vim /var/log/nginx/error.log
vim /var/log/nginx/access.log

日志无效

日志文件打开之后啥也没有,原因是ng镜像中的日志文件是链接,重定向到"stdout"和"stderr"。
在这里插入图片描述
若要通过文件形式查看日志,可以把镜像中自带的这俩文件删除,删除之后运行"nginx -s reload"。之后的日志就会显示到这俩文件中了。

这个问题原因的发现比较偶然,手一抖打出"ls -l"的命令,然后发现这是链接。

server_name

最开始的方案中没打算通过域名进行流量分发,想通过不同的uri实现流量分发。比如访问反向代理的"/server1/add",server1就会接收到一个"/add"请求。
实现过程中发现ng配置未生效,最后发现是因为server_name没配置回环地址,但我访问的时候用的是回环地址,所以导致配置文件没提供我想要的功能。

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  'wjlwjl$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;server {listen 80;server_name mynginx0 127.0.0.1;# 这里追加了回环地址。mynginx0这个是容器名,应该没啥用。location /n1 {proxy_pass http://mynginx1:80/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}location /n2 {proxy_pass http://mynginx2:80/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}

实现了"通过uri进行请求转发"的功能后,突然意识到可以按照server_name进行请求转发,所以本篇博客才以server_name作为请求转发的依据。

"server_name需要加回环地址"这个发现也是突然来的灵感。可能是在某个地方听说过这部分知识。

win&curl

排查问题的过程中,我尝试在容器内,在powershell,在cmd上使用curl测试请求。

curl -H "Host: server1.com" http://127.0.0.1

在反向代理容器中使用curl
在这里插入图片描述

但是curl在powershell中没法修改header,所以在powershell中使用了另一个指令

Invoke-WebRequest -Uri "http://127.0.0.1:1080" -Headers @{"Host" = "server1.com"}

在这里插入图片描述

待解决问题

反应慢

通过反向代理访问另外俩服务时反应比较慢。这个问题先delay,本篇博客实现的功能只是一个大项目中的小环节,等整个大项目完成差不多之后再性能调优。

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

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

相关文章

Java内存模型之可见性

文章目录 1.什么是可见性问题2.为什么会有可见性问题3.JMM的抽象:主内存和本地内存3.1 什么是主内存和本地内存3.2 主内存和本地内存的关系 4.Happens-Before原则4.1 什么是Happens-Before4.2 什么不是Happens-Before4.3 Happens-Before规则有哪些4.4 演示&#xff…

【SQL注入】SQLMAP v1.7.11.1 汉化版

下载链接 【SQL注入】SQLMAP v1.7.11.1 汉化版 简介 SQLMAP是一款开源的自动化SQL注入工具,用于扫描和利用Web应用程序中的SQL注入漏洞。它在安全测试领域被广泛应用,可用于检测和利用SQL注入漏洞,以验证应用程序的安全性。 SQL注入是一种…

调试(c语言)

前言: 我们在写程序的时候可能多多少少都会出现一些bug,使我们的程序不能正常运行,所以为了更快更好的找到并修复bug,使这些问题迎刃而解,学习好如何调试代码是每个学习编程的人所必备的技能。 1. 什么是bug&#xf…

UOS cryptsetup详细使用方法

1. 格式化为LUKS加密卷 格式化磁盘或分区为LUKS格式。这一步将清除所有现有数据,并设置一个新的加密密钥(密码)。 sudo cryptsetup luksFormat /dev/sdX其中 /dev/sdX 是要加密的磁盘或分区的路径。 2. 打开(解锁)加…

Java项目:06 Springboot的进销存管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 进销存管理系统 介绍 进销存系统是为了对企业生产经营中进货、出货、批发销售、付款等全程进行(从接获订单合同开 始,进入物料采购、入…

浅析Linux进程地址空间

前言 现代处理器基本都支持虚拟内存管理,在开启虚存管理时,程序只能访问到虚拟地址,处理器的内存管理单元(MMU)会自动完成虚拟地址到物理地址的转换。基于虚拟内存机制,操作系统可以为每个运行中的进程创建…

ros2+gazebo(ign)激光雷达+摄像头模拟

虽然ign不能模拟雷达,但是摄线头是可以模拟的。 好了现在都不用模拟了,ign摄线头也模拟不了。 ros2ign gazebo无法全部模拟摄线头和雷达。 只能有这样2个解决方法: 方法1:使用ros2 gazebo11 方案2:使用ros2买一个实…

一系列实用工具、编程工具和学习网站推荐

其他工具: 十分钟临时邮箱:https://www.linshi-email.com/Chrome极简插件:https://chrome.zzzmh.cn/#/indexPc桌面静态壁纸:https://ss.netnr.com/wallpaperProcessOn在线画图:https://www.processon.com/ 编程工具&a…

【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究

目录 主要内容 模型研究 结果一览 下载链接 主要内容 该模型以环境保护成本和运行成本为双目标构建了微电网优化调度模型,模型目标函数和约束条件复现文献《基于改进粒子群算法的微电网多目标优化调度》,程序的特点是采用非支配排序的蜣螂…

Redis缓存使用问题

数据一致性 只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。 以 Tomcat 向 MySQL 中写入和删改数据为例,来解释数据的增删改操作具体是如何进行的。 我们分析一下几种解决方案, 1、先更新缓存,再更新数据库 2、先更新数据库,…

2023年第十四届中国数据库技术大会(DTCC2023):核心内容与学习收获(附大会核心PPT下载)

随着信息化时代的深入发展,数据库技术作为支撑信息化应用的核心技术,其重要性日益凸显。本次大会以“数据价值,驱动未来”为主题,聚焦数据库领域的前沿技术与最新动态,吸引了数千名业界专家、企业代表和数据库技术爱好…

橘子学Spring01之spring的那些工厂和门面使用

一、Spring的工厂体系 我们先来说一下spring的工厂体系(也称之为容器),得益于大佬们对于单一职责模式的坚决贯彻,在十几年以来spring的发展路上,扩展出来大量的工厂类,每一个工厂类都承担着自己的功能(其实就是有对应的方法实现)…

阿里云云服务器u1实例和e实例有什么区别?

阿里云服务器u1和e实例有什么区别?ECS通用算力型u1实例是企业级独享型云服务器,ECS经济型e实例是共享型云服务器,所以相比较e实例,云服务器u1性能更好一些。e实例为共享型云服务器,共享型实例采用非绑定CPU调度模式&am…

监督学习 - 岭回归(Ridge Regression)

什么是机器学习 岭回归(Ridge Regression)是一种线性回归的扩展,它通过在损失函数中添加正则化项(L2范数)来解决线性回归中可能存在的过拟合问题。正则化项有助于限制模型的参数,使其不过分依赖于训练数据…

面试题目1

文章目录 1、安装系统的方法2、总线型3、OSL参考模型(网络七层模型)4、计算机系统的组成5、计算机硬件 1、安装系统的方法 U盘安装 硬盘安装 刻光盘安装 PE系统中安装 网络安装 2、总线型 所有设备都连接到公共总线上,结点间使用广播通信方…

Go语言实现各种hash算法

Go语言实现各种hash算法 1、各种hash算法的实现 package mainimport ("crypto""crypto/md5""crypto/sha1""crypto/sha256""crypto/sha512""encoding/hex""fmt""hash""golang.org/x/cr…

补充前端访问静态资源的一个错误

注意,前端访问时带上本地服务端的host,例如http://localhost:8080, 后端改写的代码如下,注意file后面一定是三个‘/’,不然的化虽然能解析,但访问不到。 Configuration public class LocalPathWebMvcConfigurer exte…

C++ 具名要求-全库范围的概念 -包含分配信息的类类型(Allocator)

此页面中列出的具名要求,是 C 标准的规范性文本中使用的具名要求,用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做&#xf…

LeetCode264. 丑数 II(相关话题:多重指针动态规划)

题目描述 给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 1: 输入:n 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。示例 2&am…

【Sharding-Sphere 整合SpringBoot】

Sharding-Jdbc在3.0后改名为Sharding-Sphere。Sharding-Sphere相关资料,请自行网上查阅,这里仅仅介绍了实战相关内容,算是抛砖引玉。 Sharding-Sphere 整合SpringBoot 一、项目准备二、项目实战1. pom.xml及application.yml2. OrderInfoCont…