动态更新 nginx
Update nginx dynamically
我有一个在线软件 运行 在我自己的本地服务器上,有一个固定的互联网 IP 地址。
我正在考虑租用 nginx/ubuntu 的基于云的小型代理服务器来接收流量,然后将其转发到我的本地服务器。因此,我将从防火墙设备顶部的云主机保护(DDoS 等)中受益,并且我还可以获得两个动态 IP 连接而不是一个固定 IP(稳定性改进)。
在这种情况下,如何使云nginx .conf 文件自动更新?还是此设置存在缺陷?
提前致谢。
您需要调用 nginx -s reload
或 kill -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 的完整更新和刷新之间存在一些延迟,这两种方法都可能导致某些不可用。
我有一个在线软件 运行 在我自己的本地服务器上,有一个固定的互联网 IP 地址。
我正在考虑租用 nginx/ubuntu 的基于云的小型代理服务器来接收流量,然后将其转发到我的本地服务器。因此,我将从防火墙设备顶部的云主机保护(DDoS 等)中受益,并且我还可以获得两个动态 IP 连接而不是一个固定 IP(稳定性改进)。
在这种情况下,如何使云nginx .conf 文件自动更新?还是此设置存在缺陷?
提前致谢。
您需要调用 nginx -s reload
或 kill -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 的完整更新和刷新之间存在一些延迟,这两种方法都可能导致某些不可用。