本章介绍在之前Tornado项目的基础上实现前后端分离的nginx反向代理,同样的,本项目是在Centos上演示的,windows同样的流程,与此同时我们还会提到配置https443端口和布置https,http强制转换到https。
一、认识nginx反向代理
在计算机网络中,反向代理是代理服务器的一种。服务器根据客户端的请求,从其关联的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在为什么要做反向代理呢,我们一般是为了端口转发,举个例子:我们是前后端分离的项目,我们模拟这样两个场景:
1)、前端代码和后端代码包括数据库都可能在一个服务器上;
2)、我不只有一个服务器,但是我只有一个数据库,一个前端。
我们来解释第一个,第二个下一章谈到负载均衡的时候就知道了。
在实际部署中我们必然要把前端代码放到服务器,给开放一个ip和端口,指向index.html文件(类似程序中的mian函数)。那么如何去灵活部署呢?就需要代理服务器去监听端口,然后将指定的资源发给你;其次假如我服务器端口号变了或者换了机器,那就意味着ip变了或者端口号变了,你前端代码难道需要重新编译吗?显然很麻烦,为了解决这个问题nginx充当桥梁,做个媒介,你俩随便动只要nginx端口和请求的资源的路径绑定即可。
二、在Centos部署反向代理
1、前端代码准备 index.html
<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>
2、Centos7 安装nginx(当前目录/root,当前用户root)
参考连接:https://blog.youkuaiyun.com/qq_37345604/article/details/90034424
下载nginx (当前目录/root,当前用户root)
wget http://nginx.org/download/nginx-1.9.9.tar.gz
解压到/usr(当前目录/root,当前用户root)
tar -zxvf nginx-1.9.9.tar.gz -C /usr
切换目录,编译它,加入参数是为了开启ssl,就是做https的反向代理(当前目录/usr/nginx-1.9.9,当前用户root)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make
make install
我们可以发现 安装在了 usr/local/目录下
启动nginx
/usr/local/nginx/sbin/nginx
3、上服务端代码,我们只是为了测试因此,写一个测试路由即可:如下main.py文件
from tornado import httpserver
from tornado import ioloop
from tornado import web
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():
application = web.Application([
(r"/", TestHandler),
])
server = httpserver.HTTPServer(application)
server.listen(8000)
ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
https_main.py文件,留着做https服务器
from tornado import httpserver
from tornado import ioloop
from tornado import web
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():
application = web.Application([
(r"/", TestHandler),
])
server = httpserver.HTTPServer(application, ssl_options={
"certfile":"server.crt",
"keyfile": "server.key",
})
server.listen(8000)
ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
4、文件部署,为了简单我们main.py文件index.html文件放在一起/root/web目录下,同时我们将上一章节做的https_main.py文件和生成的证书也放在一起。
5、改nginx的配置文件,我们监听80端口(当前目录/root,当前用户root)
vim /usr/local/nginx/conf/nginx.conf
这个很重要,不然会报403错误的
更改配置文件之后记得重启nginx
/usr/local/nginx/sbin/nginx -s reload
我们在浏览器访问一下,但是别忘记在云服务器控制台开80端口,顺便开了443端口,等下hu
输入IP地址 ,可以看到我们的反向代理配置成功
我们来启动一下main.py文件
在页面中输入后端地址,request一下
接下来我们改变一下请求路径,但是服务器路由没改变,通过nginxf反向代理同样访问服务器
更改配置文件,别忘记啊重启nginx
体会到了吗?
6、现在 我们来监听443端口,开启https
更改nginx文件
查看端口启动了没
如果没启动,执行下面命令
在浏览器输入 完美
接下来就是在443端口中监听https请求访问服务器的命令,https请求访问,也就是说我们服务器必须是https那我们启动https_main.py文件才行,另外配置nginx文件吧
转发的端口看见没https,配置好之后,重启nginx,执行https_main.py
在浏览器访问
完美,现在我们希望别人用http请求的时候强制转换到https上
配置nginx,将server {listen 80 }那个部分注释掉,https server改成如下部分,重启nginx
输入,然后回车
实际上 http 转到https
切记 对于服务器的访问 http是不会跳转到https的哦,因为这两个协议是有区别的