文章目录
0 前言
因有一台云服务器,服务器为win2008 R2,运行着ASPX的网站,其构架为IIS+MYSQL。为了配合后续MQTT等开发,打算在该服务上跑python和flask.
因现有网站是基于IIS,所以最开始利用IIS服务器,wfastcgi模块。网上也有很多教程,但是根据他们的方案,始终没有调试成功。
开始尝试apache+mod_wsgi,通过大师们的教程,虽然版本和配置环境要求需要比较高,但是还是调试成功。
python flask 在linux服务配置非常简单,而window 配置非常苛刻,所以非特殊情况还是推荐采用linux来运行。
1 版本匹配说明
Windows 下安装python flask需要考虑以下的VC++的编译版本问题:
windows系统的VC++ 库
python的编译版本
apache的编译版本
mod_wsgi的编译版本
python 3.7以上版本都是VC++2017编译,而apache和mod_wsgi最新为2016版编译。
我们需要先考虑windows VC库和mod_wsgi的编译版本,再选择相应的python版本号和apache编译版本。刚开始先安装python,结果发现apache和mod_wsgi无法找到合适的版本。自己编译太麻烦,也容易出错。
1.1 windows VC++库安装
windows 版本为2008 R2,已经升级并打了补丁,变为SP1,可以安装VC++2015(vc14)库。要是没有打补丁到SP1,需要更新后再安装。
windows官方VC++2015库下载地址
1.2 mod_wsgi
mod_wsgi 采用已经编译好的版本,连接地址为:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi。
其中ap24vcXX标识为apache的版本为2.4,采用VC14(VC++2015)编译;cpXX为python版本,win_am64为win 64位架构。
打算采用3.6版本的python,但是没有明显标记vc14版本的mod_wsgi. 打算采用mod_wsgi‑4.7.1‑cp36‑cp36m‑win_amd64.whl来尝试配置,居然尝试通过。
1.3 python
下载python,下载地址:https://www.python.org/downloads/windows/
安装完成后,运行python,vc版本位1900,即VC++2015.
1.4 Apache
Apache 下载地址为:https://www.apachehaus.com/cgi-bin/download.plx
2 安装与配置
2.1 apache 安装配置
apache 不需要安装,直接解压放到服务器目录下,例如c:\server.
apache每次运行再cmd下输入目录\bin\httpd,太麻烦,可以采用添加环境变量。
双击bin目录下的ApacheMonitor.exe,出现控制界面(这个是配置好的界面)
修改配置文件apache/conf/httpd.conf,端口改为8080 8081(因运行环境已经占用80端口),SRVROOT目录改为“c:/server/Apache24”
在服务ApacheMonitor中重启服务,IE中输入localhost:8080,回出现Apache的页面。
2.2 安装mod_wsgi
把下载的mod_wsgi_XXXXX.whl文件复制到python\Scripts下,在CMD终端,将运行目录调整C:\python\Script目录,使用pip3安装
pip3 install "mod_wsgi‑4.7.1‑cp36‑cp36m‑win_amd64.whl"
cd c:\server\python\Script
mod_wsgi-express module-config
loadFile "c:/server/python/python36.dll"
LoadModule wsgi_module "c:/server/python/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "c:/server/python"
再将下面文件拷贝到apache的配置文件apache/conf/httpd.conf中添加上述运行结果的最后三行,具体如下:
2.3 安装flask
在cmd 终端输入 pip3 install flask安装flask
3 配置与测试
3.1 创建网站目录与网站文件
创建网站目录c:\server\test,在这个目录下创建下面两个文档
利用pycharm IDE粘贴下列代码,保存为test.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Welcom to win2008 python flask new!"
if __name__ == '__main__':
app.run()
在粘贴下列代码,保存为test.wsgi
import sys
#app's path
sys.path.insert(0,"C:/server/test")
from test import app
#Initialize WSGI app object
application = app
注意wsgi文件只能放在网站根目录下。
3.2 配置apache 虚拟机
修改配置文件apache/conf/httpd.conf,先增加监听端口号8081(前面已经配置了,不在重复贴图),再开启虚拟主机选项,去掉“#”,如下:
在conf/extra/httpd-vhosts.conf的最后加入下面内容:
<VirtualHost *:8081>
ServerName example.com
Documentroot c:\server\test
WSGIScriptAlias /test C:\server\test\test.wsgi
<Directory C:\server\test>
Require all granted
</Directory>
</VirtualHost>
保存后重启服务
3.3 测试
在IE浏览器输入localhost:8081/test/,可以看到如下图结果。
3. 4 虚拟环境下配置安装
为了使项目的环境和全局环境隔离开,常用虚拟环境安装和运行python+flask。
计划在c:\server目录下增加一个虚拟环境下网站目录,文件夹为web01.
安装虚拟环境
在CMD终端下输入
cd c:\server
pip install virtualenv
运行 “virtualenv web01” 命令
virtualenv web01
在server目录下创建了web01文件夹,其文件下内容如下:
激活虚拟环境
切换到web01\Scripts目录下,运行activate激活虚拟环境,并进入虚拟环境界面下
虚拟环境下安装flask
输入pip3 install flask即可
测试代码
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Welcom to virtual win2008 python flask!"
if __name__ == '__main__':
app.run()
保存为test.py,存储在web01目录下;
import sys
#app's path
sys.path.insert(0,"C:/server/web01")#注意网站目录地址也可以改为C:\\server\\web01,必须是两根\\
from test import app
#Initialize WSGI app object
application = app
保存为test.wsgi,存储在web01下。
Apache 虚拟主机配置修改
只需要修改虚拟主机的配置(httpd-vhosts.conf)即可,如下:
<VirtualHost *:8081>
ServerName example.com
Documentroot c:\server\web01
WSGIScriptAlias /test C:\server\web01\test.wsgi
<Directory C:\server\web01>
Require all granted
</Directory>
</VirtualHost>
测试
重启Apache 服务器,在IE地址栏输入“localhost:8081/test/”
4 其他说明
4.1 wsgi 启用虚拟环境的应用
上文中采用的虚拟环境测试,是把wsgi配置到python主环境中的,不是配置到虚拟环境中,若在虚拟环境中,可能需要对wsgi做先激活虚拟环境,再调用flask
activate_this = r'C:\server\web01\Scripts\activate_this.py'
exec(compile(open(activate_this, "rb").read(), activate_this, 'exec'), dict(__file__=activate_this))
import sys
#Expand Python classes path with your app's path
sys.path.insert(0, r'C:\server\web01\')
#from test import app
#application = app
#上面两句话组合成一体
from test import app as application
4.2避免冲突
避免过个api或者网站发生冲突,可以在Apache 住配置文件中最后加上,下面语句。
WSGIApplicationGroup %{GLOBAL}
4.3 自动更新模块
如果我们修改test.py的内容,如下:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Welcom to virtual new win08!"
if __name__ == '__main__':
app.run()
不重启apache 服务时,IE访问的结果还是未修改前的结果。
在Apache 虚拟机配置文件中加入WSGIScriptReloading On 测试后没有起作用。
其他的采用在入口文件test.py中加入debug=True也不行。
因为我们开发是在环境中做好,再到生产环境中运行,所以影响不是很大。就没有深入处理,若需要深入专研,可以仔细阅读mod_wsgi的英文资料,网址:https://modwsgi.readthedocs.io/en/develop/user-guides/reloading-source-code.html。
5 参考文献
1)flask在window下使用Apache进行部署的详细指南
2)Windows下部署Flask的Web服务
3)window 2008 r2 搭建apache服务器详解
4)mod_wsgi (Apache)
5)windows下apache + mod_wsgi + python部署flask接口服务
6)在Windows环境,采用Apache + mod_wsgi的方式部署flask
7)Flask+Apache24+mod_wsgi+virtualenv虚拟环境 部署在Windows上