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,本篇博客实现的功能只是一个大项目中的小环节,等整个大项目完成差不多之后再性能调优。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript系列——Promise

文章目录 概要Promise三种状态状态改变Promise链式调用Promise处理并发promise.all()promise.allSettled()Promise.any()promise.race() 小结 概要 Promise中文翻译过来就是承诺、预示、有可能的意思。 在JavaScript里面,Promise 是一个对象…

2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题(正式赛)

2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题 理论技能与职业素养(100分) 2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题 【注意事项】 Geek极安云科专注技能竞赛技术提升,基于各大赛项提供全面的系统性…

【JAVA】哪些集合类是线程安全的

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 Vector: HashTable: Collections.synchronizedList()、Collections.synchronizedSet()、Collections.syn…

网络地图服务(WMS)详解

文章目录 1.概述2.GetCapabilities3.GetMap4.GetFeatureInfo 阅读本文之前可参考前文:《地图服务器GeoServer的安装与配置》与《GeoServer发布地图服务(WMS、WFS)》。 1.概述 经过前文的介绍,相信我们对WMS/WFS服务已经有了一个非…

收银系统源码收银系统OEM定制开发(收银POS+线上商城+ERP+营销插件+聚合支付)

源码:零售行业线下线上一体化收银系统 1.开发语言 核心开发语言: php、HTML5、JavaPHP开发环境:php7.3安卓端收银、助手: 原生的JavaPC收银端: HTML5vuecssjsnwjs微信小程序助手: 原生小程序开发商城: uniapp后合管理网站: HTML5vueelement-uicssjs 2…

基于Java SSM框架实现在线作业管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现在线作业管理系统演示 JSP技术 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了运动员的需求…

day01

文章目录 创建Vue实例插值表达式响应式数据常见标签v-htmlv-show v-ifv-if v-else-if v-elsev-onv-bindv-forv-model 综合案例 创建Vue实例 <!--创建Vue实例&#xff0c;初始化渲染1. 准备容器2. 引包&#xff08;官网&#xff09; — 开发版本/生产版本3. 创建Vue实例 ne…

配置DNS

vim /etc/named.conf vim /etc/named.rfc1912.zones cp named.localhost ./kgc.com.zone -p vim kgc.com.zone 设置备用dns服务器 修改主配置文件&#xff0c;并自动同步到从服务器

Zung氏焦虑症测试SAS

SAS被称为焦虑自评量表&#xff0c;是一种用来测量焦虑症状程度以及观察治疗过程中变化情况的心理量表。主要用于评估心理状态&#xff0c;辅助参考数据&#xff0c;也是焦虑评定的标准。焦虑自评量表系是由William W.K. Zung编制的&#xff0c;该量表已成为心理咨询师、心理医…

COBOL语言 :一种主要专注于解决业务问题的编程语言

译文&#xff1a; 什么是COBOL? COBOL是一种主要专注于解决业务问题的编程语言。COBOL的完整形式是面向业务的通用语言。它主要用于公司和政府的商业、金融和行政系统。这种语言也被用来解决许多数据处理问题。 它是由CODASYL(数据系统语言会议)开发的。它被用作大型机中的一…

解决报错:AttributeError: module ‘torch‘ has no attribute ‘_six‘

报错代码&#xff1a; if torch._six.PY3:import importlibimport importlib.utilimport sys这里的意思是判断你的python版本是否是python3&#xff0c;如果是PY37&#xff0c;就是判断你的python版本是不是python3.7&#xff0c;源码&#xff1a; PY37 sys.version_info[0]…

Keil5如何生成反汇编文件

Keil5如何生成反汇编文件 在Keil5界面下点击选项&#xff0c;选择“User”&#xff0c;勾选“After Build/Rebuild”中“RUN #1”&#xff0c;复制fromelf --text -a -c --outputxxx.dis xxx.axf 在Linker栏中找到“Linker Control string”里最后-o后的.axf文件&#xff0c;将…

街机模拟游戏逆向工程(HACKROM)教程:[1]数据的存储与读取

简介 在计算机中&#xff0c;数据存储的介质一直在变化&#xff0c;从最早的穿孔纸带&#xff0c;到现在的固态硬盘。但存储的原理是一直没有变化的&#xff0c;在计算机中&#xff0c;我们所存储的数据&#xff0c;一直都是以二进制的形式被存储存在不同的介质中。 计算机用…

Jenkins基础篇--凭据(Credential)管理

什么是凭据 Jenkins的Credentials直译为证书、文凭&#xff0c;我们可以理解为它是钥匙&#xff0c;用来做某些事情的认证。 如Jenkins 和 GitLab交互时&#xff0c;需要添加GitLab的API令牌和登录凭证。 如Jenkins 添加从节点时&#xff0c;需要添加从节点的登录凭证或者Je…

Linux的DHCP工作原理和dns服务器

目录 一、DHCP原理 1.DHCP的好处 2.DHCP的分配方式 3.实验 二、dns服务器 1.什么是dns 2.dns域名解析 3、在内网搭建dns 一、DHCP原理 DCHP工作原理使用C/S架构 &#xff08;1&#xff09;第一步&#xff0c;客户端广播发送一个discover报文寻找DHCP服务器。 &#…

网络爬虫丨基于requests+mysql爬取猫眼热门电影数据做可视化分析

文章目录 写在前面实验描述实验内容遇到问题 写在后面 写在前面 本期内容&#xff1a;基于requestsmysql爬取猫眼热门电影数据做可视化分析 实验需求 anaconda丨pycharmpython3.11.4requestsmysql 项目下载地址&#xff1a;https://download.csdn.net/download/m0_68111267…

OceanBase 4.2特性解读:Show Trace全链路跟踪,助力快速问题定位与精准诊断

在分布式数据库环境下&#xff0c;慢 SQL 诊断是运维人员面临的一大挑战。在无法及时发现问题根本原因的情况下&#xff0c;可能会严重影响用户体验&#xff0c;甚至会导致业务服务不可用。相对于单机数据库&#xff0c;分布式数据库系统涉及多个节点、多组件的协同工作&#x…

苍穹外卖学习----出错记录

1.微信开发者工具遇到的问题&#xff1a; 1.1appid消失报错&#xff1a; {errMsg: login:fail 系统错误,错误码:41002,appid missing [20240112 16:44:02][undefined]} 1.2解决方式&#xff1a; appid可在微信开发者官网 登录账号后在开发栏 找到 复制后按以下步骤粘贴即…

玩转 openEuler (一)-- 系统安装

简介 openEuler 是一款开源操作系统。当前 openEuler 内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、人工智能等…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-1 表单

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>表单</title> </head><body> <!--<form action"URL地址" method"提交方式" name"表单名称" /*编码“多部…