前言
作者本人使用的是远程开发的模式,所以会用到DNS解析服务,和LUA脚本
本地通过 Hyper-V
安装了一个 Ubuntu
虚拟机,并在虚拟机中安装了一些 Docker
服务。
然后通过路由转发将容器路由转发到宿主机,相当于是将容器做成了一个个服务器。
然而,尴尬的是,为了能够提升服务效率,我将代码都放在了虚拟机中。开发的方式也是远程开发,但这个时候,调试的时候出错了。
因为 PHP
是通过端口传递 DEBUG
内容的。虚拟机中监听了 9000
端口,宿主机通过访问了容器服务,容器发现宿主机的 9000
端口没开,也就不会传递 DEBUG
信息。就算传递了,因为宿主机(相对虚拟机)的IP和虚拟机的IP不一致,也不会 DEBUG
成功。
环境
Windows
Hyper-V
Ubuntu20.04
Nginx
Docker
PHP
注意点
- 若需要知道如何固定虚拟机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
可以用了,服务也正常。