虽然这并不是官方支持的部署模式,但随着微软对Linux的态度逐渐从敌对转变为合作、IIS开始支持高效的FastCGI,IIS中部署Django能得到接近Linux的性能。

  • 最主要的原因,IIS+Windows的环境,适合无专业运维的特殊乙方环境。
  • 单机环境往往数据库才是性能瓶颈,而PostgreSQL在Windows和Linux性能差异完全可以接受。
  • IIS 10的静态性能足够,支持HTTP/2等新技术。
  • Python本身在不同平台的性能差异可以忽略。
  • Windows下使用Memcached稳定性、性能都非常差。但巨硬出品Redis on Windows的可以满足的稳定性需求,依赖第三方插件支持redis。

[========]

环境:

  • Windows Server 2012 ~ 2016 ,Windows 8 ~ 10 Pro
  • IIS 7.5 ~ 10
  • Python 3.5 ~ 3.6
  • Django 1.8 ~ 1.10
  • WebApp目录:D:\helloworld
  • WebApp路径: /helloworld
  • Python虚拟环境:D:\myenv

STEP 1 基础环境安装

  • 安装python、django:略。
  • 安装IIS 10 Win+X,选择“命令提示符(管理员)”,输入:
start /wait %windir%\System32\PkgMgr.exe /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-Security;IIS-RequestFiltering;IIS-HttpCompressionStatic;IIS-WebServerManagementTools;IIS-ManagementConsole;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI;IIS-CGI
  • 安装wfastcgi,基于WSGI和FastCGI的IIS-Python桥接。
pip install wfastcgi

STEP 2 新建Django Project 并测试

  • 新建虚拟环境D:\myenv
    cd /d d:\
    c:\Program Files\Python35\python.exe" "c:\Program Files\Python35\Tools\scripts\pyvenv.py" myenv
  • 创建Django Project
    d:\myenv\Scripts\activate.bat
    cd /d d:\
    d:\myenv\Scripts\django-admin.exe startproject helloworld
  • 运行测试服务器,确认正常
    cd /d helloworld
    python manage.py runserver

STEP 3 配置IIS

  • 开启应用程序映射
  • 打开IIS管理器,左侧选择服务器,右侧依次> 功能委派 > 处理应用程序映射,设置为读写。
  • 也可通过命令行输入:
    %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
  • 激活wfastcgi,为IIS添加fastcgi程序
  • 打开IIS管理器,左侧选择服务器,右侧依次Fast CGI设置,新建应用程序:
    • 完成路径:d:\myenv\scripts\python.exe
    • 参数:d:\myenv\lib\site-packages\wfastcgi.py
    • 最大实例数:0
    • 终止前发送信号:30
  • 也可命令行输入:(myenv) D:\myenv\Scripts>wfastcgi-enable.exe
  • 新建应用程序/虚拟目录:
  • 右键当前站点,选择“添加应用程序”。
    • 别名:helloworld
    • 物理路径: d:\helloworld
  • 也可命令行输入:
    %windir%\system32\inetsrv\appcmd add app /site.name:"Default Web Site" /path:/helloworld /physicalPath:d:\helloworld
  • 在d:\helloworld目录新建web.config,输入:
<configuration>
    <appSettings>
    <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
    <add key="PYTHONPATH" value="D:\helloworld" />
    <add key="DJANGO_SETTINGS_MODULE" value="helloworld.settings" />
    </appSettings>
    <system.webServer>
    <handlers>
        <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="d:\myenv\scripts\python.exe|d:\myenv\lib\site-packages\wfastcgi.py" resourceType="Unspecified" />
    </handlers>
        <httpProtocol>
            <customHeaders>
                <add name="SCRIPT_NAME" value="/helloworld" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>
  • 其中WSGI_HANDLER:
    • = Django 1.7:django.core.wsgi.get_wsgi_application()
    • <= Django 1.6:django.core.handlers.wsgi.WSGIHandler()
  • 在HTTP响应标头添加SCRIPT_NAME使Django工作在子目录,其他目录还要留给乙方其他.net app。
  • 重启IIS,访问http://127.0.0.1/helloworld/http://127.0.0.1/helloworld/admin/测试。