大家好,又见面了,我是全栈君。
大家都知道。一个域名相应一个IP地址,而一个WebSite则相应一个IP地址上相应port服务的应用程序(或位置)。而大型站点的并发訪问量很大,这些站点是怎样在一台Webserver上实现负载均衡的呢?
相信非常多人会有与我相同的疑惑,但实际上成熟的解决方式已经大规模投入使用。而经常使用的则是反向代理方法。
反向代理(Reverse Proxy)方式是指以代理server来接受internet上的连接请求,然后将请求转发给内部网络上的server。并将从server上得到的结果返回给internet上请求连接的client,此时代理server对外就表现为一个server。基本结构能够例如以下图所看到的:
从此图能够看出,用户訪问的webserver实际上是一个代理server,而真正处理内容(等一系列复杂操作)都是由墙内的server完毕的。这不仅减轻了代理server的压力。同一时候也能够使墙内server与客户机隔离。防止一些安全问题的发生。此时,仅仅须要添加墙内server。用户尽管訪问的是同一地址,但可能訪问的实际server会全然不一样。
以上仅仅是一些理论。怎样实现呢?採用Nginx能够轻松完毕这一功能。
1、首先,(For Windows)下载Nginx http://nginx.org/en/download.html。软件大小与软件本身都是一款超轻量级的东西。能够说差点儿感觉不到它的存在
当然首先简单了解一下Nginx是什么 。
Nginx (“engine x”) 是一款高性能的,轻量级的HTTP Web server 和 反向代理server及电子邮件 IMAP/POP3/SMTP 代理server。
首先它是一款Webserver,又是一款性能优秀的反向代理server
下载完毕之后、解压,直接打开nginx.exe能够直接执行nginxserver。此时浏览器输入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内的内容显示,定义了一个服务器,监听80port,位置为/html/*。主页为index.html,并将50X错误重定向到50x.html。
也能够定义virtualhost。并将位置定位到其它path。
3、不同地址的代理。
nginx能够实现对不同地址的反向代理(这里并不是指不同IP或者域名地址,而是路径),比如希望将全部显示部分(/view/xxx)的交给Aserver,地址为x.x.x.101。逻辑处理部分(/control/xxx)交给Bserver。地址为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、Bserver上,能够构建各自须要的如Apacheserver或Tomcat甚至NodeJS
4、同地址负载均衡。
假设是同一地址的并发訪问量巨大。须要进行负载均衡。比如某一抢购页面或者某一类页面。能够加入例如以下配置定义一个WEBserver集群:
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,当然也能够自己定义权重,让一些处理能力高的server得到很多其它的请求:
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重定向等等。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116549.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...