动态更新 nginx

Update nginx dynamically

我有一个在线软件 运行 在我自己的本地服务器上,有一个固定的互联网 IP 地址。

我正在考虑租用 nginx/ubuntu 的基于云的小型代理服务器来接收流量,然后将其转发到我的本地服务器。因此,我将从防火墙设备顶部的云主机保护(DDoS 等)中受益,并且我还可以获得两个动态 IP 连接而不是一个固定 IP(稳定性改进)。

在这种情况下,如何使云nginx .conf 文件自动更新?还是此设置存在缺陷?

提前致谢。

您需要调用 nginx -s reloadkill -s HUP $(cat /run/nginx.pid) 来强制 nginx 实例重新加载其配置。 您可以在动态 IP 更新后执行此操作(例如,触摸一些 URL 作为路由器端的回调,并敲击代理服务器,从而导致此类命令调用)。

[UPD] 这可以是一个 nginx 位置,它将调用一些脚本(php、perl、python 等),例如通过 fastcgi或直接(例如 lua)在某些包含文件中更新您的地址并触发重新加载信号。

例如,如果是 lua-脚本,您的 nginx.conf 可能如下所示:

# list of backend hosts referenced by dynamic IPs (updated in secret-update-my-ip):
upstream backend {
  include /etc/nginx/my-backend-srv.conf;
}
# location referencing backend:
location ~ \.php$ {
  fastcgi_pass   backend;
  # ...
}

# ...

location = /secret-update-my-ip {
  auth_basic "Technical user area";
  #... provide auth-setting here (file, etc) ...
  content_by_lua_block {
    -- write upstream server with IP of requesting host - $remote_addr:
    local f = io.open("/etc/nginx/my-backend-srv.conf", "w")
    f:write("server " .. ngx.var.remote_addr .. ":8080;\n")
    f:close()
    -- signaling reload:
    os.execute("nginx -s reload")
  }
}

因为这个 include (/etc/nginx/my-backend-srv.conf) 是一个普通的 nginx 配置文件,可以包含在你的 nginx 的某个地方,你可以将 IP 存储为变量声明(如
"set $my_ip "..ngx.var.remote_addr..";\n") 并将其包含在服务器或位置部分,以便在那里用作 $my_ip 变量。
要更新您的动态 IP,调用 URI https://host.example.com/secret-update-my-ip 就足够了(使用用户名和密码每次其 IP 更改时从本地主机(或路由器)发送的有效位置)。
正如前面提到的敲门声(无论是基于网络、url- 还是基于端口范围),您可以使用一些外部程序,例如 fail2ban 监控一些日志(例如注意到您的敲门声 URL 呼叫)并做出反应与 action.d/nginx-block-map.conf 类似的操作也改变了一些包含(在那种情况下是地图)并重新加载 nginx。

另一种方法是实施或使用 Dyn-DNS 服务,例如在某处安装自己的 DNS 服务器,创建一些 FQDN 映射,如 my-dynamic-backend.ns.example.com 和小 TTL,并每隔一段时间将此主机的 IP 更新为您的动态 IP它被更改的时间(最好是 DNS 服务器的缓存失效)。
然后您就可以在上游或 proxy_pass 指令中将其用作主机名,请参阅 https://serverfault.com/questions/240476/how-to-force-nginx-to-resolve-dns-of-a-dynamic-hostname-everytime-when-doing-p/593003#593003

请注意,由于 IP 切换与代理端 IP 的完整更新和刷新之间存在一些延迟,这两种方法都可能导致某些不可用。