利用Nginx构建负载均衡服务器

来源:互联网 发布:大数据译见 编辑:程序博客网 时间:2024/05/22 14:14

大家都知道,一个域名对应一个IP地址,而一个WebSite则对应一个IP地址上对应端口服务的应用程序(或位置)。而大型网站的并发访问量非常大,这些网站是如何在一台Web服务器上实现负载均衡的呢?

相信很多人会有与我同样的疑惑,但实际上成熟的解决方案已经大规模投入使用。而常用的则是反向代理方法。

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。基本结构可以如下图所示:


从此图可以看出,用户访问的web服务器实际上是一个代理服务器,而真正处理内容(等一系列复杂操作)都是由墙内的服务器完成的。这不仅减轻了代理服务器的压力,同时也可以使墙内服务器与客户机隔离,防止一些安全问题的发生。此时,只需要增加墙内服务器,用户虽然访问的是同一地址,但可能访问的实际服务器会完全不一样。


以上只是一些理论,如何实现呢?采用Nginx可以轻松完成这一功能。

1、首先,(For Windows)下载Nginx  http://nginx.org/en/download.html。软件大小与软件本身都是一款超轻量级的东西。可以说几乎感觉不到它的存在

当然首先简单了解一下Nginx是什么 。

Nginx ("engine x") 是一款高性能的,轻量级的HTTP Web 服务器 和 反向代理服务器及电子邮件 IMAP/POP3/SMTP 代理服务器。首先它是一款Web服务器,又是一款性能优秀的反向代理服务器

下载完成之后、解压,直接打开nginx.exe可以直接运行nginx服务器,此时浏览器输入localhost可以看到界面。

2、配置文件。conf/nginx.conf

默认的配置如下,可以简单看一下

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #user  nobody;  
  2. worker_processes  1;  
  3. #error_log  logs/error.log;  
  4. #error_log  logs/error.log  notice;  
  5. #error_log  logs/error.log  info;  
  6. #pid        logs/nginx.pid;  
  7. events {  
  8.     worker_connections  1024;  
  9. }  
  10. http {  
  11.     include       mime.types;  
  12.     default_type  application/octet-stream;  
  13.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  14.     #                  '$status $body_bytes_sent "$http_referer" '  
  15.     #                  '"$http_user_agent" "$http_x_forwarded_for"';  
  16.   
  17.     #access_log  logs/access.log  main;  
  18.     sendfile        on;  
  19.     #tcp_nopush     on;  
  20.     #keepalive_timeout  0;  
  21.     keepalive_timeout  65;  
  22.     #gzip  on;  
  23.     server {  
  24.         listen       80;  
  25.         server_name  localhost;  
  26.         #charset koi8-r;  
  27.         #access_log  logs/host.access.log  main;  
  28.         location / {  
  29.             root   html;  
  30.             index  index.html index.htm;  
  31.         }  
  32.     }  
  33. }  
整体配置与apache略相似,如果开发的时候,可以打开相关log参数,error_log和access_log即可。server内的内容显示,定义了一个服务器,监听80端口,位置为/html/*,主页为index.html,并将50X错误重定向到50x.html。

也可以定义virtualhost,并将位置定位到其他path。

3、不同地址的代理。

nginx可以实现对不同地址的反向代理(这里并非指不同IP或者域名地址,而是路径),例如希望将所有显示部分(/view/xxx)的交给A服务器,地址为x.x.x.101,逻辑处理部分(/control/xxx)交给B服务器,地址为x.x.x.102,可以添加如下配置

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. location ~ \/view/[\S]+.php$ {  
  2.      proxy_pass   http://x.x.x.101;  
  3. }  
  4.   
  5. location ~ \/control/[\S]+.php$ {  
  6.      proxy_pass   http://x.x.x.102;  
  7. }  
~表示采用正则表达式匹配,若在location后添加^~表示不以正则式匹配,上面配置将所有/view/*.php的请求交给了http://x.x.x.101,而/control/*.php的请求交给了http://x.x.x.102,在逻辑上实现代理与分离。

当然在A、B服务器上,可以构建各自需要的如Apache服务器或Tomcat甚至NodeJS

4、同地址负载均衡。

如果是同一地址的并发访问量巨大,需要进行负载均衡。例如某一抢购页面或者某一类页面。可以添加如下配置定义一个WEB服务器集群:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. upstream webCluster{  
  2. server x.x.x.101;   
  3. server x.x.x.102;   
  4. server x.x.x.103;   
  5. server x.x.x.104;   
  6. #...可以添加更多服务器  
  7. }   

同时,给该集群配置一个location,方法同上:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. location ~ \/views/[\S]+php$  
  2. {   
  3. proxy_pass http://webCluster ;   
  4. proxy_redirect off;   
  5. proxy_set_header Host $host;   
  6. proxy_set_header X-Real-IP $remote_addr;   
  7. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
  8. }   
此时再访问/views下的所有目录,都会被平均分配到集群中的所有机器上。

这里的集群中所有地址并无权重,默认weight=1,当然也可以自定义权重,让一些处理能力高的服务器得到更多的请求:


[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. upstream webCluster{  
  2. server x.x.x.101  weight=2;   
  3. server x.x.x.102;   
  4. server x.x.x.103;   
  5. server x.x.x.104;   
  6. #...可以添加更多服务器  
  7. }   
这样一共weight = 5,101服务器会有2/5的权重,其他为1/5。

以上则是大型网站在WEB端的负载均衡的实现,该实现方法最为廉价和高效。当然,还有很多其他实现负载均衡的方法,例如使用一些大型硬件进行IP重定向等等。

0 0
原创粉丝点击