当一台云服务器拥有两块网卡时,我们期望一个服务(Nginx)监听在网卡A公网IP的
80
端口,而另外一个服务监听在网卡B公网IP的80
端口上。
像往常一样,修改每个服务的配置为监听指定公网IP,默认情况下,在实际操作中两个服务至少有一个服务启动失败。
假设使用的是阿里云的云服务器(其他云服务商可能也有这个共性),网卡A上的公网IP是创建ECS时分配的公网IP,网卡B是后续绑定的弹性网卡,并且绑定了弹性公网IP。在这台服务器上执行ifconfig
命令,发现没有公网IP,仅显示了两个内网IP。这个问题导致了服务绑定不上公网IP。原因是创建ECS时分配的公网IP在ECS内是不可见的,而弹性公网IP的可见性由其绑定模式决定,修改绑定模式可以让弹性公网IP在ECS内可见。
所以在最好的情况下,这台服务器执行ifconfig
会显示两个内网IP跟一个公网IP。还有一个公网IP不可见就不能正常运行我们的两个服务。
要解决这个问题只需要在/etc/sysctl.conf
文件里增加一行配置:
net.ipv4.ip_nonlocal_bind = 1
这个配置1
表示内核允许绑定非本地存在的IP地址,反之默认为0
不允许。
再执行
sysctl -p
重新加载内核文件。
再启动两个服务就能正常运行了。