Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡

Nginx基础

域名访问系统
目前访问系统存在的问题
目前访问后台系统:
http://localhost:8081/
目前访问首页系统:
http://localhost:8082/
目前访问搜索结果页面:
http://localhost:8085
在搜索结果页面search.jsp中,代码中写死了其他的系统的全路径。
问题:
1.localhost只能访问本地,不能访问其他的服务器;
系统应当要部署在测试环境和生产环境。
可以使用ip地址?
2.开发环境的ip地址和测试环境的ip地址是不一样的。每次环境变化的时候,都需要修改访问的ip地址
3.页面加载资源或者请求其他系统的URL时,使用了全路径,一旦环境发生改变,资源无法加载,请求无法访问。
4.ip地址没有意义,不容易记忆,用户不会通过ip地址进行访问,一般通过域名访问。
使用域名访问
例如:访问本地开发环境下的商品详情页面:
修改本机hosts文件:
存在的问题:
访问时域名后还需要加上端口。
可以使用nginx进行配置,达到只使用域名访问的目的。

第一:什么是Nginx?
Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

第二:Nginx的应用场景是什么?
1、http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。

(这里举个例子,前几年流行自己创建个个人网站来娱乐,如果要是每个人都买一台服务器来维护网站的话,费用是比较高的,很划不来,为了降低费用便催生出虚拟主机,就是在一台服务器上虚拟出多个"主机"出来,大家可以共用这一台服务器,费用当然就很低了,但是有个问题,我们知道nginx默认的端口是80,使用nigix访问静态网页的时候,是不用输入80端口就可以访问的,如果nginx的端口修改为别的端口号如81,那么访问的时候便需要输入端口号81才能访问。多个人共用一台服务器,访问地址不能以端口号作为区分网站的标志,因为谁也不想在输入访问地址的时候还带个端口号,大家掏的钱都是一样的,那么怎么让大家都使用80端口而且区分出不同的个人网站呢?这就用到了域名,不同的用户输入自己的域名就可以访问自己的网站。比如aaaa.com、bbbb.com两个域名,这两个域名对应着同一台服务器并且共用80端口)

3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

第三:nginx的安装
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第1张图片
在这里插入图片描述

学习nginx配置及举例使用端口、域名来区分不同的虚拟主机

Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第2张图片

nginx下的conf下的nginx.conf已经被改成了这样!
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第3张图片
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第4张图片

nginx-1.6.2下的conf下的nginx.conf还没有进行过改变
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第5张图片
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第6张图片

总结:conf nginx.conf里一个server相当于一个虚拟主机
端口号和域名来区分虚拟主机
location配置的事nginx的首页访问文件,其中html代表以html为目录为根目录,在这个目录下有index.html或index.html
访问错误页面的配置

下面又一个server是告诉我们可以通过IP或域名或者端口号来区分不同的虚拟主机
nginx支持配置https的虚拟主机,https传输内容更加安全,像淘宝和百度已经是全栈使用https来访问页面了。虽然https比http的性能方面要差一点,但对当今的互联网来说已经不是什么问题了。

我们打开nginx.conf文件,复制一份server配置,修改端口为81,root目录指定一个新的目录html81。
html81在nginx目录下是没有的,我们复制一份html目录并命名为html81

为了区分出我们访问的nginx首页,我们进入html81目录,修改index.html,将

Welcome to nginx!

修改为

Welcome to nginx81!

由于我们修改了nginx的配置文件,我们需要热重启nginx(也就是刷新nginx)

[root@taotao-nginx-server nginx]# sbin/nginx -s reload

我们访问81端口就会看到如下图所示界面,可以看见访问到的是81端口的欢迎页。说明我们配置的虚拟主机起作用了。

上面学习了使用端口号来区分不同的网站,下面我们学习下如何通过域名来区分不同的网址。

我们平时访问淘宝时只需要在地址栏中输入taobao.com便可以访问淘宝首页,这个"taobao.com"便是域名,而且"taobao.com"是一级域名,我们买域名买的便是一级域名。"www.taobao.com"是二级域名。如果我们想在地址栏中输入域名访问我们自己的网站的话,有两个途径,第一个途径是买一个属于自己的域名,访问这个域名需要经过DNS服务器,DNS服务器就是为了将访问的域名对应到相应的IP上,所以最终还是通过IP实际访问网站(这个途径别的人都可以访问到你的网站),第二个途径是配置本地的hosts文件,Hosts文件所在windows系统的目录

我们可以在HOSTS文件当中配置IP与域名的对应关系,配置了HOSTS文件后我们在地址栏输入配置在HOSTS文件中的域名后将不再经过DNS服务器,直接访问HOSTS文件配置的IP地址,比如我们把nginx所在的虚拟机的IP配置到HOSTS文件中并且配两个域名(端口一样,就靠域名来区分不同的网站

下面我们到nginx的配置文件中再添加两个虚拟主机的配置,如下图所示,可以看到端口号都是默认的80,只是域名不一样而已,为了区分不同的网站,我们分别建一个html目录命名为html-163和html-sougou

html-163和html-sougou在nginx目录下默认是没有的,我们分别复制html目录并命名为html-baidu和html-sougou,cp -r html/ html-163. cp -r html/ html-sougou

为了在nginx首页区分出不同的网站,我们分别进入html-baidu和html-sougou目录下,修改index.html文件

修改完了nginx访问首页后,我们重启nginx. sbin/nginx -s reload

然后,我们在地址栏输入www.163.com,如下图所示,可以看到这时访问的是我们的nginx的首页而且是我们指定的nginx的首页。

Mac配置hosts文件
1.本地编辑hosts文件,具体操作如下在空白桌面上点击,键入command+shift+G出来一个前往文件夹的界面
输入/etc/hosts找到hosts文件 拷贝出来一份,编辑后替换即可,记得备份一下
2.通过终端vim编辑hosts文件,打开终端输入如下
根据提示进入vim页面 键入I命令可以开始编辑 esc结束编辑 :wq!保存并且退出 退出之后可以通过 cat /etc/hosts查看后编辑的文件

nginx配置反向代理

我们经常听说反向代理这个概念,既然有反向代理,那么就应该有正向代理,什么是正向代理呢?如下图所示,所谓的正向代理是指当用户发起请求时无法直接访问到某个网站(比如我们经常听到的),需要经过一个中间服务器,用户将请求发给中间服务器,中间服务器可以访问用户想要访问的网站,中间服务器将用户的请求转发给想要访问的网站,然后将那个网站响应的结果再返回给用户,这就是正向代理。
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第7张图片

接着,我们再来看下反向代理,如下图所示,一般情况下,一个大型网站都是由多个服务器组成的,比如某个网站是由三个tomcat组成的集群对外提供服务的。那么当用户发情一个请求后,应该是哪个tomcat对外提供服务呢?这就是nginx反向代理所要做的事情,nginx会帮我们自动找一个tomcat来处理我们的请求,用户根本就不需要关心。
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第8张图片
现在我们就用实际的例子来学习反向代理,首先我们两台虚拟机(伪分布式没有什么实际意义,在工作中是不可能用到伪分布式的,因此学习的时候最好就按照实际生产环境来学习)。在两台虚拟机上都安装JDK和tomcat(tomcat的运行需要用到JDK)。

两台虚拟机我们都在/usr/local目录下新建software目录,然后我们将tomcat安装包上传到/usr/local/software目录下,使用tar -zxvf apache-tomcat-7.0.47.tar.gz -C /usr/local/命令解压tomcat安装包。

下面我们在nginx服务器上配置下反向代理,添加的内容如下:
upstream tomcat1{
server 192.168.156.32:8080;
}
upstream tomcat2{
server 192.168.156.33:8080;
}

server {
    listen       80;
    server_name  www.ceshi1.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat1;
        index  index.html index.htm;
    }
}
server {
    listen       80;
    server_name  www.ceshi2.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat2;
        index  index.html index.htm;
    }
}

可以看到使用的域名为www.ceshi1.com、www.ceshi2.com,我们需要在HOSTS文件中添加对应的映射关系,如下所示(大家根据自己虚拟机的实际IP来配置)
192.168.156.31 www.ceshi1.com
192.168.156.31 www.ceshi2.com

由于nginx的配置文件做了修改,因此需要重启nginx。

为了区分出我们访问的tomcat属于哪个,我们给每个tomcat首页加上标志,需要修改的文件路径是/usr/local/apache-tomcat-7.0.47/webapps/ROOT/index.jsp,tomcat1的修改。在

${pageContext.servletContext.serverInfo}原来的信息后面加上了"-tomcat1",另外一个个tomcat也做下相应修改即可。

启动两个tomcat,然后在地址栏输入www.ceshi1.com,可以看到我们访问到了tomcat1的首页。

我们再访问下www.ceshi2.com,可以看到访问到的是tomcat2的首页。这说明我们的反向代理配置的没问题。

nginx负载均衡

上节我们一起学习了nginx反向代理,这节课我们一起学习下nginx的负载均衡。

再新建一台虚拟机,参照上节课安装tomcat,然后我们在nginx配置文件中配置下负载均衡,只需在upstream Tomcat1中添加一行即可,如下。
server 192.168.156.34:8080;

添加完如下图(不配置任何负载均衡策略的话,默认是轮询策略,就是机会完全均分),这意味着,当我们访问www.ceshi1.com的时候会在两个tomcat之间循环访问。当然,我们也可以配置其它负载均衡策略,网上有很多,这里我不啰嗦了。

upstream tomcat1{
server 192.168.156.32:8080;
server 192.168.156.34:8080;
}
upstream tomcat2{
server 192.168.156.33:8080;
}

server {
    listen       80;
    server_name  www.ceshi1.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat1;
        index  index.html index.htm;
    }
}
server {
    listen       80;
    server_name  www.ceshi2.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat2;
        index  index.html index.htm;
    }
}

我们访问一下www.ceshi1.com,会先看到如下图所示界面
我们刷新一下页面,会看到如下图所示界面,可以看到现在访问的是tomcat3。

这说明负载均衡起作用了。这里提醒一点的是,如果是自己创建的三台安装tomcat虚拟机的话,很有可能遇到轮询只起一次作用的情况(就是先显示访问tomcat1后显示tomcat3,之后一直显示tomcat3),这种情况我们不必理会它,这可能是VMWare虚拟机本身的bug,因为我用实际的服务器去测试就完全没有问题。

LVS+Nginx负载均衡

一、课程目标
掌握什么是负载均衡及负载均衡的作用和意义。
了解lvs负载均衡的三种模式。
了解lvs-DR负载均衡部署方法。
掌握nginx实现负载均衡的方法。
掌握lvs+nginx负载均衡拓扑结构。

二、负载均衡方案
2.1 什么是负载均衡?
一台普通服务器的处理能力是有限的,假如能达到每秒几万个到几十万个请求,但却无法在一秒钟内处理上百万个甚至更多的请求。但若能将多台这样的服务器组成一个系统,并通过软件技术将所有请求平均分配给所有服务器,那么这个系统就完全拥有每秒钟处理几百万个甚至更多请求的能力。这就是负载均衡最初的基本设计思想。
负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求按照某种策略分配到服务器集合的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡解决了大量并发访问服务问题,其目的就是用最少的投资获得接近于大型主机的性能。

2.2 相关技术
2.2.1 基于DNS的负载均衡
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
DNS负载均衡技术是最早的负载均衡解决方案,它是通过DNS服务中的随机名字解析来实现的,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的客户机将在解析这个名字时得到其中的一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,它们也就访问不同地址上的Web服务器,从而达到负载均衡的目的。
优点:实现简单、实施容易、成本低、适用于大多数TCP/IP应用;
缺点:
1、 负载分配不均匀,DNS服务器将Http请求平均地分配到后台的Web服务器上,而不考虑每个Web服务器当前的负载情况;如果后台的Web服务器的配置和处理能力不同,最慢的Web服务器将成为系统的瓶颈,处理能力强的服务器不能充分发挥作用;
2、可靠性低,如果后台的某台Web服务器出现故障,DNS服务器仍然会把DNS请求分配到这台故障服务器上,导致不能响应客户端。
3、变更生效时间长,如果更改NDS有可能造成相当一部分客户不能享受Web服务,并且由于DNS缓存的原因,所造成的后果要持续相当长一段时间(一般DNS的刷新周期约为24小时)。

2.2.2 基于四层交换技术的负载均衡
基于四层交换技术的负载均衡是通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器与请求客户端建立TCP连接,然后发送Client请求的数据。
client发送请求至4层负载均衡器,4层负载均衡器根据负载策略把client发送的报文目标地址(原来是负载均衡设备的IP地址)修改为后端服务器(可以是web服务器、邮件服务等)IP地址,这样client就可以直接跟后端服务器建立TCP连接并发送数据。
具有代表意义的产品:LVS(开源软件),F5(硬件)
优点:性能高、支持各种网络协议
缺点:对网络依赖较大,负载智能化方面没有7层负载好(比如不支持对url个性化负载),F5硬件性能很高但成本也高需要人民币几十万,对于小公司就望而却步了。

2.2.3 基于七层交换技术的负载均衡
基于七层交换技术的负载均衡也称内容交换,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的服务器。

七层负载均衡服务器起了一个代理服务器的作用,client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client。
具有代表意义的产品:nginx(软件)、apache(软件)
优点:对网络依赖少,负载智能方案多(比如可根据不同的url进行负载)
缺点:网络协议有限,nginx和apache支持http负载,性能没有4层负载高

2.3 使用四层+七层负载均衡结合方案
四层负载使用lvs软件或F5硬件实现。
七层负载使用nginx实现。
如下图是lvs+nginx的拓扑结构:
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第9张图片

三、LVS实现四层负载DR模式
3.1 什么是LVS?

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

3.2 LVS实现负载的三种方式
运行 IPVS软件的服务器,在整个负载均衡集群中承担一调度角色 软件的服务器,(即 向真实服务器分配从客户端过来的请求。LVS中的调度方法有三种 :NAT(Network Address Translation网络地址转换)、TUN(tunnel 隧道)、DR(direct route 直接路由)

3.2.1 LVS-DR模式
请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。
DR模式下需要LVS服务器和RS绑定同一个VIP, 一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,RS收到LVS转发来的包,发现MAC是自己的,发现IP也是自己的,于是这个包被合法地接受,而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。
DR模式下,lvs接收请求输入,将请求转发给RS,由RS输出响应给用户,性能非常高。它的不足之处是要求负载均衡器与RS在一个物理段上。

3.2.2 LVS-NAT模式
NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,LVS需要作为RS的网关,当网络包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP,这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,对于客户端只知道是LVS直接返回给它的。
NAT模式请求和响应都需要经过lvs,性能没有DR模式好。

3.2.3 LVS-TUN模式
TUN模式是通过ip隧道技术减轻lvs调度服务器的压力,许多Internet服务(例如WEB服务器)的请求包很短小,而应答包通常很大,负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量。相比NAT性能要高的多,比DR模式的优点是不限制负载均衡器与RS在一个物理段上。但是它的不足需要所有的服务器(lvs、RS)支持"IP Tunneling"(IP Encapsulation)协议。

上节课我们一起了解了一下LVS+Nginx负载均衡的理论知识,这节课我们一起学习下如何搭建LVS-DR模式的负载均衡环境。
首先我们还是看一下LVS-DR负载均衡图
Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡_第10张图片
我们用三台虚拟机,一台虚拟机安装lvs-director,另外两台服务器安装nginx。并且我们要配置一个虚拟IP供外界用户访问。

下面我们便来安装lvs-director。新建一台虚拟机,建完虚拟机后需要配置静态IP地址并且要能上网。

CentOS6.8自带lvs,检查linux内核是否集成lvs模块,使用的命令是"modprobe -l | grep ipvs"。

我们还需要安装lvs管理工具ipvsadm,安装前需要先安装如下依赖
yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*

下一步是下载lvs管理管理工具所需要的源码包,大家可以到http://download.csdn.net/detail/u012453843/9854573这个地址下载。下载的源码包要上传到服务器上,我习惯在服务器的/usr/local目录下新建一个software目录,如下所示
[root@lvs-DR ~]# mkdir /usr/local/software

我们进入到/usr/local/software目录下,要使用XShell工具上传文件的话,需要先安装rzsz命令,如下
[root@lvs-DR ~]# yum install -y lrzsz

然后输入命令rz上传ipvsadm-1.26.tar.gz到/usr/local/software目录下,上传完后使用ls命令查看是否已经上传成功了,如下所示。
[root@lvs-DR software]# rz
[root@lvs-DR software]# ls
ipvsadm-1.26.tar.gz

下面解压该文件,解压到/usr/local目录下,如下所示。
[root@lvs-DR software]# tar -zxvf ipvsadm-1.26.tar.gz -C /usr/local/

进入到/usr/local/ipvsadm-1.26目录,在使用make命令之前要先安装vim-enhanced命令(因为最小化安装的CentOS6是没有安装过vim命令模块的)
[root@lvs-DR ipvsadm-1.26]# yum install -y vim-enhanced

下面便可以使用make命令进行编译
[root@lvs-DR ipvsadm-1.26]# make

下面便是安装,使用make install进行安装
[root@lvs-DR ipvsadm-1.26]# make install

下面检验ipvsadm安装是否成功,使用命令ipvsadm -h,如下图所示,说明安装成功。

下面我们我们来搭建两个nginx服务器。

下面我们接着配置ipvs-director服务器,在eth0上绑定虚拟IP,使用命令ifconfig eth0:0 192.168.156.110 broadcast 192.168.156.110 netmask 255.255.255.255 up,如下图所示。绑定完之后使用ifconfig查看IP信息,可以看到多了一个IP为192.168.156.110的虚拟IP。

接着添加路由规则,如下所示。
[root@lvs-DR ipvsadm-1.26]# route add -host 191.168.156.110 dev eth0:0

接着启用系统的包转发功能,如下所示。
[root@lvs-DR ipvsadm-1.26]# echo “1” >/proc/sys/net/ipv4/ip_forward

清除原有转发规则,如下所示。
[root@lvs-DR ipvsadm-1.26]# ipvsadm --clear

添加虚拟IP规则,如下所示。其中-s rr表示采用轮询策略。:80表示负载转发的端口是80
[root@lvs-DR ipvsadm-1.26]# ipvsadm -A -t 192.168.156.110:80 -s rr

在虚拟IP中添加服务规则,如下所示。在新加虚拟IP记录中添加两条新的Real Server记录,-g表示指定LVS 的工作模式为直接路由模式。
lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。
[root@lvs-DR ipvsadm-1.26]# ipvsadm -a -t 192.168.156.110:80 -r 192.168.156.36:80 -g
[root@lvs-DR ipvsadm-1.26]# ipvsadm -a -t 192.168.156.110:80 -r 192.168.156.37:80 -g

下面重启ipvsadm,如下所示。
[root@lvs-DR ipvsadm-1.26]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.156.110:http rr
-> 192.168.156.36:http Route 1 0 0
-> 192.168.156.37:http Route 1 0 0
[root@lvs-DR ipvsadm-1.26]#

配置Real Server(两台nginx服务器)在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。
在回环设备上绑定一个虚拟IP地址,如下所示
[root@lvs-nginx1 sbin]# ifconfig lo:0 192.168.156.110 broadcast 192.168.156.110 netmask 255.255.255.255 up
[root@lvs-nginx1 sbin]# /sbin/route add -host 192.168.156.110 dev lo:0

绑定后使用ifconfig查看IP信息,如下图所示。

下面关闭arp解析

arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。
0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 - 避免使用另外一个接口上的mac地址去响应ARP请求;
2 - 尽可能使用能够匹配到ARP请求的最佳地址。
arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 - 哪个接口上接受ARP请求,就从哪个端口上回应。
[root@lvs-nginx1 conf]# echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@lvs-nginx1 conf]# echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@lvs-nginx1 conf]# echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@lvs-nginx1 conf]# echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce
[root@lvs-nginx1 conf]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
[root@lvs-nginx1 conf]#

上面只是配置了一台nginx服务器,另外一台也一样配置一下。

配置完之后,我们来进行测试一下,预期目标:由于lvs设置为rr轮询策略,当访问虚IP http://192.168.101.100,每次刷新请求通过lvs负载到不同的服务器。有两条注意事项:

1、测试时需要在nginx的http中设置keepalive_timeout 0; 取消使用http持久连接模式,保证每次客户端发起请求都需要向服务端建立连接,这样做是为了每次刷新页面都要经过lvs负载转发。(注意:nginx2也要将keepalive_timeout设置为0)。
2、lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。
keepalive_timeout说明:
在nginx中keepalive_timeout的默认值是75秒,默认使用http持久连接模式,可使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,可避免建立或重新建立连接。生产环境建议keepalive_timeout不要设置为0。keepalive_timeout位置如下图所示

为了区分nginx,修改下index.html,其中lvs-nginx1的修改如下图所示。同理修改下lvs-nginx2.

下面启动两个nginx服务

[root@lvs-nginx1 nginx]# sbin/nginx
[root@lvs-nginx2 nginx]# sbin/nginx
我们在地址栏输入http://192.168.156.110/index.html,刚开始看到访问的是lvs-nginx1,刷新一次便可以看到访问的是lvs-nginx2。再刷新就又是36了,如此循环往复。

注意:由于配置虚拟IP等操作重启后会失效,因此需要将一些命令设置为开机就自动执行。我们先设置lvs-director服务器的开机启动,在/usr/local/ipvsadm-1.26目录下新建一个startup.sh文件,并在文件中添加如下内容。

cd /usr/local/ipvsadm-1.26
ifconfig eth0:0 192.168.156.110 broadcast 192.168.156.110 netmask 255.255.255.255 up
route add -host 191.168.156.110 dev eth0:0
echo "1" >/proc/sys/net/ipv4/ip_forward
ipvsadm --clear
ipvsadm -A -t 192.168.156.110:80 -s rr
ipvsadm -a -t 192.168.156.110:80 -r 192.168.156.36:80 -g
ipvsadm -a -t 192.168.156.110:80 -r 192.168.156.37:80 -g
ipvsadm

由于新建的startup.sh文件没有执行权限,因此要给它添加执行权限
[root@lvs-DR ipvsadm-1.26]# chmod +x startup.sh

添加完执行权限后startup.sh文件的颜色会变化,如下图所示,并且可以看到文件的权限"-rwxr-xr-x"当中有"x"(执行权限了)。

要想让设备启动的时候就执行这个脚本,我们需要修改/etc/rc.local文件,在该文件中添加一行内容,如下所示。
/usr/local/ipvsadm-1.26/startup.sh

这样,ipvs-director服务器的开机启动就配置好了,现在我们再给lvs-nginx1和lvs-nginx2两台服务器配置开机启动。在/usr/local/nginx目录下使用vim startup.sh命令新建一个startup.sh,并且在该文件中输入如下内容:
cd /usr/local/nginx/sbin
ifconfig lo:0 192.168.156.110 broadcast 192.168.156.110 netmask 255.255.255.255 up
/sbin/route add -host 192.168.156.110 dev lo:0
cd …/conf
echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p

由于startup.sh文件默认没有执行权限,因此我们使用命令chmod +x startup.sh来添加执行权限。
[root@lvs-nginx1 nginx]# chmod +x startup.sh

下面在/etc/rc.local文件中添加执行脚本的命令和nginx启动命令,如下所示。

[root@lvs-nginx1 nginx]# vim /etc/rc.local 
 
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
 
touch /var/lock/subsys/local
/usr/local/nginx/startup.sh
/usr/local/nginx/sbin/nginx

这样,lvs-nginx1服务器便配置好了,同样,nginx2也需要像ninx1配置一样配置一下。

下面我们便重启lvs-director、lvs-nginx1、lvs-nginx2三台服务器,重启后我们访问http://192.168.156.110/index.html,多刷新几次,可以看到访问的首页在lvs-nginx1、lvs-nginx2之间互相均匀切换。这说明我们配置的开机自启动是没问题的。

我们还可以将lvs-director和lvs-nginx做成系统服务。为了避免上面开机自启动的影响,我们暂且把lvs-director和lvs-nginx1、lvs-nginx2的/etc/rc.local文件中新添加的内容注释掉。

首先在lvs-director服务器的/etc/rc.d/init.d目录下新建一个名为lvsdr的文件,可以直接在/etc/rc.d/init.d目录上右键,点击"Create new file",如下图所示。

在弹出的对话框中输入名称lvsdr然后点击"OK"

在粘贴配置内容之前,要先确保该文件的编码格式是UTF-8无BOM格式,如下图所示。

把脚本内容粘贴到lvsdr脚本文件中,如下所示。

#!/bin/sh
# 定义虚拟ip
VIP=192.168.156.110 #虚拟 ip根据需求修改
# 定义realserver,并已空格分开,根据需求修改
RIPS="192.168.156.36 192.168.156.37"
 
# 定义提供服务的端口
SERVICE=80
 
# 调用init.d脚本的标准库
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "Start LVS of DR Mode"
        # 开启ip转发
        echo "1" > /proc/sys/net/ipv4/ip_forward
        # 绑定虚拟ip
        ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        route add -host $VIP dev eth0:0
        # 清除lvs规则
        ipvsadm -C
        # 添加一条虚拟服务器记录
    # -p指定一定的时间内将相同的客户端分配到同一台后端服务器
    # 用于解决session的问题,测试时或有别的解决方案时建议去掉
        ipvsadm -A -t $VIP:$SERVICE -s rr
 
        # 添加真实服务器记录
        for RIP in $RIPS
	do
		echo $RIP:$SERVICE;
                ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g
        done
        # 设置tcp tcpfin  udp的超时连接值
        ipvsadm --set 30 120 300
        ipvsadm
        ;;
 
        stop)
        echo "Stop LVS DR"
        ifconfig eth0:0 down
        ipvsadm -C
        ;;
        *)
        echo "Usage:$0 {start | stop}"
        exit 1
esac

添加完内容后,修改lvsdr文件的执行权限
[root@lvs-DR rc.d]# chmod +x /etc/rc.d/init.d/lvsdr

到这里还没完,由于脚本是我们利用NodePad++工具新建并添加内容的,Windows系统与Linux系统对回车的字符解释不一样,对Windows系统来说,文件的格式是dos,对Linux系统来说,文件的格式应该是unix,我们可以使用vim lvsdr打开该文件并且输入:set ff便可以看到此时lvsdr文件的格式为dos,如下图所示。

要把它变成unix格式可以使用命令set ff=unix,回车即可执行该命令。如下图所示。

执行完set ff=unix命令后,我们按Shift键并且连续两次按Z键来保存。为了确认此时文件的格式是否是unix,我们按照上面说的方式查看该文件格式,发现此时已经是"unix"了。

写完了脚本文件内容,我们现在来测试下我们添加的lvs服务是否成功。由于我们的ipvs-director处于运行状态,我们把它们都重启(由于我们已经把开机自启动文件中的相关内容注释掉了,因此不会开机自启动了)重启lvs-director服务器之后,我们使用命令service lvsdr start来启动lvs服务,如下所示,发现可以正常启动lvs服务了。

[root@lvs-DR ~]# service lvsdr start
Start LVS of DR Mode
192.168.156.36:80
192.168.156.37:80
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.156.110:http rr
-> 192.168.156.36:http Route 1 0 0
-> 192.168.156.37:http Route 1 0 0
[root@lvs-DR ~]#
使用ifconfig来查看IP信息,如下所示,可以看到虚拟IP(192.168.156.110的信息)
[root@lvs-DR init.d]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:55:74:53
inet addr:192.168.156.35 Bcast:192.168.156.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe55:7453/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:550 errors:0 dropped:0 overruns:0 frame:0
TX packets:382 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:51261 (50.0 KiB) TX bytes:54611 (53.3 KiB)

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:55:74:53
inet addr:192.168.156.110 Bcast:192.168.156.110 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
下面我们一起来把nginx来做成服务,我们用上面同样的方式,在lvs-nginx1和lvs-nginx2两台服务器的/etc/rc.d/init.d目录下新建一个lvsdr文件,在文件中添加如下内容。要注意像上面那样将文件的格式由dos转变为unix格式。

#!/bin/sh
VIP=192.168.156.110 #虚拟ip,根据需求修改
. /etc/rc.d/init.d/functions
case $1 in
start)
echo “lo:0 port starting”
# 为了相应lvs调度器转发过来的包,需在本地lo接口上绑定vip
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
# 限制arp请求
echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce
echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore
echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
echo “lo:0 port closing”
ifconfig lo:0 down
echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce
echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore
echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo “Usage: $0 {start ¦ stop}”
exit 1
esac
需要给lvsdr文件添加执行权限,如下
[root@lvs-nginx1 init.d]# chmod +x /etc/rc.d/init.d/lvsdr
[root@lvs-nginx2 rc.d]# chmod +x /etc/rc.d/init.d/lvsdr
为了测试我们做成的服务是否成功,我们先把lvs-nginx1和lvs-nginx2两台服务器重启(因为lvs在这两台服务器上已经处于运行状态,由于我们把开机自动动文件中的内容注释掉了,因此开机不会自动启动)。两台nginx服务器重启后,我们使用service lvsdr start ,启动服务后使用ifconfig来查看IP信息,如下所示,说明正常启动了。同样,我们启动lvs-nginx2的lvs服务。

[root@lvs-nginx1 init.d]# service lvsdr start
lo:0 port starting
[root@lvs-nginx1 init.d]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:13:7C:39
inet addr:192.168.156.36 Bcast:192.168.156.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe13:7c39/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:379 errors:0 dropped:0 overruns:0 frame:0
TX packets:260 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:35057 (34.2 KiB) TX bytes:54631 (53.3 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

lo:0 Link encap:Local Loopback
inet addr:192.168.156.110 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
虽然我们把lvs做成了服务,但是我们的lvs-ngiinx1和lvs-nginx2两台服务器的nginx服务还没开启,我们要测试的话就要开启nginx服务。
[root@lvs-nginx1 init.d]# /usr/local/nginx/sbin/nginx
[root@lvs-nginx2 init.d]# /usr/local/nginx/sbin/nginx
然后我们重新刷新地址http://192.168.156.110/index.html,可以看到页面在Welcome to nginx!–36和Welcome to nginx!–37之间来回切换。说明负载正常。
服务既然可以启动,当然可以关闭,我们可以使用service lvsdr stop来关闭所有服务器上的lvs服务,如下所示。

[root@lvs-DR init.d]# service lvsdr stop
Stop LVS DR
[root@lvs-DR init.d]#
[root@lvs-nginx1 init.d]# service lvsdr stop
lo:0 port closing
[root@lvs-nginx1 init.d]#
[root@lvs-nginx2 init.d]# service lvsdr stop
lo:0 port closing
[root@lvs-nginx2 init.d]#
上面把LVS做成了系统服务,如果我们想把Nginx也做成系统服务的话,跟上面很类似,在/etc/init.d(/etc/rc.d/init.d目录与/etc/init.d目录实际是同一个目录,由软链接进行关联)目录下新建一个脚本文件,名称就叫nginx。为了排版方便,我还是习惯性的用NodePad++,不过要记得在粘贴脚本内容之前要确认脚本文件的编码格式是UTF-8无BOM格式!

      脚本内容如下:

#! /bin/bash

chkconfig: 35 22 22

description: Nginx is an HTTP(S) server, HTTP(S) reverse

set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC=“nginx daemon”
NAME=nginx
DAEMON=/usr/local/nginx/sbin/ N A M E S C R I P T N A M E = / e t c / i n i t . d / NAME SCRIPTNAME=/etc/init.d/ NAMESCRIPTNAME=/etc/init.d/NAME
test -x $DAEMON || exit 0
d_start(){
$DAEMON || echo -n " already running"
}
d_stop() {
$DAEMON -s quit || echo -n " not running"
}
d_reload() {
$DAEMON -s reload || echo -n " counld not reload"
}
case “$1” in
start)
echo -n “Starting D E S C : DESC: DESC:NAME”
d_start
echo “.”
;;
stop)
echo -n “Stopping D E S C : DESC: DESC:NAME”
d_stop
echo “.”
;;
reload)
echo -n “Reloading $DESC configuration…”
d_reload
echo “reloaded.”
;;
restart)
echo -n “Restarting $DESC: $NAME”
d_stop
sleep 2
d_start
echo “.”
;;
*)
echo “Usage: $SCRIPTNAME {start|stop|restart|reload}” >&2
exit 3
;;
esac
exit 0
接着一定要像添加LVS服务时那样,将nginx文件的格式由dos变为unix格式!!否则将提示找不到该脚本文件。
下面要给nginx这个脚本文件添加执行权限

[root@lvs-nginx1 nginx]# chmod +x /etc/init.d/nginx
下面我们先测试下我们添加的服务是否正确,如果当前nginx正在运行的话,先把它关掉,如果当前nginx没有运行的话,就可以直接使用命令:service nginx start来测试了,如下所示。说明我们的nginx系统服务正常。
[root@lvs-nginx1 nginx]# service nginx start
Starting nginx daemon:nginx.
[root@lvs-nginx1 nginx]# ps -ef|grep nginx
root 1427 1 0 19:03 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 1428 1427 0 19:03 ? 00:00:00 nginx: worker process
root 1430 1359 0 19:03 pts/0 00:00:00 grep nginx
[root@lvs-nginx1 nginx]#
那如果我们想要将LVS服务和nginx服务都做成开机自启动(这样毕竟可以省我们不少时间)的话,可以使用chkconfig --add lvsdr和chkconfig --add nginx来添加到开机启动当中。但这里有个问题,就是添加lvsdr到开机启动时会报如下错误。
[root@lvs-DR ~]# chkconfig --add lvsdr
lvsdr 服务不支持 chkconfig
这是由于我们在lvsdr脚本的头部没有添加# chkconfig和# description导致的,那么我们便添加一下,如下图所示。关于chkconfig: 35 21 21是什么意思,大家可以参考http://blog.csdn.net/u012453843/article/details/72801558这篇博客进行学习。

     添加的头部内容如下:

chkconfig: 35 21 21

description: LVS is a virtual server cluster system

    添加完头部内容后,我们再将lvsdr添加开机启动服务当中,如下图所示,可以看到正常添加到开机启动服务列表当中了。

      lvs-director已经将服务添加到开机启动服务列表当中了,lvs-nginx1和lvs-nginx2上的lvsdr服务也要添加到开机服务列表当中,当然了,前提也需要在lvsdr脚本文件中添加上面两行头部信息,如下图所示。注意:lvs-nginx1和lvs-nginx2都在lvsdr脚本文件头部添加这两行内容。之后就像上面操作那样,将lvsdr添加到开机自启动服务列表当中。


      # chkconfig: 35 21 21三个数字的意思分别是,35代表在第3和第5种情况开机自启(lvsdr          0:关闭1:关闭2:关闭3:启用4:关闭5:启用6:关闭)。第一个21代表服务启动的顺序,第二个21代表服务关闭的顺序,这个要根据你服务器上服务的数量而定,而且要根据服务的启动顺序来定,如果服务启动要有先后顺序的话,这个数字就一定要排好序,上面我们把lvsdr的启动顺序定为了21,那么nginx的启动顺序我们便定义为22吧(它和lvsdr倒是没有什么先后顺序,谁在前谁在后无所谓)。nginx服务的头部信息如下图所示。



      添加nginx到开机自启动服务列表中,如下图所示。


    同理,我们把lvs-nginx2服务器上的nginx服务也添加到开机自启动服务列表当中


   好,开机启动我们都配置好了,现在我们便重新启动三台服务器,重启后,我们来刷新下http://192.168.156.110/index.html这个地址,可以看到访问的nginx首页在36和37之间均匀切换,这说明负载均衡没有问题。


     附:如果要将某服务从开机启动服务列表中去掉的话,可以使用如下命令(这里以nginx服务为例),删除完之后,在服务列表中便没有nginx了。

[root@lvs-nginx1 nginx]# chkconfig --del nginx

你可能感兴趣的:(Nginx基础、学习nginx配置及举例使用端口或域名来区分不同的虚拟主机、nginx配置反向代理、nginx负载均衡、LVS+Nginx负载均衡)