windows的flask部署方案一:flask+nginx

前言

前段时间用flask重构了个人博客系统,所以需要部署到云服务器上。由于服务器用的是winserver2012,而win平台下关于flask和nginx的配置说明并不多,所以把过程记录下来,或许对别人有帮助,这篇文章也参考了另外一位网友的文章

部署环境

  • winserver2012/win10
  • python3.5
  • nginx1.6.3
  • tornado

过程

1.下载及配置nginx

直接在nginx官网即可下载到nginx服务器,我用的版本是1.6.3.下载后直接把它解压,文件夹重命名为nginx,然后把它放到c盘根目录下。启动nginx的方法:我发现直接把nginx.exe拖拽到命令行执行会报错:

nginx: [alert] could not open error log file: CreateFile() "logs/error.log" failed (3: The system cannot find the path specified)

2016/06/29 13:24:02 [emerg] 9040#12584: CreateFile() "C:\Users\rookiecoder/conf/nginx.conf" failed (3: The system cannot find the path specified)

正确的做法是:先切换到c盘的nginx文件夹下,再直接运行nginx.exe,命令如下:

cd C:/nginx
nginx.exe

如果启动不报错,那么说明nginx启动成功

再编辑配置文件C:/nginx/conf/nginx.conf,搜索http{},在http{}中加入如下配置信息:


upstream testserver {
  server 127.0.0.1:5000;
  # server 127.0.0.1:5001;
  # server 127.0.0.1:5002;
  # ...
  # 可加入多个,由 nginx 负责负载均衡
}
server {
  listen 80;
  # 这里填写你自己的域名(或者ip)
  server_name www.rookiefly.me;
  charset utf-8;
  location / {
  proxy_pass http://testserver;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_pass_header Set-Cookie;
 }
 }
保存后再启动nginx,如果不报错说明配置成功。

2.用tornado架起flask app

如果你没有安装tornado,那么先安装它:

pip install tornado

由于tornado的某些应用使用了pycurl,为了防止出现莫名其妙的bug,推荐安装:

pip install pycurl

在你的flask app根目录中,新建一个py文件,这里命令为home.py 写入如下代码:

import sys
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from run import app
if len(sys.argv) == 2:
  port = sys.argv[1]
else:
  port = 5000

http_server = HTTPServer(WSGIContainer(app))
http_server.listen(port)
IOLoop.instance().start()

我这里的run是我的博客系统(我的博客系统github地址:此处)的主入口文件 run.py的代码如下:

from app.views import app
if __name__ == '__main__':
  app.run(host='0.0.0.0')

3.开启nginx服务器,运行flask app

cd C:/nginx
nginx.exe
python home.py

4.访问 直接在浏览器输入www.rookiefly.me进行访问,成功!

ps:后面我又想让让后台管理系统配置到nginx服务器上,由于博客的前台和后台都是使用flask写的,路由有冲突,所以需要nginx监听不同端口(前台为5000,后台为10000),如果像上面配置那样,nginx映射的端口都为80,就不能区分到底是前台还是后台的请求了。所以配置需要改成如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;
    upstream home{
        server 127.0.0.1:5000;
    }
    upstream admin{
        server 127.0.0.1:10000;
    }

    server {
        listen       80;
        server_name  www.rookiefly.me;
        charset utf-8;
        #access_log  logs/host.access.log  main;
        location / {
            proxy_pass http://home;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass_header Set-Cookie;
        }
    }

    server {
        listen       10000;
        server_name  www.rookiefly.me;

        charset utf-8;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://admin;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass_header Set-Cookie;
        }
    }

}

这样博客前台页面可以直接通过

www.rookiefly.me 访问了,后台页面需要通过 www.rookiefly.me:10000 进行访问