本章在上一章nginx反向代理的基础上,实现负载均衡。
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。----百度百科
为什么要实现负载均衡?我们tornado在允行的时候,它是异步的,对于请求是一个一个处理的,一个端口绑定对应一个进程,当很多人同时访问的时候,服务器就会很慢,同样的如果我们服务器是多核的,它可以同时处理多个进程,如果我们不用岂不是浪费资源?并且如果你有钱那么你是不是会部署多个服务器呢,来缓解访问量,那如何进行相同的请求路径映射到不同服务器呢?那就是需要反向代理,负载均衡。
1、https_mian.py 模拟多个进程,开启多个端口
from tornado import httpserver
from tornado import ioloop
from tornado import web
# 开启多进程
from multiprocessing import Pool
class TestHandler(web.RequestHandler):
# 允许跨域,否则报错
def set_default_headers(self):
self.set_header("Access-Control-Allow-Origin", "*")
self.set_header("Access-Control-Allow-Headers", "Content-Type")
self.set_header("Access-Control-Allow-Methods", "POST,GET,OPTIONS")
def get(self):
self.write("Hello, World!")
def main(port):
application = web.Application([
(r"/", TestHandler),
])
server = httpserver.HTTPServer(application, ssl_options={
"certfile":"server.crt",
"keyfile": "server.key",
}
)
server.listen(port)# 单进程开启
# server.bind(port)
# server.start(3) # 方法指定开启几个进程,默认cpu核数
ioloop.IOLoop.instance().start()
if __name__ == "__main__":
p = Pool(3)
for port in range(8000,8003):
p.apply_async(main, args=(port,))
p.close()
p.join()
2、配置我们的nginx
重启nginx
3、这是我们上一章节的前端代码
<html>
<head>
<script type="text/javascript">
function loadXMLDoc() {
var xmlhttp;
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET", document.getElementById("host").value, true);
xmlhttp.send();
}
</script>
</head>
<body>
request url: <input type="text" name="lname" id="host"><br>
<button type="button" onclick="loadXMLDoc()">request</button>
<div id="myDiv"></div>
</body>
</html>
4、这是我们Cetons上的目录文件
5、执行https_main.py,nohup意思是在后台启动,目的是当前进程死掉也不会影响它,方便我们在控制台继续执行其他命令
我们看一下端口开启了没,发现了已经开启了,在访问前别忘记在云服务器控制台开启8000,8001,8002端口
6、我们在浏览器测试一下
前端是看不到转发到那个端口
可以看到 这三个端口都是可以用的。