Window sever 通过IIS和FastCGI部署 python flask框架
研究了一晚上,终于把flask部署到window 服务器上了。踩了无数坑,这里说一下
主要遇到的问题
- 网上目前大部分教程都是Linux部署,但是很多小白完全会被Linux绕晕
- window很多人采用的是Apache作为服务器,但是这个必须要下载对应版本的VC, mod_wsgi 和python,很麻烦,小白通过这中方式一般都会失败,我页失败了,猜想原因是版本不一致
- 也有人通过iis+wfastcgi部署的,方向是对的,但是发现很多教程编写年代久远,wfastcgi的版本和iis版本以及python版本都有限制,我记得官方给的python版本必须是3.4,导致其他版本会报错。
- web.config文件会报错之类的
- 正常部署好之后,服务器内网ip能访问,但是外网ip访问不了的情况
- (其他报错情况我会在文末贴出)
接下来我大概讲解一下web服务器的运作原理(可以跳过)
画了涨图
Web服务器层。Web服务器的主要作用就是接收请求 、处理请求、返回响应。比如:Nginx,Apache,IIS等,我本次用的就是window自带的IIS,因为不用单独下载很方便,开启方法可以参考:Window sever IIS(Internet Information Services (IIS)管理器)设置方法
Web框架层。Web框架的作用主要是方便我们开发 web应用程序,HTTP请求的动态数据就是由 web框架层来提供的。比如:Django、Flask等,我本次用的是Flask。
WSGI层。WSGI 不是服务器,也不是用于与程序交互的API,只是一种接口,它只适用于 Python 语言,其全称为 Web Server Gateway Interface,定义了 web服务器和 web应用之间的接口规范。也就是说,只要 web服务器和 web应用都遵守WSGI协议,那么 web服务器和 web应用就可以随意的组合。
好了我们开始
第一步创建简单的Flask app框架
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World 2021 tai bu rong yi le hhhhhh'
if __name__ == '__main__':
app.run(debug=True)
注意:一定要通过pycharm或者vscode之类的IDE运行,不然会报错use a production wsgi server instead。
如果正常启动,就欧克
第二步设置IIS
Window sever IIS(Internet Information Services (IIS)管理器)设置方法
第三步下载并部署wfastcgi.py
pip install wfastcgi
下载完成python根目录会出现
注意:不要用命令行直接去目录运行这个wfastcgi-enable.exe文件,一般肯定报错,因为你的IIS版本以及python版本都不符合这个文件的要求(要求iis 7.5以上,python3.4)。解决方法如下:
- 找到C:\Program Files\Python38\Lib\site-packages这个路径(自己替换一下)
- 把这个wfastcgi.py复制到你的Flaskapp.py一个目录
第三步创建IIS站点
1、2、所有都设置玩直接点击OK就行了
第四步 设置映射关系
先找到你刚刚新建的web站点,点击后,再找到映射设置,就是下图顺序
添加映射,按照如图填写后需要点击那个链接限制进行设置
第五步fastCGI设置
这里添加键值对参数:
WSGI_HANDLER :testFlask.app
PYTHONPATH :~/
如果项目名字不一样自己灵活改一下
第六步:配置web.config文件
这里自己鼓捣一下吧,看着要改的地方,按照规律改一下,其实就是刚才配置的哪些东西,懒得打字了,如果弄不好,可以评论或者私聊我
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="testFlask" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Program Files\Python38\python.exe|"C:\Users\Administrator\Desktop\File\websit\wfastcgi.py"" resourceType="Unspecified" requireAccess="Script" />
</handlers>
<security>
<requestFiltering allowDoubleEscaping="true"></requestFiltering>
</security>
<directoryBrowse enabled="false" />
</system.webServer>
<appSettings>
<!-- Required settings -->
<add key="WSGI_HANDLER" value="testFlask.app" />
<add key="PYTHONPATH" value="~/" />
<!-- Optional settings -->
<!-- add key="WSGI_LOG" value="C:\Users\Administrator\Desktop\File\weblog.log" -->
<!-- add key="WSGI_RESTART_FILE_REGEX" value="~/" -->
</appSettings>
</configuration>
这个文件配置好之后要和项目文件放一起,如图:
第七步:检验一下内网和外网能不能访问了
首先是内网:可以
然后外网:我这里也可(但是这里有坑)
如果你报错外网访问不了主要有两个原因:
- 你的云服务的防火墙给限制了不让你现在的端口访问
- 你的浏览器给你把你拦下了,一般显示:此地址访问受限 此地址使用了一个通常应该用于其他网页浏览的端口
第一个问题的解决办法是:去你云服务器控制台把端口打开,我这里暴力一点把所有端口都开放了
第二个问题的解决办法参考这个:
在Firefox地址栏输入about:config,然后在右键新建一个字符串键network.security.ports.banned.override,将需访问网站的端口号添加到,值就是那个端口号即可。
如有多个,就半角逗号隔开,例:81,88,98
在能保证安全的前提下,还简化成这样写0-65535。这样,就可以浏览任意端口的网站了
火狐浏览器地址访问受限解决办法
好了。到此你的网站就可以像正常那样访问了,之后再不断往你的网站中添加其他模块了
累死我了