您的位置:首页 > 运维架构 > Nginx

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

2016-12-30 16:34 218 查看
大家都知道,一个域名对应一个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





#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,可以添加如下配置

[html] view
plaincopy





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服务器集群:

[html] view
plaincopy





upstream webCluster{  

server x.x.x.101;   

server x.x.x.102;   

server x.x.x.103;   

server x.x.x.104;   

#...可以添加更多服务器  

}   

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

[html] view
plaincopy





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,当然也可以自定义权重,让一些处理能力高的服务器得到更多的请求:

[html] view
plaincopy





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重定向等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: