服务器生产环境部署(LNMP) 支持python

使用python的flask做WEB开发已经有半个多月的时间了,磨磨唧唧滴做了一个WEB后台,到了服务器部署阶段,一个服务器部署折腾了我五个晚上,下面说说遇到的坑!

先说下部署环境:

1、centos 7系统

2、LNMP一键环境包

3、python的flask包,使用tornado独立 WSGI 容器

最大的坑!

网络:

centos的YUM源一定要换成国内的,不然在下载其他依赖组件有时会造成错误,下载失败整个环境的编译安装都会出错,这里分享一下centos 7 更换阿里云的YUM源方法(其实官方也有步骤教程)点击这里查看:centos更换国内本地YUM源方法(http://www.zongk.com/zongk/109.html)

第三方依赖包组件:
学习使用python以来都是用的python3版本,这次flask也是用的python3版本,所以centos自带的python2 满足不了,只能在编译安装一个python3,具体的centos7 编译安装python3步骤方法详见:centos7 下编译安装python3以及pip3方法(http://www.zongk.com/zongk/110.html)

OK!到这里,centos 7下的python3环境编译安装成功之后,开始安装LNMP的一键环境包,这里就不做介绍了,LNMP官方有详细的编译安装步骤教程。
以上的python3以及所需的flask,tornado,pymysql,服务器环境一键包LNMP都安装成功之后,下面进入实战配置操作:
flask程序与tornado这里也不做详细介绍,官方都有:
具体代码:
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from yourapplication import app #这里是引用flask的APP类

http_server = HTTPServer(WSGIContainer(app))
http_server.listen(8989)#这里是flask程序使用的端口号
IOLoop.instance().start()

以上代码重新写一个文件start.py,运行flask要先运行start.py把flask程序跑起来,
下面是nginx配置:
配置直接用官方:
server {
listen 80;#监听80端口

server_name www.zongk.com;#这里是你的解析域名

access_log  /var/log/nginx/access.log;#记录访问成功信息
error_log  /var/log/nginx/error.log;#记录错误信息

location / {
proxy_pass         http://127.0.0.1:8989/;
#意思是监听到www.zongk.com访问进来代理到本地的8989端口上即我们的运行flask端口,下面的三个header一定要带,不然访问一直都是跳转到flask程序的404页面如果你设置的话,没设置就是报404错误,我遇到的坑。
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;
}
}
关于以上的三个header,我还不是很了解具体的工作原理,nginx说实话第一次配置,不是很了解。后面的$host 等几个类似PHP变量是什么意思?怎么理解,如果有了解nginx配置的可以在下面评论分享一下。
flask官方文档也说了:
—————————————————-
如果你的 httpd 不提供这些标头,最常见的配置引用从 X-Forwarded-Host 设置的主机名和从 X-Forwarded-For 设置的远程地址:

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

信任标头
请记住在一个非代理配置中使用这样一个中间件会是一个安全问题,因为它盲目地信任一个可能由恶意客户端伪造的标头。
如果你想从另一个标头重写标头,你可能会使用这样的一个修正程序:

class CustomProxyFix(object):

def __init__(self, app):
self.app = app

def __call__(self, environ, start_response):
host = environ.get(‘HTTP_X_FHOST’, ”)
if host:
environ[‘HTTP_HOST’] = host
return self.app(environ, start_response)

app.wsgi_app = CustomProxyFix(app.wsgi_app)
———————————————————–
这里不是很了解,是在views.py里面设置么?什么意思?
上面nginx配置完成之后,重启一下nginx:
/etc/init.d/nginx restart
就可以直接使用解析域名访问了!体验一下吧!如果有问题可以在下面评论