Nginx+LUA实现动态反向代理

前言

作者本人使用的是远程开发的模式,所以会用到DNS解析服务,和LUA脚本

本地通过 Hyper-V 安装了一个 Ubuntu 虚拟机,并在虚拟机中安装了一些 Docker 服务。

然后通过路由转发将容器路由转发到宿主机,相当于是将容器做成了一个个服务器。

然而,尴尬的是,为了能够提升服务效率,我将代码都放在了虚拟机中。开发的方式也是远程开发,但这个时候,调试的时候出错了。

因为 PHP 是通过端口传递 DEBUG 内容的。虚拟机中监听了 9000 端口,宿主机通过访问了容器服务,容器发现宿主机的 9000 端口没开,也就不会传递 DEBUG 信息。就算传递了,因为宿主机(相对虚拟机)的IP和虚拟机的IP不一致,也不会 DEBUG 成功。

环境

  • Windows
  • Hyper-V
  • Ubuntu20.04
  • Nginx
  • Docker
  • PHP

注意点

思考

既然直接跳过了虚拟机,访问了容器。

那么宿主机(相对虚拟机)直接给域名绑定虚拟机的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 可以用了,服务也正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值