反向代理负载均衡的nginx 实现反向代理负载均衡

如题所述

第1个回答  2016-05-29

1)环境:
a. 本地使用Windows系统,然后使用VirutalBox安装一个虚拟的Linux系统。
在本地的Windows系统上分别安装nginx(侦听8080端口)和apache(侦听80端口)。在虚拟的Linux系统上安装apache(侦听80端口)。这样相当于拥有了1台nginx在前端作为反向代理服务器;后面有2台apache作为应用程序服务器(可以看作是小型的server cluster。;-));
b. nginx用来作为反向代理服务器,放置到两台apache之前,作为用户访问的入口。
nginx仅仅处理静态页面,动态的页面(php请求)统统都交付给后台的两台apache来处理。也就是说,可以把网站的静态页面或者文件放置到nginx的目录下;动态的页面和数据库访问都保留到后台的apache服务器上。
c. 如下两种方法实现server cluster的负载均衡。
假设前端nginx(为127.0.0.1:8080)仅仅包含一个静态页面index.html;后 台的两个apache服务器(分别为localhost:80和158.37.70.143:80),一台根目录放置phpMyAdmin文件夹和 test.php(里面测试代码为print server1;),另一台根目录仅仅放置一个test.php(里面测试代码为print server2;)。
2)针对不同请求的负载均衡:
a. 在最简单地构建反向代理的时候(nginx仅仅处理静态不处理动态内容,动态内容交给后台的apache server来处理),具体的设置为:在nginx.conf中修改:
location ~ \.php$ {
proxy_pass 158.37.70.143:80;
}
>;这样当客户端访问localhost:8080/index.html的时候,前端的nginx会自动进行响应;
>;当用户访问localhost:8080/test.php的时候(这个时候nginx目录下根本就没有该文件),但是通过上面的设置location ~ \.php$(表示正则表达式匹配以.php结尾的文件,详情参看location是如何定义和匹配的),nginx服务器会自动pass给158.37.70.143的apache服务器了。该服务器下的test.php就会被自动解析,然后将html的 结果页面返回给nginx,然后nginx进行显示(如果nginx使用memcached模块或者squid还可以支持缓存),输出结果为打印 server2。
如上是最为简单的使用nginx做为反向代理服务器的例子。
b. 我们现在对如上例子进行扩展,使其支持如上的两台服务器。
设置nginx.conf的server模块部分,将对应部分修改为:
location ^~ /phpMyAdmin/ {
proxy_pass 127.0.0.1:80;
}
location ~ \.php$ {
proxy_pass 158.37.70.143:80;
}
上面第一个部分location ^~ /phpMyAdmin/,表示不使用正则表达式匹配(^~),而是直接匹配,也就是如果客户端访问的URL是以http://localhost:8080/phpMyAdmin/开头的话(本地的nginx目录下根本没有phpMyAdmin目录),nginx会自动pass到127.0.0.1:80的Apache服务器,该服务器对phpMyAdmin目录下的页面进行解析,然后将结果发送给nginx,后者显示;
如果客户端访问URL是http://localhost/test.php的话,则会被pass到158.37.70.143:80的apache进行处理。
因此综上,实现了针对不同请求的负载均衡。
>;如果用户访问静态页面index.html,最前端的nginx直接进行响应;
>;如果用户访问test.php页面的话,158.37.70.143:80的Apache进行响应;
>;如果用户访问目录phpMyAdmin下的页面的话,127.0.0.1:80的Apache进行响应。
3)访问同一页面的负载均衡:
即用户访问http://localhost:8080/test.php这个同一页面的时候,实现了两台服务器的负载均衡(实际情况中,这两个服务器上的数据要求同步一致,这里我们分别定义了打印server1和server2是为了进行辨认区别)。
a. 现在的情况是在windows下nginx是localhost侦听8080端口;
两台apache,一台是127.0.0.1:80(包含test.php页面但是打印server1),另一台是虚拟机的158.37.70.143:80(包含test.php页面但是打印server2)。
b. 因此重新配置nginx.conf为:
>;首先在nginx的配置文件nginx.conf的http模块中添加,服务器集群server cluster(我们这里是两台)的定义:
upstream myCluster {
server 127.0.0.1:80;
server 158.37.70.143:80;
}
表示这个server cluster包含2台服务器
>;然后在server模块中定义,负载均衡:
location ~ \.php$ {
proxy_passhttp://myCluster; #这里的名字和上面的cluster的名字相同
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
}
这样的话,如果访问http://localhost:8080/test.php页面的话,nginx目录下根本没有该文件,但是它会自动将其pass到myCluster定义的服务区机群中,分别由127.0.0.1:80;或者158.37.70.143:80;来做处理。上面在定义upstream的时候每个server之后没有定义权重,表示两者均衡;如果希望某个更多响应的话例如:
upstream myCluster {
server 127.0.0.1:80weight=5;
server 158.37.70.143:80;
}
这样表示5/6的几率访问第一个server,1/6访问第二个。另外还可以定义max_fails和fail_timeout等参数。
====================
综上,通过使用nginx的反向代理服务器reverse proxy server的功能,将其布置到多台apache server的前端。nginx仅仅用来处理静态页面响应和动态请求的代理pass,后台的apache server作为app server来对前台pass过来的动态页面进行处理并返回给nginx。
通过以上的架构,我们可以实现nginx和多台apache构成的机群cluster的负载均衡。
两种均衡:
1)可以在nginx中定义访问不同的内容,代理到不同的后台server;如上例子中的访问phpMyAdmin目录代理到第一台server上;访问test.php代理到第二台server上;
2)可以在nginx中定义访问同一页面,均衡(当然如果服务器性能不同可以定义权重来均衡)地代理到不同的后台server上。如上的例子访问test.php页面,会均衡地代理到server1或者server2上。
实际应用中,server1和server2上分别保留相同的app程序和数据,需要考虑两者的数据同步。

nginx--正向代理、反向代理及负载均衡(图解+配置)
Nginx作为高性能的web服务器,不仅支持反向代理,还具备正向代理和负载均衡功能。正向代理通过代理客户端的请求,隐藏用户真实IP;反向代理则隐藏应用服务器,由代理服务器进行请求转发和负载均衡。理解这两种代理方式,可以从直观的图片中获知其工作原理。配置实践 正向代理配置涉及对https请求的支持,需安装特...

Nginx常见的面试题—限流、正向、反向代理、负载均衡策略
Nginx是一个多功能的Web服务器和反向代理服务器,支持HTTP、HTTPS、SMTP、POP3和IMAP协议,常用于负载均衡和高并发环境。它在项目中广泛使用,以其跨平台、配置简单、非阻塞、内存消耗低和成本低廉等优点受到青睐。正向代理和反向代理的主要区别在于请求的方向和目标。正向代理在客户端和原始服务器之间,客户...

docker nginx反向代理和负载均衡配置
场景1:宿主机目录存储静态资源,需要通过nginx代理提供给外部访问。场景2:tomcat容器内运行一个web程序,需要代理出去。场景3:该web程序运行在两个tomcat容器中,通过nginx实现负载均衡。为了解决容器重启后配置丢失的问题,使用docker的卷(volume)功能将配置文件从容器内移动到宿主机。创建本地的nginx.conf...

nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP_百度知 ...
首先,在前端nginx上需要做如下配置:location \/ proxy_set_hearder host $host;proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;proxy_set_header X-real-ip $remote_addr;};nginx会在把请求转向后台real-server前把http报头中的ip地址进行替换;这样操作完成后,real-server也...

正向代理、反向代理、负载均衡(转载)
这里提到的客户端发送的、Nginx 反向代理服务器接收到的请求数量,就是我们说的负载量。请求数量按照一定的规则进行分发,到不同的服务器处理的规则,就是一种均衡规则。所以将服务器接收到的请求按照规则分发的过程,称为负载均衡。负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载...

nginx负载均衡策略是什么?
nginx实现反向代理负载均衡 a、本地使用Windows系统,然后使用VirutalBox安装一个虚拟的Linux系统。在本地的Windows系统上分别安装nginx(侦听8080端口)和apache(侦听80端口)。在虚拟的Linux系统上安装apache(侦听80端口)。这样相当于拥有了1台nginx在前端作为反向代理服务器;后面有2台apache作为应用程序...

【nginx】如何解决使用nginx作为反向代理端口耗尽问题?
使用 HAProxy 负载均衡300k并发tcp连接 https:\/\/www.sundayle.com\/haproxy-optimization Use HAProxy to load balance 300k concurrent tcp socket connections: Port Exhaustion, Keep-alive and others https:\/\/www.linangran.com\/?p=547 Nginx作为反向代理服务器是否可以突破单机65535TCP连接的限制?

Nginx代理
Nginx不仅可以作为反向代理实现负载均衡,还能用作正向代理进行上网等功能。正向代理:通过代理服务器访问互联网资源,这种代理服务就称为正向代理。反向代理:客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,...

Nginx代理
作为一款强大的网络服务器,Nginx不仅擅长于反向代理,实现负载均衡的卓越性能,而且能够作为正向代理,扩展网络访问功能,为用户提供更高效、安全的上网体验。正向代理的智慧 正向代理,即通过代理服务器访问互联网资源,这种代理方式将用户的请求先发送到代理服务器,再由代理服务器转发至目标服务器。它的核心...

Nginx配置反向代理,一篇搞定!
这部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。下面的反向代理、动静分离、负载均衡都是在这部分中配置。反向代理如何配置:实现效果:使用 Nginx 反向代理,访问 123.com 直接跳转...

相似回答