近段时间需要实现一个转发 post 请求到指定后端服务的小工具,由于一直想学习 gin 框架,所以就使用这个框架进行尝试,预计会产生几篇文章。本文研究如何利用 nginx 容器和后端服务进行转发工具的测试。

概述

转发的工具实现起来比较简单,但为了验证,还需要使用其它工具配合,本文自编后端程序,并使用 nginx 实现多个后端程序的转发。
为方便理解,下面给出示例图。
不使用 nginx 实现转发如下图所示:

使用 nginx 实现转发如下图所示:

注意图中 URL 的变化。

后端服务

前面文章已经实现了简单的后端服务响应函数,此处不再列出。需要注意的是,因本系列转发和后端均用同一套代码,如果要在程序中启动后端服务,必须修改后端服务可执行文件名称,参考前文代码。

nginx容器启动及重启

本文使用镜像centos/nginx-116-centos7进行测试。简单启动如下:

docker run -itd --name nginx -p 84:8080 -v $PWD:/opt/bin centos/nginx-116-centos7 bash

实践中使用docker-compose启动,docker-compose.yml文件如下:

version: '2'services:nginx:image: centos/nginx-116-centos7container_name: nginxcommand: /bin/bash -c "/home/latelee/bin/run.sh"volumes:- $PWD/bin:/home/latelee/bin- $PWD/nginx/log:/var/opt/rh/rh-nginx116/log/nginx- $PWD/nginx/etc:/etc/nginx- /etc/localtime:/etc/localtime#environment:#  - ORACLE_HOME=/work/instantclient_12_1#  - TNS_ADMIN=$ORACLE_HOMEports:- 8080:8080- 8090:8090

注:后端服务程序(和启动脚本)以及 nginx 配置文件均放到主机目录,因为这样更容易更新。

为了在容器启动时运行自定义的命令,需要关闭 nginx 服务的后台执行,启动脚本 run.sh 内容如下:

#!/bin/bashecho "run..."
cd /home/latelee/binnginx -g "daemon off;"&sleep 1
./httpforward.exe -p 8090

关于在容器中启动 nginx 的方法,官方 docker 有介绍:

If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!

大意是说,当我们自定义启动命令时,必须添加-g daemon off,否则自定义命令启动完毕后,容器就会自动退出。

启动容器:

docker-compose up -d

查看日志:

docker-compose logs -f

默认情况下 nginx 已经启动了。如果修改了配置。可以重启容器,也可以在容器内重启,重启命令为nginx -s reloadnginx -s仅支持4个参数:stop, quit, reopen, reload,官方文档将其称为信号(signal)。如果执行nginx -s stop停止 nginx,再次重启,会提示nginx: [error] open() "/var/opt/rh/rh-nginx116/run/nginx/nginx.pid" failed (2: No such file or directory)。因此,修改 nginx 配置后,使用reload即可。

nginx 转发的一些测试

在笔者环境中,不论在容器内,还是在物理机,nginx 配置文件为/etc/nginx/nginx.conf(注:实际,nginx 还会读取/etc/nginx/conf.d目录,但不在本文讨论范围),修改该文件后,必须执行nginx -s reload重启 nginx。
对于 location 的配置,一般如下:

location /fee/9000 {proxy_pass http://127.0.0.1:9000;proxy_set_header Host $proxy_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

发送到 nginx 服务器的请求,如果 URL 为/fee/9000,则转发到本地的 9000 端口的服务。(注:/fee/9000还可以继续添加后缀 URL,但不是本次讨论的范围),其它转发类似。
经测试,直接用proxy_pass字段指定后端服务地址即可。如下:

location /fee/9000 {proxy_pass http://127.0.0.1:9000;
}

测试中发现,当使用上述转发规则时,后端程序必须实现/fee/9000的响应,即在容器中能正常请求http://127.0.0.1:9000/fee/9000。如果不实现,会提示 404。而本文的后端不能响应带后缀的URL。

经查,在后端程序 URL 后添加斜杠/可解决问题,如下:

location /fee/9000 {proxy_pass http://127.0.0.1:9000/;
}

两者对比如下:

不加斜杠:http://127.0.0.1:8080/fee/9000  --> http://127.0.0.1:9000/fee/9000
添加斜杠:http://127.0.0.1:8080/fee/9000  --> http://127.0.0.1:9000/添加斜杠的扩展:http://127.0.0.1:8080/fee/9000/foo  --> http://127.0.0.1:9000/foo

对于笔者的应用,请求后端程序的URL必须是http://127.0.0.1:9000/的形式,不能再额外添加后缀,由于对 nginx 研究未深,暂不展开讨论。

实验结果

请求命令:

$ curl http://192.168.28.11:8090/fee/test -X POST -F  "file=@sample.json"% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100   434  100    98  100   336   3920  13440 --:--:-- --:--:-- --:--:-- 18083{"code":0,"data":{"result":"ok in back end server, port: 9001 info: run in port 9001"},"msg":"ok"}

转发工具:

nginx    | got url:  http://127.0.0.1:8080/fee/9001
nginx    | [GIN] 2021/09/14 - 01:32:17 | 200 |   10.002826ms |    192.168.28.5 | POST     "/fee/test"

nginx 日志:

==> nginx/log/access.log <==
127.0.0.1 - - [14/Sep/2021:01:32:17 +0800] "POST /fee/9001 HTTP/1.1" 200 98 "-" "Go-http-client/1.1" "-"

小结

本文中,自编的转发工具要管理和配置后端程序以及 nginx,即启动若干后端程序,根据规则分配端口号(从9000开始)和 URL,将其写到 nginx 配置文件,最后重启 nginx 服务。——当然,这些都是使用较简单的方法。
在启动后端程序中,由于笔者使用相同的代码,因此花了一些时间排查问题。
在测试 nginx 转发 URL 时,也花了较多的时间(前后大概2个深夜的时间)。

在后续中,笔者将研究如何自实现负载均衡算法。——计划做此事已了大半年,趁此机会抽点时间搞下。

参考

关于转发 URL 的讨论 https://stackoverflow.com/questions/42997684/nginx-on-docker-doesnt-work-with-location-url
nginx镜像: https://hub.docker.com/_/nginx

李迟 2021.9.19 凌晨—

Golang实践录:使用gin框架实现转发功能:利用nginx转发相关推荐

  1. Golang实践录:测试框架

    这篇集中记录一下测试相关的内容. 背景 创建工程库代码,方便重用.重用方式可使用函数,也可直接引用文件. 完成函数,可在 main 函数中调用进行测试.也可以使用 test 框架进行. 在大型项目中, ...

  2. Golang实践录:使用gin框架实现转发功能:上传文件并转

    近段时间需要实现一个转发 post 请求到指定后端服务的小工具,由于一直想学习 gin 框架,所以就使用这个框架进行尝试,预计会产生几篇文章.本文先研究如何在 gin 框架中实现上传和转发功能. 问题 ...

  3. Golang实践录:命令行cobra库实例再三优化

    本文是上一文章<Golang实践录:命令行cobra库实例优化> 的优化,主要的子命令的业务实现的整理. 起因 上一版本实现的方式,还是有点不满意,格式也不对齐,重要的是,似乎不是正规的方 ...

  4. Golang实践录:命令行cobra库实例优化

    本文上一文章<Golang实践录:命令行cobra库实例> 的优化,主要的子命令的业务实现的整理. 起因 旧版本中,每个子命令的入口函数,均需一一判断传入参数,并调用对应的业务实现函数,编 ...

  5. 利用SSH端口转发功能实现X转发

    利用SSH端口转发功能实现X转发 分类: Linux2012-08-22 13:13203人阅读评论(0)收藏举报 sshserverwindowsdoslinuxxp SSH协议中有X转发协议.在S ...

  6. Golang实践录:使用gin框架实现转发功能:一些负载均衡算法的实现

    近段时间需要实现一个转发 post 请求到指定后端服务的小工具,由于一直想学习 gin 框架,所以就使用这个框架进行尝试,预计会产生几篇文章.本文研究一些负载均衡算法的实现. 概述 本文实现的负载均衡 ...

  7. Golang实践录:使用gin框架实现转发功能:管理后端服务

    近段时间需要实现一个转发 post 请求到指定后端服务的小工具,由于一直想学习 gin 框架,所以就使用这个框架进行尝试,预计会产生几篇文章.本文研究如何管理后端服务. 思路 在启动 gin 服务前, ...

  8. Golang实践录:静态资源文件整合:web服务

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文研究静态资源文件的在 web 服务器的整合. 基础 Golang 中的 web 服务框架有很多种,本文选取 gi ...

  9. Golang实践录:工程管理

    本文介绍Golang的工程管理. 工程概述 GOPATH目录下创建三个目录: src 存放源代码,每个工程一个单独的目录 pkg 编译过后生成的包文件存放目录,根据平台有不同目录,里面有许多.a库,暂 ...

最新文章

  1. [学习笔记]几个英语短句(1)
  2. 数学建模学习笔记——主成分分析
  3. 军队计算机技术职称考试 类别,军队人员参加计算机考试科目设置和报考规定...
  4. 设置图的位置_消防泵房内设备、管网、阀门的设置及系统图
  5. Java修炼之路——基础篇——平台无关性
  6. SpringBoot2 整合 AXIS 服务端和客户端
  7. ant design vue 树形控件_官宣!vue.ant.design 低调上线
  8. c语言字符串英文,C语言字符串函数大全(国外英文资料).doc
  9. AutoLISP恢复系统变量到默认值
  10. 亚马逊EC2服务器使用Rsync+Inotify实时同步
  11. Modbus驱动库—libmodbus驱动库的使用
  12. 计算机两个账户共享文件,两台电脑如何共享文件,简简单单六步即可实现文件共享...
  13. 电路原理 第一章 电路模型和电路定律(一)
  14. Microservices 基础理论
  15. 微信公众号注册时提示该主体注册数量已超过上限怎么办?
  16. 防止刷新或后退页面重复提交表单
  17. [2021 蓝帽杯]杰克与肉丝
  18. 微信黑名单已经删除的人怎么找回来?这些步骤挨个试试!
  19. Linux—vi命令详解
  20. 这可能最全的操作系统面试题

热门文章

  1. 微服务的好处与弊端_一文了解微服务的流程和组织
  2. vivo X Fold或首发国产最强屏幕:120Hz LTPO 3.0
  3. 顺丰同城:香港IPO发行价定为16.42港元
  4. 我和2000万人在B站刷凤凰传奇
  5. 华为Mate 40正式发布:4999元起、买吗?
  6. 三星电子预计第三季度营业利润达722亿元 同比增长58%
  7. 中芯国际能靠14nm工艺翻身么?
  8. 阿里巴巴发布第四财季财报 菜鸟驿站包裹量增长100%
  9. 阿里巴巴宣布架构调整:集中发力推进三大战略 程立任集团CTO
  10. 腾讯被阿里甩出1万亿!中国互联网公司格局剧变!