Hi 你好,欢迎访问!登录
当前位置:首页 - Linux - 正文 君子好学,自强不息!

Nginx服务器双线接入在Linux和FreeBSD上的配置

2016-09-21Linux撒加7897°c
A+ A-

    策略路由,这东西在互联网公司用的非常多,尤其是服务器托管在IDC而且是用双线的用户,在LVS/Haproxy的机器上必须要配置策略路由,否则不能实现源进源出。一般做法是在Linux上使用iproute2的指令做好策略路由,在DNSPOD上新增两条A记录,一条线路为默认,一条线路为联通。解析好后,电信用户访问网站就解析到电信接口,数据从电信接口返回;联通用户访问网站就解析到联通接口,数据从联通接口返回。

    如果不做策略路由会如何呢?假如服务器的有3个IP地址,分别为电信、联通、内网三个IP地址。第一种情况,服务器的默认路由是指向内网网关的,那么没有策略路由,即使配置了电信、联通的地址,也是没法正确访问的;第二种情况,服务器的默认路由指向的是电信的网关,在没有配置策略路由的情况下,电信用户访问不受影响,而联通的用户在访问网站时,请求是发送到联通接口的,而数据返回却是从电信接口返回的,这样的结果就是联通用户打开网站很慢。

    一般来说策略路由分为基于目的的策略路由和基于源的策略路由,两者最常用的场景为,前者在智能DNS服务器上是必须要配置的,比较繁琐,需要电信、联通的所有路由表信息才能够提供正常的服务;后者其实就是我们所说的Web服务器多线接入时用的。(F5、Netscaler等硬件负载均衡器实现的方法更巧妙,不一定用策略路由,而是判断源MAC)。

    言归正传,在Linux和FreeBSD实现策略路由,前者配置是标准的策略路由,后者严格来说并不算策略路由,因为后者必须借助ipfw或者pf这两个防火墙模块实现。本文以Nginx举例来说两种操作系统上如何实现双线接入。

    操作系统版本:

    CentOS 6.5和FreeBSD 10.3,Nginx版本1.10,使用kvm虚拟机,虚拟网卡使用virtio模式

    IP地址及网关分配

    电信:58.215.55.100/24  GW:58.215.55.1  iface:eth1

    联通:117.121.132.100/24 GW:117.121.132.1 iface:eth2

    内网:192.168.1.100/24    GW:192.168.1.254 iface:eth0

    CentOS下让Nginx工作在电信、联通、内网三个IP上

    网上几乎所有的中文资料在配置CentOS 6.5中的策略路由时都不约而同的使用在/etc/rc.local中添加相应指令的方式来保证策略路由可以持久化,其实这是一种非常LOW的方式,CentOS本身就支持优雅的方式来支持策略路由,这就是route-ethX(为ethX配置路由)和rule-ethX(为ethX配置路由策略)。

    根据以上的IP地址信息,需要分别在ifcfg-eth0 ifcfg-eth1 ifcfg-eth2中对应增加,其中ifcfg-eth1和ifcfg-eth2两个文件中不需要配置GATEWAY(其实ifcfg-eth0也可以不配置GATEWAY)。在/etc/sysconfig/network-scripts下使用touch命令生成route-eth2 route-eth3 rule-eth2 rule-eth3共四个文件。接下来分别执行

echo "default via 58.215.55.1 src 58.215.55.100 table telcom" > /etc/sysconfig/network-scripts/route-eth1

echo "from 58.215.55.100 table telcom" > /etc/sysconfig/network-scripts/rule-eth1

echo "default via 117.121.132.1 src 117.121.132.100 table unicom" > /etc/sysconfig/network-scripts/route-eth2

echo "from 117.121.132.100 table unicom" > /etc/sysconfig/network-scripts/rule-eth2

为iproute2增加两个路由表

echo "250  telcom" >> /etc/iproute2/rt_tables
echo "251 unicom" >> /etc/iproute2/rt_tables
做好以上配置后执行/etc/init.d/network restart 策略路由就生效了。

为了体现差别,这里要说下Nginx中listen这个指令的用法,在CentOS中为了使Nginx的80端口监听在所有有效的接口IP上,配置文件里用listen 80;就可以了。只要策略路由生效,Nginx可以工作在服务器有效的IP上了。

    FreeBSD下让Nginx工作在电信、联通、内网三个IP上

    谷歌了一圈,PBR在FreeBSD上去做简直就是要命,为什么坑呢,因为首先做的事就是重新编译内核,让FreeBSD支持multi route table,默认只有一个路由表、一个路由表、一...个...路...由...表!!!!Fuck!!!!以下是步骤:

1、下载并解压kernel源码

由于我在安装FreeBSD的过程中没有选择安装src,所以需要从网上下载一个回来,安装FreeBSD时选择安装源码包的可以忽略这一步

fetch https://mirrors.sohu.com/FreeBSD/amd64/10.3-RELEASE/src.txz   (注意freebsd里的wget需要自己安装)

tar zxf src.txz -C /

2、修改内核配置文件,使之能支持多个路由表

cd /usr/src/sys/amd64/conf/

cp GENERIC /root/ROUTES

ln -s /root/ROUTES

echo "options ROUTETABLES=16" >> ROUTES      (这里表示将路由表增加到16个)

3、编译内核并使之生效

cd /usr/src

make NO_MODULES=1 kernel KERNCONF=ROUTES KODIR=/boot/routes

等待一会kernel就编译完成了

备份好原有的kernel

mv /boot/kernel/kernel  /boot/kernel/kernel.bak

替换内核

cp /boot/routes/kernel /boot/kernel/

4、开启pf模块(当然想使用ipfw也是可以的)

echo 'pf_enable="YES"' >> /etc/rc.conf    表示开启pf模块

echo 'pf_rules="/etc/pf.conf"' >> /etc/rc.conf  表示pf模块从哪里读取配置

5、配置IP地址

由于在安装过程中对内网网卡先配置了IP,所以接下来只添加电信和联通的IP

echo 'ifconfig_vtnet1="inet 58.215.55.100/24"' >> /etc/rc.conf
echo 'ifconfig_vtnet2="inet 117.121.132.100/24" >> /etc/rc.conf

6、配置两个不同网关的路由表(默认路由表为0,安装系统时分配给了192.168.1.254)

echo "/usr/sbin/setfib 1 /sbin/route add default 58.215.55.1" >> /etc/rc.local   通过setfib配置路由表1中的默认路由
echo "/usr/sbin/setfib 2 /sbin/route add default 117.121.132.1" >> /etc/rc.local 通过setfib配置路由表2中的默认路由

7、配置pf策略

echo "pass out quick route-to (vtnet1 58.215.55.1) from 58.215.55.100 to any" >> /etc/pf.conf
echo "pass out quick route-to (vtnet2 117.121.132.1) from 117.121.132.100 to any" >> /etc/pf.conf

8、重启FreeBSD使上述配置生效(上述步骤查阅了不少资料,以及走了不少弯路才试验成功)

到这里总算是电信、联通的IP都可以ping通了。Nginx我按照Linux下的配置应用后,奇葩现象来了,80端口居然通过电信和联通地址访问不到,从内网可以访问。此时脑子里闪过Nginx的listen指令里有一个参数setfib,怀疑跟这个问题有关,赶紧查阅了下官方文档,果然listen中的setfib就是用在FreeBSD中的,猜想这个地方setfib=后的数字应该跟rc.local中我指定的setfib后的数字应该是对应的,所以修改nginx.conf,将listen 80拆分为3个指令

listen 58.215.55.100:80 setfib=1;

listen 117.121.132.100:80 setfib=2;

listen 192.168.1.100:80    setfib=0;

其他配置就是将use epoll务必要修改为use kqueue;

到此,两种系统下让Nginx提供多线访问就配置完毕了。

题外话:

使用FreeBSD的话,负载均衡只有两种选择:Nginx/Haproxy,很多时候Haproxy同样要面临服务器上多线的情况,通过查阅好多资料,靠谱的方式就是将haproxy.cfg分成好几份,以上面电信、联通、内网的IP来举例,需要将原有的haproxy.cfg做3个副本,haproxy.cfg.telcom(电信接口)    haproxy.cfg.unicom(联通接口)  haproxy.cfg.inside(内网接口),三个配置文件唯一不同的就是bind参数,三个文件依次为bind 58.215.55.100:80;bind 117.121.132.100:80;bind 192.168.1.100:80。另外haproxy的启动脚本需要修改,比如原来启动服务是haproxy {start|stop|restart|reload}就可以了,现在需要使用haproxy {start|stop|restart|reload} {telcom|unicom|inside}

配置/etc/rc.local

echo "/usr/sbin/setfib 1 /sbin/route add default 58.215.55.1" >> /etc/rc.local   通过setfib配置路由表1中的默认路由
echo "/usr/sbin/setfib 2 /sbin/route add default 117.121.132.1" >> /etc/rc.local 通过setfib配置路由表2中的默认路由
echo "/usr/sbin/setfib 1 /usr/local/etc/rc.d/haproxy start telcom" >> /etc/rc.local
echo "/usr/sbin/setfib 2 /usr/local/etc/rc.d/haproxy start unicom" >> /etc/rc.local
echo "/usr/sbin/setfib 0 /usr/local/etc/rc.d/haproxy start inside" >> /etc/rc.local



  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
Nginx服务器双线接入在Linux和FreeBSD上的配置

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
推荐阅读

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>


  用户登录