利用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重定向等等。
相信很多人会有与我同样的疑惑,但实际上成熟的解决方案已经大规模投入使用。而常用的则是反向代理方法。
反向代理(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重定向等等。
相关文章推荐
- 利用Nginx构建负载均衡服务器
- 利用Nginx构建负载均衡服务器
- 利用Nginx构建负载均衡服务器
- 利用nginx+fastcgi+mysql+memecached构建高性能web手记
- 如何在Ubuntu 14.04上利用HAProxy为WordPress与Nginx构建7层负载均衡器
- 利用Dockerfile构建一个nginx容器
- 利用LVS+Keepalived+Nginx实现高性能高可用负载均衡服务器
- 利用Nginx构建负载均衡server
- 架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层
- 利用Nexus来构建企业级Maven仓库
- 巧妙利用重载构建复合Eureka组件的思路分析
- 利用开源系统构建企业通讯平台(VIOP免费网络电话,FAX传真)
- [C#]利用 DynamicLinq 实现简单的动态表达式构建查询
- 利用Nginx的上传模块和上传进度模块实现网页上传文件
- 3、关于利用SqlSessionFactoryBuilder去构建SqlSessionFactory,以及Mybatis的dao的实现
- Office 365 利用并行工作流构建威客式任务管理系统之使用SharePoint Designer 定制任务过期提醒!
- maven利用Profile构建不同环境的部署包
- 手动利用Apache Ant构建部署自己的Java项目
- 利用nginx的301重定向到另外服务器