故事背景
这次我需要将一个Flask应用部署到本地的Windows服务器上。操作系统是64位的,程序是基于Python 3开发的,大体就是这样。
部署选项
根据Flask的部署指南,可供选择的方式还是蛮多的,IIS、Apache、nginx……
本着享受生活不折腾的原则,我们应该选择标准的、方便的、用户多的技术。
再按照页面上的提示,“Just remember that your Flask application object is the actual WSGI application“,于是,mod_wsgi(Apache)就成了我的不二选择。
Running mod_wsgi on Windows
在Windows上运行Apache with mod_wsgi需要一些技巧。
有4点是必须严格遵守的:
- 不能混用32位和64位的文件
- 安装Python时要选择“Install for all users”
- 构建Apache使用的编译器版本要与构建Python的一致
- 构建mod_wsgi使用的编译器版本要与构建Python的一致
下载
mod_wsgi的下载地址是https://github.com/GrahamDumpleton/mod_wsgi/releases,但不是每一次更新都有预编译好的二进制文件。
我使用的是mod_wsgi 4.4.12,对应的Python是3.3.5或者3.4.2。
Apache的下载地址是https://www.apachelounge.com/download/VC10/,我使用64位的版本。
安装
安装Python时要选择“Install for all users”。另外,自定义项目里的“Add python.exe to Path”也最好选上。
把Apache24文件夹解压缩到c:\Apache24。(因为配置文件里是默认的这个路径,如果要放在别的地方,就自己修改下相应的配置)
ps.为了方便排错,可以在这里先测试一下Apache是否正常。运行httpd.exe,然后访问http://localhost/,如果没有问题应该可以看到测试页。
把mod_wsgi-py34-VC10.so复制到c:\Apache24\modules目录下,文件名改成mod_wsgi.so,然后把
LoadModule wsgi_module modules/mod_wsgi.so
添加到配置文件(httpd.conf)里。
测试
将测试文件保存为c:\mydir\myapp.wsgi
1 def application(environ, start_response): 2 status = ‘200 OK‘ 3 output = b‘Hello World!‘ 4 5 response_headers = [(‘Content-type‘, ‘text/plain‘), 6 (‘Content-Length‘, str(len(output)))] 7 start_response(status, response_headers) 8 9 return [output]
在配置文件里添加:
1 <VirtualHost *:80> 2 WSGIScriptAlias /myapp c:\mydir\myapp.wsgi 3 <Directory c:\mydir> 4 Require all granted 5 </Directory> 6 </VirtualHost>
重新运行httpd.exe,然后访问http://localhost/myapp,看到Hello World!就说明安装成功了。
部署Flask应用
使用pip安装Flask:
pip install flask
把Flask例程保存为c:\mydir\hello.py
1 from flask import Flask 2 app = Flask(__name__) 3 4 @app.route("/") 5 def hello(): 6 return "Hello World!" 7 8 if __name__ == ‘__main__‘: 9 app.run()
mod_wsgi要求WSGI应用的入口叫“application”,所以我们还需要创建一个.wsgi文件来做转换。把下面的代码保存为c:\mydir\myapp.wsgi
1 import sys 2 sys.path.insert(0, ‘c:\\mydir‘) 3 from hello import app as application
将c:\mydir加入系统环境的Path变量是为了确保我们的hello模块可以被解释程序找到。
重启Apache,查看一下配置好的成果吧。
扩展阅读
Working with Virtual Environments