本章在上一章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、我們在瀏覽器測試一下
前端是看不到轉發到那個端口
可以看到 這三個端口都是可以用的。