为节约成本,我们可以使用云服务器的弹性伸缩服务,平时维持一个比较低配置的服务器,设置好弹性伸缩,当流量大起来时候,自动伸缩一些云主机加入负载均衡的集群

遇到问题

微信早期使用上述方法没有问题,但是现在的微信默对公众号默认开启了ip白名单,难以这样简单的“弹性伸缩”,因为每个主机的ip是不一样的,目前没有一种方法可以把动态产生的ip放入微信后台
针对云服务器,给出以下方法

解决方法

  1. 配置私有网络
    使用vpc私有网络,将动态生成的服务器都加入到vpc中去,走共同的出口,以保证微信的ip白名单通过
  • 新建私有网络
  • 新建网关子网
  • 新建内部子网
  • 新建网关路由表
  • 新建内部路由表

以上步骤中,网关不能和内网在同一网段,将内网路由表设置0.0.0.0/0到你的网关主机既可
弹性伸缩主机放在“内部子网”中

  1. 配置网关
    首先,安装iptables
    其次,执行
1
2
3
4
5
6
7
8
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

echo "echo 1048576 > /proc/sys/net/netfilter/nf_conntrack_max" >> /etc/rc.local
echo "echo 262144 > /sys/module/nf_conntrack/parameters/hashsize" >> /etc/rc.local

echo "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE" >> /etc/rc.local

echo "iptables -t mangle -A POSTROUTING -p tcp -j TCPOPTSTRIP --strip-options timestamp" >> /etc/rc.local

在/usr/local/sbin/目录下新建脚本set_rps.sh,将以下代码写入脚本中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
mask=0
i=0
cpu_nums=`cat /proc/cpuinfo |grep processor |wc -l`
if(($cpu_nums==0));then
exit 0
fi

nic_queues=`cat /proc/interrupts |grep -i virtio0-input |wc -l`
if(($nic_queues==0));then
exit 0
fi

echo "cpu number" $cpu_nums "nic queues" $nic_queues

mask=$(echo "obase=16;2^$cpu_nums - 1" |bc)
flow_entries=$(echo "$nic_queues * 4096" |bc)

echo "mask = "$mask
echo "flow_entries = "$flow_entries

#for i in {0..$nic_queues}
while (($i < $nic_queues))
do
echo $mask > /sys/class/net/eth0/queues/rx-$i/rps_cpus
echo 4096 > /sys/class/net/eth0/queues/rx-$i/rps_flow_cnt
i=$(($i+1))
done

echo $flow_entries > /proc/sys/net/core/rps_sock_flow_entries

然后执行

1
2
chmod +x /usr/local/sbin/set_rps.sh
echo "/usr/local/sbin/set_rps.sh" >> /etc/rc.local

参考资料
https://cloud.tencent.com/document/product/215/2238