简单起见,推荐:
1、在虚拟环境中 pip install wfastcgi +
2、 配置web.config
3、在IIS界面中设置网站应用程序池的标识设置为“LocalSystem” (目的是提高py脚本的系统权限)
4、 (%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
)
================
wfastcgi-enable 和 wfastcgi-disable 实质只是调用了一下appcmd.exe来IIS 的配置文件( applicationHost.config
)进行修改,执行修改后立即退出,不会有任何后台进程常驻。
================
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
默认情况下,某些 IIS 配置节可能是锁定的,这意味着它们只能在全局 applicationHost.config
文件中配置,而不能在站点级别的 web.config
文件中进行覆盖。当你运行这个解锁命令后,system.webServer/handlers
配置节可以在站点级别(即每个站点的 web.config
文件中)进行自定义和修改。--->如果整个IIS全部网站都支持python,可以直接设置全局的,这样就不需要每个站点的web.config都单独设置了,也就不需要解锁这两个配置节了。
================
网上关于IIS部署Django的教程中,添加wfastcgi部分通常只讲如何操作,不讲为什么这样操作,导致个性化的情况不知道如何修改、修改后会有什么后果。
要了解更详细,建议还是啃wfastcgi的官方文档,内容不多,但说得比较清楚。 wfastcgi · PyPI
一、添加模块映射
二、设置FastCGI映射的环境变量
三、关于wfastcgi-enable
四、【锁定冲突】打开web.config的设置锁
一、IIS的【处理程序映射(Handler Mapping)】中添加【模块映射(module mapping)】有多种方式,任选一种即可,例如:
1、在网站目录下添加 / 编辑 web.config 进行配置。(需执行wfastcgi-enable 或通过GUI交互使配置生效)
2、在控制面板的IIS管理器,通过GUI交互界面进行配置。(此方式无需执行wfastcgi-enable)
3、编写脚本调用IIS管理工具appcmd.exe进行配置。(具体请自行百度)
先看看通过web.config方式进行配置(此例子中只配置单个site,不是对IIS全局做配置)。
把以下代码保存为web.config,放到网站根目录。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Python FastCGI"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor="<Path to Python>\python.exe|<Path to Python>\lib\site-packages\wfastcgi.py"
resourceType="Unspecified"
requireAccess="Script"/>
</handlers>
</system.webServer>
</configuration>
这里填写脚本解析器(python.exe)和wfastcgi.py的绝对路径 【解析器路径可以用python安装目录下的python.exe 也可以用python虚拟环境的python.exe,根据自己的情况选择即可】
ps:如果未执行过wfastcgi-enable,以上配置是未生效的。
============再看看通过IIS管理器GUI交互界面方式对一个网站配置fastcgi:
ps:通过此界面操作,是不需要运行wfastcgi-enable的。也不需用设置“appcmd unlock config -section:system.webServer/handlers” 因为:
PS:此操作可以IIS主页的【处理程序映射】中进行,这样的话,配置就对IIS下所有网站都有效了,就不需要每个站点的web.config都单独添加这个handler了。(但<appSettings>部分还是需要每个站都单独添加)
======小结:两种方式是等效的========
如果配置后,出现以下错误:则是因为IIS的CGI还没有安装。解决方案:配置本地服务器--添加角色和功能--(服务器选择)--服务器角色--web服务器IIS--web服务器--应用程序开发--CGI
===== 二、设置FastCGI映射的环境变量=======
若一台服务器的IIS上有多个网站,一般来说每个网站的环境变量是不一样的。所以wfastcgi-enable对全局设置FastCGI映射时,不包含【FastCGI环境变量】设置。
通过在网站根目录下的web.config,可以设置该网站的FastCGI环境变量。
1、在web.config上设置
<?xml version="1.0" encoding="UTF-8"?>
<appSettings>
<add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
<add key="PYTHONPATH" value="<Path to Django App>" />
<add key="DJANGO_SETTINGS_MODULE" value="<Django App>.settings" />
</appSettings>
</configuration>
- <Path to Django App> 填写我们的项目路径。
- <django App> 填写settings.py的位置。<django App>修改成我们的settings.py所在目录的目录名即可。
2、在GUI界面上配置
对于全局设置,可以直接在IIS设置的主页【FastCGI设置】中添加和设置。
对于单个site的设置,需要先在site的【处理程序映射】中添加【模块映射】后,再回到全局设置主页的【FastCGI设置】中找到site的那条模块映射,点击【编辑】进入设置界面。(IIS下全部任一个网站单独设置的【模块映射】都可以在【FastCGI设置】中找到的)
需要添加的变量有3个:
Name: WSGI_HANDLER
Value: django.core.wsgi.get_wsgi_application()
Django项目目录
Name: PYTHONPATH
Value: <Path to Django App>
项目settings.py文件的位置
Name: DJANGO_SETTINGS_MODULE
Value: <Django ProjectName> .settings
==== wfastcgi-enable ====
=========研究过程中,折腾了我最多时间的是wfastcgi-enable 这个命令。======
wfastcgi-enable 这个命令是不是多余的?为了搞明白这个问题,看了官方文档、看了源代码、研究了appcmd的用法、又在IIS上反复试验。
=============先说结论:
wfastcgi-enable 命令实际上做的是调用appcmd.exe 来修改IIS配置,具体包括两部分:1. FastCGI 配置,2、Handler Mappings(处理程序映射)这些设置都会写入全局的 applicationHost.config 文件中。wfastcgi-enable 只需要执行一次,IIS下的所有站点都将应用这些配置(支持Python通过 FastCGI 模式运行),无需为每个站点重复操作。
然而,虽然全局配置提供了处理python脚本的能力,但是否实际启用这些处理功能取决于站点的 web.config 文件中是否定义了相应的 <handlers> 配置。即执行wfastcgi-enable后,依然需要在每个站点的web.config的<handlers> 配置节中添加对应的内容,网站才能运行python脚本。
=============
官方文档,说:
Once wfastcgi and IIS are installed, run wfastcgi-enable as an administrator to enable wfastcgi in the IIS configuration. This will configure a CGI application that can then be specified as a route handler.
看了这说明,我还以为运行了wfastcgi-enable后,IIS就有了python的fastcgi了。就不需要在web.config中添加<system.webServer><handlers><add ****/></handlers></system.webServer>这节了。但实际测试发现,wfastcgi-enable 后,IIS的 处理程序映射(Handler Mapping)中并没有对应的模块映射(Module Mapping),只是在FastCGI设置中多了一条记录。这有什么意义呢?
先说结论:
- 意义:将wfastcgi添加到IIS的FastCGI集合中。(即相当于在IIS中启用wfastcgi)
- 等价操作:以下对话框点击是
PS:如果仅仅在网站根目录创建了web.config,但没有进入IIS管理器中点开这个界面点击“是”,web.config中的模块映射是没有生效的,即使重启IIS或者重启网站都一样。
操作路径:IIS-->我的网站->处理程序映射->(双击)编辑模块映射 ->请求限制->确定->确定->确定。对应的配置就生效了。
其他试验过程:
阅读wfastcgi.py 的 def enable() 部分代码可知,它实际上是调用C:\Windows\System32\inetsrv下的appcmd.exe (通过脚本命令方式进行IIS配置的工具)
为了验证,我在服务器上做了测试:
step 1 :执行wfastcgi-enable前,IIS关于fastcgi配置是这样的
或者直接在【fastcgi设置】中查看:
step 2 :安装wfastcgi,并执行wfastcgi-enable
执行结果的提示内容也说得非常直白了:告诉你它具体做了什么使得FastCGI脚本处理器已经生效。
wfastcgi-enable
已经在配置提交路径“MACHINE/WEBROOT/APPHOST”向“MACHINE/WEBROOT/APPHOST”的“system.webServer/fastCgi”节应用了配置更改
"xxxx" can now be used as a FastCGI script processor
step 3: 这时候再检查一下IIS全局配置的内容,已经新增了一项FastCGI映射配置了
或者直接进入【fastcgi设置】
入口:
详情:
step 4: 执行wfastcgi-disable,可以看到IIS全局配置中,对应的选项已经被移除。
经过以上试验,我们可以知道 wfastcgi-enable 和 在控制面板的IIS管理器,通过GUI交互界面进行配置两种操作方式了。
以下再来看看
=====appcmd命令方式添加映射=====
1、添加Web Server下的FastCGI模块路径:
appcmd set config /section:system.webServer/fastCgi /+[fullPath='(python解释器绝对路径|参数))’]
2、在WebSite下添加模块映射的命令 【处理程序映射 叫 Handler Mapping】:
appcmd set config /section:system.webServer/handlers /+[name=’FastCGI’,path=’*’,verb=’*’,modules=’FastCgiModule’,scriptProcessor='(python解释器绝对路径|参数)’,resourceType='Unspecified']
=========其他=====
有教程说 “ 直接引用python\Lib\site-packages目录下的文件,不可以部署多个Django网站” “如果需要部署多个项目,就把“wfastcgi.py”文件从上面的路径中复制到Django项目的根目录下。” --->对此操作我表示质疑。
按我理解,无论IIS全局设置wfastcgi 还是 某个site或者某个目录设置wfastcgi,都完全可以用同一个解析器,同一个wfastcgi文件。把“wfastcgi.py”文件从上面的路径中复制到Django项目的根目录下是多此一举。
Q:一定要在服务器上 pip install wfastcgi 吗?不在服务器上pip install 而直接把本地的wfastcgi.py拷贝到服务器可以吗?
A:可以。
只是不pip install 的话,服务器上没有 wfastcgi-enable.exe 。相关配置需要通过网站目录下的web.config进行配置或者IIS管理器GUI界面完成配置。
Q:能否直接把本地的 wfastcgi-enable.exe 复制到服务器,然后运行它?
A:不能,因为在本地执行 pip install wfastcgi 时生成的 wfastcgi-enable.exe文件里面hardcode了一些绝对路径。直接复制到服务器上执行,会报错。
Q:wfastcgi-enable.exe 和 wfastcgi-disable.exe 分别做了 什么?
A:其实只是调用IIS配置工具appcmd.exe 执行添加/删除FastCGI映射的命令。
添加:appcmd set config /section:system.webServer/fastCgi / + [fullPath=xxx
删除:appcmd set config /section:system.webServer/fastCgi / - [fullPath=xxx
Q7:重启服务器或者重启IIS后,需要重新执行wfastcgi-enable吗?
A:不需要
========三、解锁web.config更改权限 ===========
IIS出于安全考虑,对web.config的管理机制,默认情况下会锁住配置项不允许更改。我们把它解锁了
如果访问IIS出现如下错误
HTTP 错误 500.19 Internal Server Error
出现这样的情况是因为IIS7之后的版本都采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改。我们把它解锁了就OK。
打开CMD,在里面依次输入下面两个命令:
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
解除了锁定之后,再访问网站就能正常显示了
若要在GUI界面操作(这样修改完web.config后可以重新上锁)
参考:
https://www.django.cn/article/show-21.html
https://zhuanlan.zhihu.com/p/111822007 对应的视频为 https://www.bilibili.com/video/BV1bT4y1M7L2
https://blog.csdn.net/SongyaoLee/article/details/82914503
https://blog.csdn.net/elonpage/article/details/52645562
https://blog.csdn.net/weixin_29138345/article/details/113080327 (使用appcmd来自动化部署IIS网站)