前言
作者本人使用的是远程开发的模式,所以会用到DNS解析服务,和LUA脚本
本地通过 Hyper-V 安装了一个 Ubuntu 虚拟机,并在虚拟机中安装了一些 Docker 服务。
然后通过路由转发将容器路由转发到宿主机,相当于是将容器做成了一个个服务器。
然而,尴尬的是,为了能够提升服务效率,我将代码都放在了虚拟机中。开发的方式也是远程开发,但这个时候,调试的时候出错了。
因为 PHP 是通过端口传递 DEBUG 内容的。虚拟机中监听了 9000 端口,宿主机通过访问了容器服务,容器发现宿主机的 9000 端口没开,也就不会传递 DEBUG 信息。就算传递了,因为宿主机(相对虚拟机)的IP和虚拟机的IP不一致,也不会 DEBUG 成功。
环境
WindowsHyper-VUbuntu20.04NginxDockerPHP
注意点
- 若需要知道如何固定虚拟机IP,可以参考 Hyper-V固定虚拟机IP
- 若需要知道如何搭建DNS服务,请参考 Ubuntu使用dnsmasq自建dns服务
- 若需要知道Docker如何设置DNS,请参考 Docker设置DNS
- 若需要知道如何使用容器IP访问服务,请参考 Docker容器IP访问容器服务
思考
既然直接跳过了虚拟机,访问了容器。
那么宿主机(相对虚拟机)直接给域名绑定虚拟机的IP,然后,虚拟机做一层转发,就可以做到这件事情。
问题
既然是做转发,就需要写一堆的 nginx 配置,那有没有一种只需要设置一次的呢?
之前已经做了 DNS 服务,现在可以利用起来。
Nginx配置
因为需要通过 DNS 服务获取域名对应的真实IP地址,那么就需要编写相关脚本。
而对于 Nginx 最适合的应该就是 LUA 了。
安装 Lua 扩展
由于 Nginx 是通过 apt install 的形式安装的,那就可以直接通过 apt install 安装 lua 扩展。
sudo apt install libnginx-mod-http-lua -y
编写 lua
这里是通过 dig 命令解析服务的 IP 地址。
# 192.168.137.128 是之前搭建的 DNS 服务
sudo tee /etc/nginx/proxy.lua <<- 'EOF'
local f = io.popen("dig +short @192.168.137.128 " .. ngx.var.host, "r")
ngx.var.backend = "http://" .. string.gsub(string.gsub(f:read("*a"), "\n", ""), "\r", "")
f:close()
EOF
编写 conf
X-Forwarded-For 必须设置为虚拟机IP
sudo tee /etc/nginx/conf.d/proxy.conf <<- 'EOF'
server {
listen 80;
server_name *.angelalign.com;
location / {
set $backend '';
rewrite_by_lua_file /etc/nginx/proxy.lua;
proxy_pass $backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For 192.168.137.128;
}
}
EOF
重载Nginx
sudo service nginx reload
最后
打完收工。
DEBUG 可以用了,服务也正常。

本文介绍了一种在Hyper-V环境下,通过Nginx与Lua脚本实现从宿主机到虚拟机再到容器的服务转发方法,解决了远程调试过程中因端口限制导致的问题。
533

被折叠的 条评论
为什么被折叠?



