我有一个在线软件运行在我自己的本地服务器与互联网的固定IP地址。
我正在考虑租用一个基于云的nginx/ubuntu的小型代理服务器来接收流量,然后将其转发到我的本地服务器。因此,我将从我的防火墙设备上的云主机保护(DDoS等)中受益,并且我还可以获得两个动态IP连接,而不是一个固定IP (稳定性改进)。
在此场景下,如何保持云nginx .conf文件自动更新?或者也许这个设置中有一个缺陷?
提前谢谢。
发布于 2021-03-29 18:54:53
需要调用nginx -s reload或kill -s HUP $(cat /run/nginx.pid)强制nginx实例重新加载配置。你可以在你的动态IP更新后这样做(例如,在路由器端通过敲击代理服务器来触摸一些URL作为回调,在那里导致这样的命令调用)。
UPD这可以是一个nginx位置,它将调用一些脚本(php、perl、python等),例如通过 can或直接(例如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,每次其IP发生更改时,从本地主机(或路由器)调用URI https://host.example.com/secret-update-my-ip (用户名和密码在该位置有效)就足够了。
正如前面提到的敲门(无论是基于网页、URL还是端口范围),你可以使用一些外部程序,例如fail2ban监控一些日志(例如,注意到你的敲门URL调用),并与action.d/nginx-block-map.conf类似的动作做出反应,这些动作也改变了一些包括(在这种情况下是地图)和重新加载nginx。
另一种方法是实现或使用Dyn-DNS服务,例如在某个地方安装自己的DNS服务器,创建一些具有小TTL的完全限定域名映射,并在每次更改时将此主机的IP更新为您的动态IP (最好使用DNS服务器的缓存失效)。
然后,您可以在upstream或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完全更新和刷新之间的一些延迟。
https://stackoverflow.com/questions/66844858
复制相似问题