当服务器的访问量大量飙升的时候,一台服务器就会承受不了那么大的压力,所以我们可以将例如web这种服务进行分流,转发到其他服务器进行处理,这种转发的方式使用的是Nginx的ngx_http_proxy_module模块和upstream功能。
一、机器准备和软件安装
首先要准备三台虚拟机,一台虚拟机安装Nginx进行代理功能的实现,另外两台安装Httpd进行Web功能的实现。在这里,我准备了一台IP为172.16.2.1的主机安装Nginx,另两台IP分别为172.16.2.2和172.16.2.3的主机安装Httpd(三台都是CentOS 6):
配置yum源: [nginx] name=nginx enabled=1 baseurl=http://nginx.org/packages/centos/6/x86_64/ gpgcheck=0
使用yum -y install nginx和yum -y install httpd来进行安装,安装完成之后,启动服务,就可以通过浏览器来进行查看(修改主页在这里不赘述nginx在“/usr/share/nginx/html/index.html”,httpd在“/var/www/html/index.html”):
二、ngx_http_proxy_module模块
反代转发能够实现的功能是当我们访问172.16.2.1的时候,Nginx服务器自动的将我们的访问请求转发到172.16.2.2上(172.16.2.3暂时不用),这个功能是使用ngx_http_proxy_module模块来实现的,这个模块中主要使用的参数是:proxy_pass URL,它的功能是:设置一个被代理的服务器的地址和协议以及一个用于被映射位置的可选的URI;可以反代http协议和https协议;服务器地址可以是一个域名或者IP地址再加上一个可选的端口号;
注意:
1) proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;
location /uri/ {
proxy_pass http://HOST;
}
2) proxy_pass后面的路径是一个uri,其会将location的uri替换成proxy_pass指令后面的uri,我们可以在目标地址后面加上一个“/”来达到不更改目录的转发方式,例如:“http://HOST/”;
location /uri/ {
proxy_pass http://HOST/new_uri/;
}
3) 如果location定义uri时使用正则表达式的模式匹配(~|~*),则proxy_pass指令之后绝对不能使用uri;否则nginx会将之视为语法错误;
location ~(区分大小写)|~*(不区分大小写) PATTERN {
proxy_pass http://HOST;
}
我们在IP为172.16.2.1的Nginx反代服务器上修改其配置文件“/etc/nginx/conf.d/default.conf”(有的配置文件在其主配置文件中),在这个配置文件中找到如图所示的地方,将图中所示的那行代码添加上,就可以实现将对“172.16.2.1”的请求转发到“172.16.2.2”上。(在上边的注意中提到了对URI的匹配,在这里就能够用到,将这条语句加在了这里,实现的功能就是将所有的请求进行转发,我们也可以另外写一个“location”来匹配对应的URI)修改之后,保存退出并使用命令“nginx -t”来检查拼写是否有误,使用命令“nginx -s reload”来重启服务。在重启之后,我们再次通过浏览器访问“172.16.2.1”,发现页面为我们展示的就是“172.16.2.2”的内容了:
三、ngx_http_upstream_module模块
上头我们已经可以将前边来的Web请求转发到后端Web服务器上了,但是仅仅只能转发到一台服务器上,所以在这里我们可以使用ngx_http_upstream_module模块来实现集群,使其能够转发到多个后端Web服务器上。在上面我们准备了三台主机,一台作为Nginx代理服务器,两台作为Web服务器。在上面的实验之后,我们将其转变为集群是一件很简单的事情,只需要在Nginx配置文件的http上下文(server外边)中(如果片段配置文件中没有http上下文,可以在主配置文件中添加)添加下面这几行代码,并在location中引用即可:
upstream httpserv { #“httpserv”是一个随便启的名字,在location引用时使用 server 172.16.2.2 weight=2 fail_timeout=1 max_fail=3; #这条指令是定义后端Web服务器的地址 #weight是定义其权重 #fail_timeout是定义失败超时时间 #max_fail是定义最大失败次数 server 172.16.2.3 weight=1 fail_timeout=1 max_fail=3; server 127.0.0.1 backup; #这条指令是定义当所有的Web服务器都挂掉之后使用自己的Web服务 }
在这里使用“location”指令将符合条件的转发到服务器组中:
在保存退出并重新加载配置文件之后,我们随便使用一台主机使用命令来访问此反代服务器:
从图中我们可以看到集群的基本功能已经实现了,这是基于Nginx的反向代理功能实现的,它的功能比ipvsadm更加灵活,可以基于URI进行详细或不详细的匹配,而且其还可以自动的对后端Web服务器进行检测,一旦测试到后端Web服务器挂掉,就能够立即做出应急处理,例如,我们可以将“172.16.2.2”上的httpd服务关闭,然后在“172.16.2.1”上再次进行请求,可以发现,Nginx服务器已经将“172.16.2.2”从Web服务器组中剔除了:
原文地址:http://11142243.blog.51cto.com/11132243/1983639