Python web在IIS上发布方法和原理
python web应用想要发布使用iis发布有两种方式,这篇文章就为大家介绍一下这两种方式的具体实现:
1.配置httpplatform程序
httpplatform 模块将套接字连接直接传递到独立的 python 进程。 借助此传递可根据需要运行任何 web 服务器,但需要用于运行本地 web 服务器的启动脚本。 在 web.config 的 <httpplatform> 元素中指定脚本,其中 processpath 属性指向站点扩展的 python 解释器,arguments 属性指向脚本和希望提供的任何参数:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webserver> <handlers> <add name="pythonhandler" path="*" verb="*" modules="httpplatformhandler" resourcetype="unspecified"/> </handlers> <httpplatform processpath="c:\python36-32\python.exe" arguments="c:\home\site\wwwroot\runserver.py --port %http_platform_port%" stdoutlogenabled="true" stdoutlogfile="c:\home\logfiles\python.log" startuptimelimit="60" processesperapplication="16"> <environmentvariables> <environmentvariable name="server_port" value="%http_platform_port%" /> </environmentvariables> </httpplatform> </system.webserver> </configuration>
此处显示的 http_platform_port 环境变量包含端口,本地服务器使用该端口侦听来自 localhost 的连接。 此示例还演示如何根据需要创建其他环境变量,本示例中为 server_port。
关于httplplatform的更多描述可以参考https://docs.microsoft.com/en-us/iis/extensions/httpplatformhandler/httpplatformhandler-configuration-reference
2.配置 fastcgi 处理程序
fastcgi 是在请求级别工作的接口。 iis 接收传入的连接,并将每个请求转发到在一个或多个持久 python 进程中运行的 wsgi 应用。
若要使用 wfastcgi 包,请先安装并配置它,如 pypi.org/project/wfastcgi/ 所述。
接下来,将应用的 web.config 文件修改为,在 pythonhandler 键中添加 python.exe 和 wfastcgi.py 的完整路径。
- 修改 web.config 中的 pythonhandler 条目,让路径与 python 安装位置一致(有关确切的详细信息,请参阅 iis 配置参考 (iis.net))。
<system.webserver> <handlers> <add name="pythonhandler" path="*" verb="*" modules="fastcgimodule" scriptprocessor="c:\python36-32\python.exe|c:\python36-32\wfastcgi.py" resourcetype="unspecified" requireaccess="script"/> </handlers> </system.webserver>
- 在 web.config 的 <appsettings> 部分中,为 wsgi_handler、wsgi_log(可选)和 pythonpath 添加键:
<appsettings> <add key="pythonpath" value="c:\home\site\wwwroot"/> <!-- the handler here is specific to bottle; see the next section. --> <add key="wsgi_handler" value="app.wsgi_app()"/> <add key="wsgi_log" value="c:\home\logfiles\wfastcgi.log"/> </appsettings>
pythonpath 的值可以*扩展,但必须包括你的应用的根目录,他扩展了sys.path,可以在这个路径下找到import的包。
wsgi_handler 必须指向可从你的应用导入的 wsgi 应用,针对不同的框架,这个值也有一些区别,下面是一些例子。
1.bottle:确保 app.wsgi_app 后面有括号,如下所示。 此操作是必需的,因为该对象是函数(请参阅 app.py))而非变量:
<!-- bottle apps only --> <add key="wsgi_handler" value="app.wsgi_app()"/>
2.flask:将 wsgi_handler 值更改为 <project_name>.app,其中 <project_name> 与项目名称匹配。 可通过查看 runserver.py 中的 from <project_name> import app 语句,找到准确的标识符。 例如,如果项目命名为“flaskazurepublishexample”,则该条目如下所示:
<!-- flask apps only: change the project name to match your app --> <add key="wsgi_handler" value="flask_iis_example.app"/>
3.django:对于 django 项目,需要对“web.config”进行两项更改。 首先,将 wsgi_handler 值更改为 django.core.wsgi.get_wsgi_application()(该对象位于 wsgi.py 文件中):
<!-- django apps only --> <add key="wsgi_handler" value="django.core.wsgi.get_wsgi_application()"/>
其次,在 wsgi_handler
条目下添加以下条目,并将 djangoazurepublishexample
替换为项目名称:
<add key="django_settings_module" value="django_iis_example.settings" />
wsgi_log 为可选,但建议在调试应用时使用,记录日志。
以上就是这两种方式,但是作为补充我还是想跟大家分享一下第二种方式,使用fastcgi时,我们在安装完wfastcgi后输入命令wfastcgi-enable之后程序做了什么。
我们可以根据iis文档中对于fastcgi节的描述了解到。如果我们想要在web.config使用fastcgi时,必须先定义了该模块:
而这个定义方法呢,就是在iis全局配置applicationhost.config中添加下面的配置,而这个也是我们在输入wfastcgi-enable之后做的事情:
<?xml version="1.0"?> <configuration xmlns:xdt="http://schemas.microsoft.com/xml-document-transform"> <system.webserver> <fastcgi> <application fullpath="d:\home\site\wwwroot\python34\python.exe" xdt:locator="match(fullpath)" xdt:transform="remove" /> <application fullpath="d:\home\site\wwwroot\python34\python.exe" arguments="d:\python34\scripts\wfastcgi.py" maxinstances="0" xdt:transform="insert"/> </fastcgi> </system.webserver> </configuration>
如果您遇到了无法使用wfastcgi-enable这个命令的情况,比如azure web app的windows环境,那么你可以使用这种方式使用自定义的python版本。
参考文档:
https://docs.microsoft.com/en-us/iis/extensions/httpplatformhandler/httpplatformhandler-configuration-reference
https://docs.microsoft.com/zh-cn/visualstudio/python/configure-web-apps-for-iis-windows?view=vs-2019
https://pypi.org/project/wfastcgi/
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/fastcgi/