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

来源:互联网 发布:mysql查看用户名密码 编辑:程序博客网 时间:2024/05/01 22:29

大家都知道,一个域名对应一个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

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

#user  nobody;worker_processes  1;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '    #                  '$status $body_bytes_sent "$http_referer" '    #                  '"$http_user_agent" "$http_x_forwarded_for"';    #access_log  logs/access.log  main;    sendfile        on;    #tcp_nopush     on;    #keepalive_timeout  0;    keepalive_timeout  65;    #gzip  on;    server {        listen       80;        server_name  localhost;        #charset koi8-r;        #access_log  logs/host.access.log  main;        location / {            root   html;            index  index.html index.htm;        }    }}
整体配置与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,可以添加如下配置

location ~ \/view/[\S]+.php$ {     proxy_pass   http://x.x.x.101;}location ~ \/control/[\S]+.php$ {     proxy_pass   http://x.x.x.102;}
~表示采用正则表达式匹配,若在location后添加^~表示不以正则式匹配,上面配置将所有/view/*.php的请求交给了http://x.x.x.101,而/control/*.php的请求交给了http://x.x.x.102,在逻辑上实现代理与分离。

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

4、同地址负载均衡。

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

upstream webCluster{server x.x.x.101; server x.x.x.102; server x.x.x.103; server x.x.x.104; #...可以添加更多服务器} 

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

location ~ \/views/[\S]+php${ proxy_pass http://webCluster ; 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; } 
此时再访问/views下的所有目录,都会被平均分配到集群中的所有机器上。

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


upstream webCluster{server x.x.x.101  weight=2; server x.x.x.102; server x.x.x.103; server x.x.x.104; #...可以添加更多服务器} 
这样一共weight = 5,101服务器会有2/5的权重,其他为1/5。

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



0 0
原创粉丝点击