2020年最新apache2.4 + flask + python3.8 + windows10的部署
2020年最新apache2.4 + flask + python3.8 + windows的部署
在参考了许多apache的部署文章之后,写下这篇博客记录一下部署的完整过程和所遇到的问题(bug)
(注:该方法已成功部署)
- 首先是所需要的环境
- python3.8版本
- apache2.4版本 + mod_wsgi版本
- flask项目
- Windows 10
需要注意的是:python版本、apache版本、mod_wsgi版本,这三个版本需要一一对应
下文就按照三大部分讲解
第一大部分:python3.8版本的下载和安装
python下载的是3.8.3(32位win)版本
我下载的是python的3.8.3版本的解释器,按照自己操作系统是几位的来下载几位的python解释器,一般电脑都是32位和64位,如果安装64位版本的python解释器在32位的电脑上就无法兼容了,所以建议安装32位的python版本
查看电脑的操作系统位数:桌面–> 你的电脑图标右键属性
python3.8.3的下载地址:https://www.python.org/downloads/
进入地址找到32位版本的python3.8.3
下载之后自定义安装到c盘的python38上面:c:\python38
安装完成之后,查看安装的python信息,注意:如果电脑上面又多个不同版本的解释器,直接进入c:\python38目录,双击打开python.exe文件就可以打开新安装的python了
红框里表示安装的是32位的
- apache2.4版本的下载和安装
- apache下载
- 注意:apache版本的下载需要与python3.8.3的版本对应起来,上面红色框里面的MSC v.1925就是_MSC_VER值,需要找到对应的Visual Studio版本
1925 对应的是 16.5 所以知道对应的apache版本是vc16
这里就不做过多解释了,要了解对应关系,自行去查找
_MSC_VER值对应的Visual Studio版本,最新的对应版本可去微软官网,链接:Predefined macros
apache下载地址:http://httpd.apache.org/docs/current/platform/windows.html#down
ApacheHaus还没有最新的vc16版本,所以我去Apache Lounge中找到了对应的vc16(32位win)版本下载,有可能Apache Lounge这个网址打不开,无法下载到最新版本,下载不到文末可以给我留盐
第二大部分:安装apache和mod_wsgi模块
解压apache的下载文件,把Apache24文件夹复制到D或者H盘的根目录下(我的是H盘):H:\Apache24
> 1、更改httpd.conf文件
找到apache目录H:\Apache24\conf下的httpd.conf文件,用编辑器打开(txt),更改37行的路径为
自己的apache的路径:“H:\Apache24”,更改60行的80端口为18000,最好是1024以上的端口,80 端
口经常被系统的服务占用,行数不对的话,自己去找
下这两行的数据来更改一下
> **2、以管理员身份运行cmd(右键点击cmd,看到管理员身份运行),进入H:\Apache24\bin目录下**,输入命令
> httpd -k install --> 安装
> httpd -k start --> 启动
> httpd -k start --> 重动
> httpd -k stop --> 停止
> httpd -k uninstall --> 卸载
在安装完成之后,输入httpd -k start就可以启动apache服务了,双击bin目录下的
ApacheMonitor.exe就可以
看到apache的状态了,右边可以手动控制apache服务
> 3、apache服务启动之后,在浏览器输入***localhost:18000***,显示It works!表示访问成功
-
下载和安装mod_wsgi
mod_wsgi模块可以实现WSGI标准,WSGI是一个同一的python接口标准,该标准讲述了python应用如何与web服务器通信,mod_wsgi模块可以实现python应用与web服务器之前的联系
mod_wsgi下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi
mod_wsgi说明文档:https://dormousehole.readthedocs.io/en/latest/deploying/mod_wsgi.html
下载完成之后,把文件复制到python的安装目录的Scripts目录下:C:\python38\Scripts
打开cmd,进入C:\python38\Scripts执行命令:
pip install mod_wsgi-4.7.1-cp38-cp38-win32.whl
安装完成后,继续输入以下命令,把生成的3行代码复制到apache的httpd.conf配置文件中,进行apache配合mod_wsgi模块使用
mod_wsgi-express module-config
复制3行代码到apache的httpd.conf配置文件中:
第三大部分:创建Flask小项目
下面分3个步骤讲解
第一步:写个简单Flask的例子:
from flask import Flask
application = Flask(__name__)
@application.route('/demo')
def test():
return '无穷鸡蛋'
application.run(debug=True)
第二步:编写wsgi文件
wsgi文件可以通过mod_wsgi模块把flask项目和apache服务连接起来
import sys
sys.path.insert(0, "H:\pythonpro\Runflask") # 添加项目路径到python解释器的搜索路径中
from testt import application # 这里必须是application
如果项目里面的不是application的话,还可以这样写:
from testt import app as application
# 或者是写成
from testt import app
application = app
第三步:添加wsgi文件的路径到apache服务的httpd.conf文件中
在httpd.conf文件中,把下面的文本复制进去,把路径和端口信息改为你自己的信息。一般在文本的最后添加这个信息,部署多个项目,可以添加多个这个文本,把路径和端口信息改为项目的信息
Listen 18001
<VirtualHost *:18001>
WSGIScriptAlias / H:\pythonpro\Runflask\tesk.wsgi
<Directory "H:\pythonpro\Runflask"> # 注意这里不加双引号可能会出错,有的电脑不加也可以
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
</VirtualHost>
解读:
Listen 18001:这里是监听18001端口,可以监听多个端口 <VirtualHost
<VirtualHost *:18001>:这里的18001端口是进入你项目的端口,但是没有Listen监听的端口的话,这里面的内容不会生效
WSGIScriptAlias / H:\pythonpro\Runflask\tesk.wsgi:这里的WSGIScriptAlias / 是固定的,斜杠不能去掉,后面的路径表示的是wsgi文件的路径,这里告诉apache去这个路径找到wsgi文件
<Directory"H:\pythonpro\Runflask">:这里表示的是项目的路径
后面这两项是必填的:
WSGIApplicationGroup%{GLOBAL}
Require all granted
再多说一下:这个文本的端口是多少,浏览器访问的端口就是多少,会重定向到你的项目,无论你项目里面写的端口是多少
我的项目目录结构如下:
查看项目是否部署成功
访问地址:http://localhost:18001/demo
如下图,表示访问成功,部署成功了,访问地址的时候,记得要加 /demo ,项目里面的路由是/demo
部署遇到的问题
一般都是自己粗心造成的错误,下面列举一些遇到的错误:
以下问题是我总结了自己说的,当时部署的时候问题解决了,现在复现不了,没有截图,所以总结一下
一、地址访问正确了,但是会报错(具体错误具体分析)。在apache安装目录下的logs文件下的error.log里面可以查看错误日志,遇到问题的解决步骤:
1、首先检查apache服务是否安装成功,能否启动成功,显示It works!表示访问成功
2、在pycharm中运行项目,看下是否能访问正常,访问失败,说明项目有bug未解决,apache部署不成功
3、在pycharm成功运行访问项目后,如果项目正常运行没有bug的话,查找下个问题的思路是查找wsgi文件是否编写正确,wsgi文件编写不正确会影响是否能访问项目是否成功,如何查看?
例如:
import sys
sys.path.insert(0, "H:\pythonpro\Runflask") # 检查添加路径这里,含有\t,\n,\f等,都不行,一般在路径前面加上r来防转义
# sys.path.insert(0, r"H:\pythonpro\Runflask")
from testt import application # 检查是否是application,这里的必须是application
4、确定第3步正确后,还是有问题的话,那就是httpd里面的配置有问题了,这时候,打开httpd.conf
查看mod_wsgi的3行配置信息是否添加进来了
检查配置wsgi文件信息的文本是否正确
Listen 18001
<VirtualHost *:18001>
WSGIScriptAlias / H:\pythonpro\Runflask\tesk.wsgi
<Directory "H:\pythonpro\Runflask">
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
</VirtualHost>
特别注意: 路径信息不能填错了,填错了就找不到对应的文件了,特别是特殊含义的\t,\n,\f
二、第一个是很坑很坑的问题,当存在有第三方科学计算库导入(numpy,pandas,scipy库)的时候,在浏览器访问的时候,一直在转圈圈,错误日志也没有打印,也没有报错
在查阅了众多资料后发现:添加WSGIApplicationGroup %{GLOBAL}就能把问题解决了
<Directory "H:\pythonpro\Runflask">
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
WSGIApplicationGroup
语法:WSGIApplicationGroup name
WSGIApplicationGroup指令,可用于指定WSGI应用程序或WSGI应用程序组属于哪个组。一般来说,在同一个应用程序组中,所有的WSGI应用程序处理请求的过程,都将在的同一个Python子解释器的上下文中执行。
在默认情况下,该“WSGIApplicationGroup”会被设置成“WSGIApplicationGroup %{RESOURCE}”,此时应用程序组的名称将被设置为服务器主机名和端口,如%服务器变量,WSGI环境变量scriptname的值被附加到文件分隔符中。
WSGIApplicationGroup %{GLOBAL},在该设置时,全局应用程序组中,任何WSGI应用程序都将在Python创建的第一个解释器上下文中执行。当Python的外部C语言扩展模块,使用简化的线程API来操作Python GIL时,就必须强制WSGI应用程序在第一个解释器中运行,原因是WSGI应用程序在Python创建的其余子解释器中都不能正确运行
到这里,Flask项目的apache部署就全部完成了,如果还有其他部署不成功的情况,可以留言一起讨论交流
本文地址:https://blog.csdn.net/gogo_hjj/article/details/107170419