我有一个由 8 个独立 Web 服务器组成的集群,每个服务器都运行 nginx。它们都托管相同的网站,并使用 rsync 进行同步。
此外,每台服务器都有 8 个不同的 IP 地址。
我托管的网站根据某些业务逻辑被定向到不同的 IP。
有什么方法可以让我在所有服务器之间同步配置文件,但只更改每个服务器的 IP 吗?
例如,每台服务器上都有一个 nginx.conf,其中包含以下内容:
@IP1 = '1.1.1.1';
@IP2 = '2.2.2.2';
include 'sites.conf';
然后同步 sites.conf 并使其类似于:
server {
listen @IP1:80;
... //more configurations here
}
可以做这样的事吗?
答案1
正如其他人指出的那样,nginx 不支持这一点。
一种可能性是,为每个单独的主机使用单独的配置文件,并让 nginx 启动脚本直接引用该配置文件。
方法 1:多个配置文件
/etc/init.d/nginx 会执行以下操作:
MyIP=`# some code to get my ip address or local ID`
nginx -c $PATH_TO_NGINX/${MyIP}.conf
通过这种方式,您可以通过 rsync 向每个人发送相同的文件,但每个服务器只会引用他们自己的配置文件。
方法 2:在服务启动/重启时动态更新配置文件
MyIP=`# some code to get my ip address or local ID`
updateconfig($MyIP,$TEMPLATECONFIG,$LOCALCONFIG) # Some function which will take a template config distributed out and replace the IP-PLACEHOLDERS with the box's actual IP address
nginx -c $PATH_TO_NGINX/$LOCALCONFIG
通过这种方式,您只需管理一个配置文件模板,该模板会在重新启动/重新加载时自行更新。
如果您还不需要 Puppet/配置管理的额外复杂性,这是一种低开销的方法,而且由于配置是动态的,因此您仍可以进行扩展而不必担心盒子的 IP 地址。但如果您的架构发生变化,那么配置管理将非常有帮助。