Apache部署flask的一些踩坑记录(win64+python36)

基础配置:
将一个Flask应用部署到本地的Windows服务器上。操作系统是64位的,程序是基于Python 3.6开发的。

部署选择:
mod_wsgi + Apache

注意事项:

  • 不能混用32位和64位的文件
  • 安装Python时要选择“Install for all users”
  • 构建Apache使用的编译器版本要与构建Python的一致
  • 构建mod_wsgi使用的编译器版本要与构建Python的一致

准备:

Apache,官网即可,要选择版本一致的,我选择了官网的这个2.4版本,解压即可使用;安装Python时要选择“Install for all users”。另外,自定义项目里的“Add python.exe to Path”也最好选上。
把Apache24文件夹解压缩到c:\Apache24。(因为配置文件里是默认的这个路径,如果要放在别的地方,就自己修改下相应的配置)
ps.为了方便排错,可以在这里先测试一下Apache是否正常。运行bin文件夹里httpd.exe,然后访问http://localhost/,如果没有问题应该可以看到测试页。
对于mod_wsgi的配置,就比较坑了,目前网上可见的打包好的资源(.so包)貌似只到4.4.12版本,而这个版本只兼容到python3.3且对应VC10,所以与我这的3.6不兼容(当然为省事,可以换成python3.3版本,可是总觉得3.5以前的版本不成熟),针对这两种情况,解决方式如下:

若有.so包:
把mod_wsgi-py34-VC10.so复制到c:\Apache24\modules目录下,文件名改成mod_wsgi.so,然后把
LoadModule wsgi_module modules/mod_wsgi.so
添加到配置文件(httpd.conf)里。

若没有so包:
- 下载mod_wsgi Python的插件

http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi

本人使用的这个 mod_wsgi‑4.5.15+ap24vc14‑cp36‑cp36m‑win_amd64.whl
i. 这个插件对应的Apache版本是24 VC是14
ii. Python版本是3.6
iii. 64位系统
在下载时要选择相应的版本,否则Apache启动时会有问题.

2.把下载的.whl文件复制到pythona安装目录 (os.file对应的地址) 的python\Scripts下使用
然后命令行里
pip install “mod_wsgi-4.5.15+ap24vc14-cp36-cp36m-win_amd64.whl”
进行安装,在安装成功后,在python的安装目录的\scripts文件夹下dos里运行mod_wsgi-express module-config
输出类似如下三行结果:
LoadFile “d:/program files/python36/python36.dll”
LoadModule wsgi_module “d:/program files/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd”
WSGIPythonHome “d:/program files/python36”
把这三行内容复制到http.cnf文件下进行配置
取代有so包情况下的
LoadModule wsgi_module modules/mod_wsgi.so

测试:

将测试文件保存为c:\mydir\myapp.wsgi,里面代码如下:

def application(environ, start_response):
     status = '200 OK'
     output = b'Hello World!'
      response_headers = [('Content-type', 'text/plain'),
                         ('Content-Length', str(len(output)))]
     start_response(status, response_headers)
      return [output]

在apache的配置文件conf/httpd.conf里最末行添加:

 
     WSGIScriptAlias /myapp c:\mydir\myapp.wsgi
     
         Require all granted
     
 

重新运行httpd.exe,然后访问http://localhost/myapp,看到Hello World!就说明安装成功了。
这里,可能存在端口冲突的问题,这种情况下,可以更改配置文件conf/httpd.conf为一个没有占用的端口,具体可以百度;

作者: 刘咸尚

部署Flask应用:
这里,我用pycharm做开发,pycharm里,安装flask,然后创建hello.py文件,代码如下:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Well done"

if __name__ == '__main__':
    app.run()

mod_wsgi要求WSGI应用的入口叫“application”,所以我们还需要创建一个.wsgi文件来做转换。把下面的代码保存为myapp.wsgi,然后按照之前的方式,更改apache配置文件里的VirtualHost 标签里的路径,改成目前pycharm项目所在目录。
myapp.wsgi内容为:

 import sys
 sys.path.insert(0, '替换你的项目源码包的目录')
 from hello import app as application

重启Apache,查看一下配置好的成果吧,浏览器输出Well done,就说明成功啦。

一些坑:

  • pycharm带来的,就是比如创建了另外一个temp.py文件,里面有个cal方法,需要在hello.py中引用,这些文件位于sample包下面,导包的时候出现了问题(from sample.temp import cal),apache总是报internal server error,查看日志后,发现ModuleNotFoundError: No module named ‘sample’,这种问题源自于路径没对应,事实上是pycharm默认该项目的根目录为source目录,所以import使用绝对路径而不是相对路径的话,就会从项目的根目录中查找,而不是我们希望的其中的/src目录,所以import不成功。
    解决方式:更改pycharm的src路径,在file–>setting–>project:server–>project structure里面,将sample标记为Sources。

暂时先这么多吧。

你可能感兴趣的:(python)