【Flask实战】Apache+WSGI在内网Windows环境下部署Flask项目(艰难爬坑总结)

简介: 【Flask实战】Apache+WSGI在内网Windows环境下部署Flask项目(艰难爬坑总结)

1.前言

本人最近用flask开发一个web项目,要部署到单位内网中,内网服务器是window server 2016,本文讲了部署的基本流程和一些爬坑过程。

环境:Windows server 2016 + Python 3.6.6 + Apache2.4

2.简单理解Flask框架,web服务器(Apache)和WSGI的关系

image.png

Web框架层。Web框架的作用主要是方便我们开发 web应用程序,HTTP请求的动态数据就是由 web框架层来提供的。比如:Django、Flask等。我选用Python的轻量级web开发框架Flask进行项目开发,Flask提供了轻量级的Web服务,方便进行开发和调试,但是在实际部署的时候,却不能直接用Flask发布应用,这在我们开发过程中有提示:WARNING:This is a development server. Do not use it in a production deployment. falsk WSGI,因此还需要Web服务和WSGI(web服务网关接口)。

web服务器层。Web服务器的主要作用就是接收请求 、处理请求、返回响应。比如:Nginx,Apache,IIS等。本次选用的是Apache。

WSGI层。WSGI不是服务器,也不是用于与程序交互的API,只是一种接口,它只适用于 Python 语言,其全称为 Web Server Gateway Interface,定义了 web服务器和 web应用之间的接口规范。也就是说,只要 web服务器和 web应用都遵守WSGI协议,那么 web服务器和 web应用就可以随意的组合。


3.准备一些安装包

  1. Python
  2. Apache
  3. mod_wsgi
  4. flask项目的依赖包
  • !三个软件的版本一定要匹配

3.1下载Python

本次下载的Python 3.6.6 64位。下载链接

3.2下载Apache

本次下载的Apache 2.4。下载链接

版本选择一定要注意,首先我们打开Python终端,可以看到如下信息(我写文章的电脑是3.6.1版本,实际要参照安装部署环境的Python版本):

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

找到[MSC v.1900 64 bit (AMD64)]

对照下表,可知 MSC_VER=1900 对应 Visual C++ 2015 (14.0):

Visual C++ 2005  (8.0)          MSC_VER=1400
Visual C++ 2008  (9.0)          MSC_VER=1500
Visual C++ 2010 (10.0)          MSC_VER=1600
Visual C++ 2012 (11.0)          MSC_VER=1700
Visual C++ 2013 (12.0)          MSC_VER=1800
Visual C++ 2015 (14.0)          MSC_VER=1900
Visual C++ 2017 (15.0)          MSC_VER=1910

在Apache下载链接中找到VC2015、64位的版本下载。
1d3f49e4e28c425791441117c00f8594.png
dd28f3aa598a4a1ca72fbcbd8259fa94.jpg

3.3下载mod_wsgi

进入[下载页面]
46c25ff3ae7d4891a044708e6ab7779e.png

选择cp36对应Python3.6版本,amd64对应64位操作系统。

3.4准备Flask项目离线安装包

由于内网与互联网不通,因此需要提前准备好Flask项目离线安装包。
具体步骤参照Python虚拟环境中的依赖包迁移到断网环境
安装文章步骤操作后,这里我们将所有的依赖包会存放在whls文件夹,并形成一个requirement.txt文档。

4.进行安装

将上述安装包httpd-2.4.53-o111n-x64-vc15.zippython3.6.6.rarmod_wsgi-4.7.1-cp36-cp36m-win_amd64.whlwhls文件夹requirement.txt拷贝到内网环境中进行安装。

4.1安装Python

这里不详细介绍,参照Windows下Python3的环境搭建

4.2安装Apache

  1. httpd-2.4.53-o111n-x64-vc15.zip解压到任意位置,这里我解压到D盘。
  2. 使用命令行界面(以管理员身份运行)进入到对应目录。
>CD D:\Apache24\bin
  1. 将Apache服务加入到Windows服务中,并尝试启动测试,报错,这是因为监听端口被占用。
D:\Apache24\bin>httpd -k install -n "Apache2.4"
Installing the 'Apache2.4' service
The 'Apache2.4' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.
(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试。  : AH00072: make_sock: could not bind to address [::]:80
(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试。  : AH00072: make_sock: could not bind to address 0.0.0.0:80
AH00451: no listening sockets available, shutting down
AH00015: Unable to open logs

我们进入到D:\Apache24\conf,打开httpd.conf文件,找到如下信息:

#Listen 12.34.56.78:80
Listen 80

将监听端口80端口修改,如8080。
通过运行栏,输入services.msc进入服务管理窗口,启动刚才安装的Apache2.4服务,进入浏览器,输入http://127.0.0.1:8063/,如果显示如下页面,说明服务启动成功。
52f7fd98c7464b8198148ee65d8a0904.png

4.3安装flask项目依赖包,并测试flask项目

参照Python虚拟环境中的依赖包迁移到断网环境,与这篇教程不同的是,在内网环境中,我并没有使用虚拟环境,直接将相关依赖包安装到了全局环境下。

此时可以测试下项目在flask提供的web服务下是否能正常运行(note:虚拟环境部署项目还是有些小问题,日后解决了再分享,以实际需求为主,内网环境只部署一个项目,所以不需要虚拟环境也可以。)

4.4安装mod_wsgi

使用命令行界面(以管理员身份运行)进入到mod_wsgi-4.7.1-cp36-cp36m-win_amd64.whl对应目录,直接安装。

>pip install mod_wsgi-4.7.1-cp36-cp36m-win_amd64.whl
Installing collected packages: mod-wsgi
Successfully installed mod-wsgi-4.7.1

安装成功后,切换到python的安装目录的\scripts文件夹下运行如下命令:

c:\Python36\Scripts>mod_wsgi-express module-config
LoadFile "c:/users/***/anaconda3/python36.dll"
LoadModule wsgi_module "c:/users/***/anaconda3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "c:/users/chengyikang/anaconda3"

保存上述3行信息用于下步配置。

5.配置

到了最后一步配置了,坚持住!

5.1wsgi文件配置

进入到项目根目录,新建app.wsgi文件,进行如下设置:

import sys
sys.path.insert(0,"C:\Users\***\PycharmProjects\bulletin_board")
from bulletin_board import app as application

5.2httpd.conf文件配置

再次进入到D:\Apache24\conf,打开httpd.conf文件,进行配置修改。

  1. 找到Define SRVROOT "/Apache24" 修改成自己的安装路径,如"D:/Apache24"
  2. 将上面4.4节中的3行信息复制到最下方。
LoadFile "c:/users/***/anaconda3/python36.dll"
LoadModule wsgi_module "c:/users/***/anaconda3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "c:/users/chengyikang/anaconda3"
  1. 再添加如下内容,C:\Users\***\PycharmProjects\bulletin_board是我的项目所在目录,大家根据自己的项目进行调整:
WSGIPythonPath "C:\Users\***\PycharmProjects\bulletin_board"
<VirtualHost *:8063>
    ServerName example.com
    WSGIScriptAlias / C:\Users\***\PycharmProjects\bulletin_board\app.wsgi
    <Directory C:\Users\***\PycharmProjects\bulletin_board>
        Require all granted
    </Directory>
</VirtualHost>

这块的知识我没有掌握,没法给大家讲清每一行的意义,可以参考官方文档官方文档2进行学习。

5.3尝试运行

运行服务的方式有多种:

  1. 进入C:\Apache24\bin目录,打开ApacheMonitor.exe,进行可视化操作:start,stop,restart

ccca0ebceda04c7989fa30d9e54fe4c3.png

  1. C:\Apache24\bin目录下CMD打开命令行,输入httpd -k start,停止服务器就输入httpd -k stop,重启服务器输入httpd -k restart
  2. 通过运行栏,输入services.msc进入服务管理窗口,启动/停止/重启刚才安装的Apache2.4服务。

bb0ec5836ced4ac99cd441fde4bd161a.png

6.一些问题

6.1 输入localhost:8063响应码500

a556a6405c6f4fd0b9d1406b03352026.png

有时候会访问服务器,浏览器会提示:500 Internal Server Error,我们进入C:\Apache24\logs打开error.log错误日志分析原因,看不懂的百度下一般都可以解决。

[Tue Apr 26 23:12:34.887245 2022] [wsgi:error] [pid 14068:tid 1780] [client 127.0.0.1:14933] mod_wsgi (pid=14068): Failed to exec Python script file 'C:/Users/Chengyikang/PycharmProjects/bulletin_board/app.wsgi'.
[Tue Apr 26 23:12:34.887245 2022] [wsgi:error] [pid 14068:tid 1780] [client 127.0.0.1:14933] mod_wsgi (pid=14068): Exception occurred processing WSGI script 'C:/Users/Chengyikang/PycharmProjects/bulletin_board/app.wsgi'.
[Tue Apr 26 23:12:34.887245 2022] [wsgi:error] [pid 14068:tid 1780] [client 127.0.0.1:14933]   File "C:/Users/Chengyikang/PycharmProjects/bulletin_board/app.wsgi", line 2\r
[Tue Apr 26 23:12:34.887245 2022] [wsgi:error] [pid 14068:tid 1780] [client 127.0.0.1:14933]     sys.path.insert(0,"C:\\Users\\Chengyikang\\PycharmProjects\\bulletin_board")\r
[Tue Apr 26 23:12:34.887245 2022] [wsgi:error] [pid 14068:tid 1780] [client 127.0.0.1:14933]                      ^\r
[Tue Apr 26 23:12:34.887245 2022] [wsgi:error] [pid 14068:tid 1780] [client 127.0.0.1:14933] SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \\UXXXXXXXX escape\r

我的报错是因为路径中\转义符的问题,在字符串前面加上r
restart重启,查看问题是否修复。

6.2 RuntimeError: cryptography is required错误

如果项目中有“输入密码”选项,并用到了数据库保存密码,可能会报“RuntimeError: cryptography is required for sha256_password or caching_sha2_password”这个错误,这时候直接pip install cryptography 安装这个模块就可以了。

如果是离线安装,参照Python虚拟环境中的依赖包迁移到断网环境,但要注意安装的顺序:

pip install pycparser-2.21-py2.py3-none-any.whl
pip install cffi-1.15.0-cp36-cp36m-win_amd64.whl
pip install cryptography-36.0.2-cp36-abi3-win_amd64.whl

在安装cryptography-36.0.2-cp36-abi3-win_amd64.whl时,会报错,因为文件名不支持,将abi3改为none即可。
原因分析参考Python使用pip安装报错:is not a supported wheel on this platform的解决方法

相关文章
|
21天前
|
Java 开发工具
鸿蒙Flutter实战:02-Windows环境搭建踩坑指南
本指南介绍如何搭建鸿蒙Flutter开发环境,包括下载Flutter SDK、配置环境变量(如FLUTTER_STORAGE_BASE_URL、PUB_HOSTED_URL、DEVECO_SDK_HOME等)和检查工具版本。还提到避免项目路径过深、与SDK同盘存放等注意事项,以及解决VsCode无法识别设备的方法。
39 0
|
18天前
|
人工智能 监控 安全
掌握Windows管理利器:WMI命令实战
本文介绍了Windows Management Instrumentation (WMI) 的基本概念和用途,通过多个实用的`wmic`命令示例,如获取CPU信息、查看操作系统详情、管理服务、检查磁盘空间等,展示了WMI在系统维护中的强大功能。适合IT专业人士学习和参考。
|
5月前
|
安全 Java 测试技术
Windows电脑安装Apache JMeter的详细教程
本文介绍了在Windows上安装Apache JMeter的步骤。首先,需确保安装Java JDK并配置环境变量。然后,从JMeter官网下载ZIP文件,解压至指定目录,并同样配置JMeter的环境变量。验证安装成功后,可通过命令行以GUI或非GUI模式启动JMeter,进行性能测试。
119 0
|
3月前
|
API Docker Windows
2024 Ollama 一站式解决在Windows系统安装、使用、定制服务与实战案例
这篇文章是一份关于Ollama工具的一站式使用指南,涵盖了在Windows系统上安装、使用和定制服务,以及实战案例。
2024 Ollama 一站式解决在Windows系统安装、使用、定制服务与实战案例
|
3月前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
54 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
2月前
|
Apache
多应用模式下,忽略项目的入口文件,重写Apache规则
本文介绍了在多应用模式下,如何通过编辑Apache的.htaccess文件来重写URL规则,从而实现忽略项目入口文件index.php进行访问的方法。
|
3月前
|
Java 应用服务中间件 Apache
使用IDEA修改Web项目访问路径,以及解决Apache Tomcat控制台中文乱码问题
本文介绍了在IntelliJ IDEA中修改Web项目访问路径的步骤,包括修改项目、模块、Artifacts的配置,编辑Tomcat服务器设置,以及解决Apache Tomcat控制台中文乱码问题的方法。
155 0
使用IDEA修改Web项目访问路径,以及解决Apache Tomcat控制台中文乱码问题
|
3月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
63 0
|
3月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
198 0
|
3月前
|
Python Windows 内存技术
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?

推荐镜像

更多