大家都知道,一个域名对应一个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重定向等等。
利用Nginx构建负载均衡服务器,布布扣,bubuko.com
原文:http://blog.csdn.net/jpbirdy/article/details/25030251