Django/Azure:在生产环境中提供静态文件

Django/Azure:在生产环境中提供静态文件,django,azure,static,Django,Azure,Static,我想部署托管在Azure Web应用程序中的Django网站 静态文件在调试模式(DEBUG=False)下可以完美地提供,但我找不到合适的设置,让服务器在生产中处理它。我的所有静态文件都收集在应用程序根wwwroot/static/的“static”目录中 下面是应用程序根目录下的web.config <?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <

我想部署托管在Azure Web应用程序中的Django网站

静态文件在调试模式(DEBUG=False)下可以完美地提供,但我找不到合适的设置,让服务器在生产中处理它。我的所有静态文件都收集在应用程序根wwwroot/static/的“static”目录中

下面是应用程序根目录下的web.config

<?xml version="1.0" encoding="utf-8"?>    
<configuration>
<appSettings>
  <add key="WSGI_ALT_VIRTUALENV_HANDLER" value="MyApp.wsgi.application" />
  <add key="WSGI_ALT_VIRTUALENV_ACTIVATE_THIS" value="D:\home\site\wwwroot\env\Scripts\python.exe" />
  <add key="WSGI_HANDLER" value="ptvs_virtualenv_proxy.get_venv_handler()" />
  <add key="PYTHONPATH" value="D:\home\site\wwwroot" />
  <add key="DJANGO_SETTINGS_MODULE" value="MyApp.settings" />
  <add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgit.log"/>
</appSettings>
<system.webServer>
  <handlers>
    <add name="PythonHandler" path="handler.fcgi" verb="*" modules="FastCgiModule" scriptProcessor="D:\Python34\python.exe|D:\Python34\Scripts\wfastcgi.py" resourceType="Unspecified" requireAccess="Script"/>
  </handlers>
  <rewrite>
    <rules>
      <rule name="Static Files" stopProcessing="true">
        <conditions>
          <add input="true" pattern="false" />
        </conditions>
      </rule>
      <rule name="Configure Python" stopProcessing="true">
        <match url="(.*)" ignoreCase="false" />
        <action type="Rewrite" url="handler.fcgi/{R:1}" appendQueryString="true" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

我还在静态目录中添加了以下web.config

<?xml version="1.0"?>  
<configuration>  
<system.webServer>
    <!-- this configuration overrides the FastCGI handler to let IIS serve the static files -->
    <handlers>
       <clear />
        <add 
            name="StaticFile"
            path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" 
            resourceType="Either" 
            requireAccess="Read" />
    </handlers>
</system.webServer>

我还将静态目录定义为web应用程序设置中的“虚拟目录”,其中“\static”引用“\site\wwwroot\static”,并选中“application”复选框(我也尝试将其保留为未选中状态,但它不会更改任何内容)

然而,这是行不通的

1) 是否可以在不使用CDN的情况下设置Azure web应用程序来为生产中的静态文件提供服务


2) 如果是,怎么做?

最好将静态内容移动到Azure Blob存储,并使用CDN以获得更好的性能

1-)您可以按如下方式定义web.config:


2-)要配置静态文件处理程序,请添加以下内容:

在联系Azure支持后,我能够解决该问题。这其实不是一个小问题,其他人可能也经历过。下面的解决方案还显著提高了应用程序的性能

根据Microsoft Azure支持团队的说法:

  • 我使用的默认Python版本(3.4)会产生一些问题,最好使用web应用程序扩展安装一个新的Python版本
  • 对于Python中的Azure Web应用程序,使用HTTP平台处理程序比使用fastcgi更好
  • 我也经历了非常缓慢的页面加载。这是由于应用程序重新启动时加载了大量Python包。出于某种原因,默认Python版本往往会失败,因此即使“始终打开”设置处于打开状态,应用程序也必须重新启动。Azure似乎实际上是从不同于Python代码的磁盘加载Python环境,这造成了显著的速度减慢
  • 不要使用虚拟环境
解决方案 以下是我解决问题所遵循的步骤:

  • 将Python 3.5安装为web应用程序扩展。使用Azure门户网站的web应用程序:“设置>扩展”可以轻松完成此操作
  • 在web应用程序的Azure门户中,转到“高级工具”。打开Kudu高级工具,然后打开CMD控制台(从Kudu页面顶部的“调试控制台”菜单)。导航到主目录并找到新Python的安装位置。在我的例子中,它位于“D:\home\python353x86”
  • 现在是使用新的Python版本更新web.config的时候了。此处详细解释了此路径:。请小心将教程中的processPath=“D:\home\Python27\python.exe”替换为您自己的python路径。部署脚本也是如此
  • 在静态目录中添加一个新的web.config文件,如同一教程中所述

  • 使用调试控制台和“requirements.txt”文件安装Python软件包,运行:

    D:\home\python353x86\python.exe-m pip安装-r requirements.txt

  • 用实际路径替换python路径。python包现在与python exe一起安装。如果应用程序必须重新启动,使用虚拟环境将减慢网页的加载速度

    此时,您的web应用程序应该可以正常工作

    补充说明: 如果您正在使用webjobs,则需要更新运行它们的方式。 解决方案是在webjob目录中创建一个“run.cmd”文件,其中包含:

    D:\home\python353x86\python.exe start.py
    

    其中start.py是您的webjob脚本。再次用实际路径替换python路径。

    我通过在rootweb.config文件的
    部分的顶部添加这两行代码,解决了这个问题:

    <remove name="Python27_via_FastCGI" />
    <remove name="Python34_via_FastCGI" />
    
    
    

    其他一切都与您的web.config相同,如果在尝试了所有其他建议的解决方案后,您仍然发现自己遇到了麻烦,那么我不需要在
    static/
    目录中使用单独的配置文件,您可能必须了解,根据运行应用程序的服务器的不同,静态文件在服务器上的传输方式也不同。Django有自己的服务器,可以使用以下命令运行:

    python manage.py runserver
    
    但PAAS提供商在大多数情况下都不使用此服务器。gunicorn在大多数情况下都是被选中的。Azure有时使用IIS的FastCGI处理程序,但目前它足够智能,可以检测django应用程序并尝试使用django的默认服务器

    因此,您必须采取的第一步是找出azure用于运行您的应用程序的服务器,通过阅读azure的日志,您可能知道:

    https://YOUR-APP-NAME.scm.azurewebsites.net/api/logstream

    如果您确认azure正在使用django的默认服务器,则必须记住,django在生产环境中不会自动为静态文件提供服务器。您必须配置静态文件夹的url。因此,在config/urls.py中设置静态url,如下所示:

    from django.conf import settings
    from django.conf.urls.i18n import i18n_patterns
    from django.conf.urls.static import static
    from django.contrib import admin
    from django.urls import include, path
    
    urlpatterns = i18n_patterns(path('admin/', admin.site.urls), prefix_default_language=False) + \
        static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + \
        static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

    如您所见,我启用了管理员、静态和媒体URL。这足以让django的默认服务器知道在何处查找和提供静态文件(以及媒体文件,以及管理路由)

    您遇到了什么错误?静态文件(css、js)没有提供空白html页面。谢谢Thiago。但是您会注意到,我的web.config文件已经与您所引用的文件相同。当debug=false时,这可以正常工作,但在生产环境中则不行。你知道发生了什么吗?你有好的文档吗