flask+mod_wsgi+apache在windows上的布署

来源:互联网 发布:linux dd u盘启动盘 编辑:程序博客网 时间:2024/05/30 22:58

前言

说是前言,纯粹就是吐槽。如果你赶时间,完全可以跳过这部分,我保证不会在这里隐藏任何有用的内容。

人上年纪后,可能冲劲不足,我花了大概两周的时间才成功的将flask部署到windows上。还好没有放弃,最终找到了答案。

不过这也说明我在开源软件的应用和配置上还很差劲呀,当我看到要用VC10的C/C++编译器编译源代码时,头都大了。你说我们这些平时习惯了Vistual Studio编译的,哪还懂什么make命令呀。还好网上什么都有,连帮你编译的都有,因此,编译这一难没有经历。

对于flask这样的开源软件来说,部署总是有多种选择,我现在吐槽一下我试过的,但没有成功的经历。

  1. PyISAPIe + IIS
  2. CGI + IIS (虽然配置成功,但是不能解析wsgi)
  3. FastCGI + Nginx
  4. FastCGI + Lighttpd (需要cygwin进行编译)
当然,flask官方有关于部署文档,但是写得太简单。但我还是将链接粘出来。
http://dormousehole.readthedocs.org/en/latest/deploying/index.html


参考

https://claudiosparpaglione.wordpress.com/2013/03/06/how-to-deploy-flask-applications-to-apache-webserver/

我参考过很多链接,但是是这篇文章把我引向正途。

最终方案

Flask + mod_wsgi + Apache
Flask:  一个Python的web框架
mod_wsgi: 一个为Python编写的Apache的FastCGI模块
Apache: 一个类似于IIS的Web服务器

!!!注意 !!!
如果下面这一点没有做到,整个过程有99%的可能性会失败。
Apache,mod_wsgi和Python都必须用相同版本的C/C++编译器生成,它们要么是32位的,要么是64位的,不能混用。

因为我从Python官方站点上下载的Python 3.4就是32位的,并且是用VC10编译出来的。因此在下载Apache和mod_wsgi时,也必须选择32位的用VC10编译出来的版本。之前我就是没有注意到这个问题,所以导致一直没有安装成功。
这个问题的详细解释,参见: https://github.com/GrahamDumpleton/mod_wsgi/blob/master/win32/README.rst

另外,Python官方站点提供的似乎都是32位的版本,如果要64位的,估计需要自己动手编译了。
Windows下的编译器,参见: http://www.microsoft.com/express/vc/




步骤

  1. 安装Apache
  2. 安装mod_wsgi
  3. 安装Python
  4. 安装Flask
  5. 创建测试Web App
  6. 在Apache中配置站点
  7. 测试

1. 安装Apache

Apache是开源软件,针对windows环境,它不直接提供编译版本。
可以在http://www.apachelounge.com/download/ 下载适合自己环境的版本。
根据我自己当前的环境,我选择的是Win32 VC10编译出来的Apache2.4版本
将压缩包下载到本机,然后将压缩包里面的Apache24文件夹拷贝到C:\。
当然,你可以拷贝到你的系统的任何位置,但Apache的默认配置是C:\Apache24。

如果你本机运行了IIS,将其关掉。因为IIS和Apache都默认用的是80端口。如果你想配置其它端口,我相信那也不难。等把Flask部署成功后再来捣鼓吧。

打开cmd
>cd c:\
>cd Apache24\bin\
>httpd

然后打开浏览器,输入
http://localhost

如果网页上显示 It Works! ,那说明apache服务器运行起来了。


2. 安装mod_wsgi

这个module可不能随便装,它是启动Python的关键。
我不知道为什么Flask的官方站点上不把这个模块的安装列出来。只是简单的说了一下httpd.confg的配置,实在是太不负责任了。

从下面这个链接下载mod_wsgi 
https://code.google.com/p/modwsgi/downloads/detail?name=mod_wsgi-win32-ap22py27-3.3.so

这个包里面包含了32位和64位的编译版本,下载完成后选择 
mod_wsgi-windows-4.4.12.tar\mod_wsgi-windows-4.4.12\Apache24-win32-VC10\modules\mod_wsgi-py34-VC10.so
因为我当前安装的Python是32位的,所以必须选择mod_wsgi-py34-VC10.so

将mod_wsgi-py34-VC10.so拷贝至C:\Apache24\modules\下,并更名为mod_wsgi.so。

打开 c:\Apache24\conf\httpd.conf 添加如下配置
LoadModule wsgi_module modules/mod_wsgi.so

从新启动httpd,如果没有报错,说明mod_wsgi模块在apache里面加载成功了。


3. 安装Python

我在这里安装的是Python 3.4,默认安装在c:\Python34\ 目录下。
Python 3.4安装时,最好选择将Python添加到系统目录。安装完成后就可以直接运行Python的相关程序了,例如下面安装flask时用到的pip


4. 安装flask

非常讽刺的是,我在尝试部署flask应用的过程中,居然忘记装flask。导致我在网页上面看到apache爆出的错误信息。期初我还认为是Apache的问题,经过查看c:\Apache24\logs\error.log后才发现,原来是flask没有安装。
直接打开cmd,运行如下命令
pip install flask

它会自动将flask和flask依赖的两个库全部装上,这太方便了。


5. 创建Web App

下面的代码直接拷贝而来
创建C:\Test_Web\test.py
[python] view plain copy
  1. from flask import Flask, request  
  2. app = Flask(__name__)  
  3.  
  4. @app.route('/hello')  
  5. def hello_world():  
  6. name = request.args.get('name','')  
  7. return 'Hello ' + name + '!'  
  8. if __name__ == '__main__':  
  9. app.run()  


创建C:\Test_Web\test.wsgi
[python] view plain copy
  1. import sys  
  2.   
  3. #Expand Python classes path with your app's path  
  4. sys.path.insert(0"c:/Test_Web")  
  5.   
  6. from test import app  
  7.   
  8. #Put logging code (and imports) here ...  
  9.   
  10. #Initialize WSGI app object  
  11. application = app  


注意,application一定不能改成别的。因为mod_wsgi在解析这个文件时,只认application。
另外,同IIS不同的时,不需要给C:\Test_Web文件夹加入NETWORK SERVICE用户的访问权限。


6. 在Apache中配置站点

只需要将以下代码加入到C:\Apache24\conf\httpd.conf文件中。
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <VirtualHost *:80 >  
  2. ServerAdmin example@company.com  
  3. DocumentRoot c:\Test_Web   
  4. <Directory "c:\Test_Web">  
  5. Order allow,deny  
  6. Allow from all   
  7. </Directory>  
  8. WSGIScriptAlias /flasktest c:\Test_Web\test.wsgi  
  9. </VirtualHost>  


我对Apache的配置纯粹是外行。我的理解是一个VirtualHost节点就相当于在IIS里面的一个Web Site节点。如果我的理解有误,还望各位路过的Apache配置高手纠正。
我在研究的过程中还看见有人将站点的配置放在另外一个conf文件中,然后将其包含至httpd.conf。


7. 测试

现在,打开浏览器,输入 http://localhost/flasktest/hello?name=CZY

如果你看见网页上出现 Hello CZY! 说明你的站点运行起来了。

剩下的工作就是以当前的工作为原型,开始Python的Web App开发之旅吧。如果你在尝试的过程中遇到什么问题,请给我随时在CSDN上留言。




前言

教程目录

  • 一:如何开始一个flask项目

  • 二:如何在apache上部署flask(坑好多)

  • 三:flask前端和后端的交互

  • 四:flask和数据库的交互

  • 待续…………

一:服务器端的处理

1.1安装服务器

首先我们要安装服务器,我们本次安装选用的apache服务器 
并用xampp集成安装包来安装apache。 
安装完成后我们就要开始配置服务器了 
首先我们可能会遇到第一个问题就是443监控端口冲突 
error log [ssl:warn] [pid 3608:tid 232] AH01909: 
www.example.com:443:0 server certificate does NOT include 
解决方法:打开目录C:\xampp\apache\conf\extra 
(我的安装目录为C:\xampp)下的httpd-ssl.conf文件
将Listen443 这句注释掉:# Listen 443 
或将443改为4433或其它值(尽量不要使用0-1023)

这样我们就解决了第一个问题,下面我们就来开始更改另一个 
配置文件。打开目录C:\xampp\apache\conf (我的安装目录为C:\xampp)下的httpd.conf文件 
首先是更改监听ip和端口Listen 127.1.1.1:80 
这是配置文件原来的写法 在配置服务器时候 
将ip改为自己电脑的ip端口在不冲突的情况下选择80 
但是有时候会冲突,所以需要更改端口号 
为一个不冲突的端口

这样我们一般情况下就可以启动服务器了 
打开一个服务器的内部自建的页面

接下来我们就要将wsgi放入到到模块文件夹里 
并导入到apache的初始化文件里

1.2 如和搞到wsgi模块文件

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

ctrl+f 搜索mod_wsgi 下载python和apache对应版本的 
mod_wsgi.whl 下载之后怎么用呢
win+r 输入cmd启动命令行界面 cd /d 文件路径
在mod_wsgi.whl 下执行pip install mod_wsgi.whl
之后你会在python的根目录下找到mod_wsgi.so当然名字可能不是 
这个但是你就把他改为这个然后将其拷贝到 
C:\xampp\apache\modules这个路径下

然后我们在httpd.config添加这样一句话 
LoadModule wsgi_module modules/mod_wsgi.so 
再启动服务器,能用ok。下面我们来关键的了 
我们来到上一篇教程建的项目下在新建一个wsgi.py的文件 
添加如下代码

    import sys    sys.path.insert(0,'c:/flask_lab_web')    from app import app as application

这上边的文件路径就是wsgi.py文件所在文件夹路径 
而wagi.py和app这个文件应该是处在同一个文件夹下 
而不是放在app文件夹下这一点一定一定一定要记住

接下来我们回到httpd.conf里面开始在里面添加这样一些 
东西。注意这样添加是为了适应apache2.4以上版本的
网上很多教程都是2.2版的那个不能用,我调了好久, 
感觉都要哭瞎了,你感觉有用就推荐一下吧。。
下面是代码

<VirtualHost *:8000>        ServerName  example.com                 WSGIScriptAlias / e:/flask_lab_web/wsgi.py        <Directory e:/flask_lab_web>        Require all granted        Require host ip        Allow from all        </Directory></VirtualHost>

注意上面的路径你要更改的哦,这样你就完成了配置 
开启服务器就ok了.感觉 有用就给个推荐呗




Apache wsgi Flask配置细节
本文使用XAMPP配置 Flask 运行环境。python解析使用mod_wsgi模块。理论上django也可以使用。

----------------------

1、安装Apache。一般使用xampp就可以了。(注意查看Apache版本,这个不注意,后面几乎无法使用)

2、安装mod_wsgi。官方需要自己编译。第三方地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi 。解压找到so文件放在XAMPP/apache/conf/modules/mod_wsgi.so。注意匹配自己的Python版本和Apache版本

3、配置Apache虚拟主机和端口

比如使用8000端口:
httpd.conf: 
在LoadModule最后一行,添加 LoadModule wsgi_module modules/mod_wsgi.so
找到httpd-vhosts.conf一行,确认去掉头部的#,如果没有则自己添加。Include etc/extra/httpd-vhosts.conf

httpd-vhosts.conf
这个文件里面一般都是使用#注释掉了。

我们直接在最后这么写:

Apache 2.4版本
Listen 8000

NameVirtualHost *:8000

<VirtualHost *:8000>
    ServerName test.com
    ServerAlias www.test.com
    ServerAdmin root@test.com
    DocumentRoot "F:/web"
    ErrorLog "F:/web/error.log"
    WSGIScriptAlias / F:/web/run.wsgi
    Alias /static F:/web/static

    <Directory "F:/web">
        #Options +ExecCGI
        #AddHandler cgi-script .py
        Options -Indexes +FollowSymLinks
        Require all granted  # ver 2.4
        AllowOverride All
        WSGIScriptReloading On
    </Directory>
    
</VirtualHost>

 
Apache 2.2及以下版本
Listen 8000

NameVirtualHost *:8000

<VirtualHost *:8000>
    ServerName test.com
    ServerAlias www.test.com
    ServerAdmin root@test.com
    DocumentRoot "F:/web"
    ErrorLog "F:/web/error.log"
    WSGIScriptAlias / F:/web/run.wsgi
    Alias /static F:/web/static

    <Directory "F:/web">
        #Options +ExecCGI
        #AddHandler cgi-script .py
        Options -Indexes +FollowSymLinks
        Order deny,allow  # ver 2.2
        Allow from all # ver 2.2
        AllowOverride All
        WSGIScriptReloading On
    </Directory>
    
</VirtualHost>

4、编写run.wsgi启动脚本

Flask: (已测试可用)
run.wsgi文件内容为:
from test import app as application

测试py文件为test.py:
from flask import Flask 
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return "Hello World!"
 
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8000)

Django:(未做测试)
ru.wsgi文件内容:
import os
import sys
import django.core.handlers.wsgi

sys.path.append(r'F:/web')
#sys.path.append(os.path.dirname(os.path.dirname(__file__)))
os.environ['DJANGO_SETTINGS_MODULE'] = 'demo.settings'
os.environ['PYTHON_EGG_CACHE'] = 'F:/web/cache'

application = django.core.handlers.wsgi.WSGIHandler()

5、修改hosts文件:
为了使用方便,将虚拟网址映射为本地地址,所以需要修改hosts文件。如果没这个需求也可以不改,直接使用ip:port方式访问.

hosts文件地址:C:\WINDOWS\system32\drivers\etc\hosts
在文件最后添加:(test.com改为你自己的测试地址)
127.0.0.1  test.com

至此,配置完成,打开XAMPP,启动Apache,若没有错误信息,可以看到:

如图,8000端口已经启动起来,输入http://test.com:8000 或者 http://127.0.0.1:8000 就可以看到 hello world! 了。

-------------常见问题集合(参考)-------------------
如果出问题,查看日志 F:/web/error.log 或默认的log文件。

apache AH01630: client denied by server configuration错误解决方法
出现这个错误的原因是,apache2.4 与 apache2.2 的虚拟主机配置写法不同导致。

apache2.2的写法:

<VirtualHost *:80>  
 ServerName fdipzone.demo.com  
 DocumentRoot "/home/fdipzone/sites/www"  
 DirectoryIndex index.html index.php  
 
 <Directory "/home/fdipzone/sites/www">  
  Options -Indexes +FollowSymlinks  
  AllowOverride All  
  Order deny,allow  
  Allow from all  
 </Directory>  
 
</VirtualHost>  

如果在2.4中使用以上写法就会有apache AH01630: client denied by server configuration错误。

解决方法,apache2.4中

Order deny,allow  
Allow from all  
Allow from host ip  
修改为

Require all granted  
Require host ip  
修改后的配置如下:

<VirtualHost *:80>  
 ServerName fdipzone.demo.com  
 DocumentRoot "/home/fdipzone/sites/www"  
 DirectoryIndex index.html index.php  
 
 <Directory "/home/fdipzone/sites/www">  
  Options -Indexes +FollowSymlinks  
  AllowOverride All  
  Require all granted  
 </Directory>  
 
</VirtualHost>  

----------------------------
一些隐藏的彩蛋:

python import site failed/no module named site
在环境变量中添加,PYTHONHOME, 值为你的Python路径,比如C:/python27


0 0
原创粉丝点击