【问题标题】:Django / Azure : serving static files in productionDjango / Azure:在生产中提供静态文件
【发布时间】:2017-12-30 17:38:25
【问题描述】:

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

静态文件在 DEBUG 模式 (DEBUG=False) 下完美提供,但我找不到正确的设置让服务器在生产中处理它。我所有的静态文件都收集在应用根目录 wwwroot/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>

我还在网络应用设置中将静态目录定义为“虚拟目录”,其中“\static”指的是“\site\wwwroot\static”,并选中“应用程序”复选框(我也尝试离开它没有被选中,但它不会改变任何东西。

但是,这不起作用。

1) 是否可以在不使用 CDN 的情况下设置 Azure Web 应用以在生产中提供静态文件?

2) 如果是,该怎么做?

【问题讨论】:

  • 您遇到的错误是什么?
  • 静态文件(css,js)没有提供,所以空白的html页面。

标签: django azure static


【解决方案1】:

如果在尝试了所有其他建议的解决方案后,您仍然发现自己遇到了麻烦,您可能必须了解,取决于运行您的应用程序的服务器,静态文件是服务器的方式。 Django 有自己的服务器,使用以下命令运行:

python manage.py runserver

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

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

https://您的应用名称.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 的默认服务器知道在哪里可以找到和提供静态文件(以及媒体文件,以及管理路由)

【讨论】:

    【解决方案2】:

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

    据 Microsoft Azure 支持团队称:

    • 我使用的默认 Python 版本 (3.4) 会产生一些问题,最好使用网络应用扩展安装新的 Python 版本。
    • 对于 Python 中的 Azure Web App,使用 HTTP Platform Handler 比使用 fastcgi 更好。
    • 我的页面加载速度也很慢。这是由于在应用程序重新启动时加载了大量 Python 包。由于某种原因,默认的 Python 版本往往会失败,因此即使“始终开启”设置为开启,应用程序也必须重新启动。似乎 Azure 实际上从与 Python 代码不同的磁盘加载 Python 环境,这会显着降低速度。
    • 不要使用虚拟环境

    解决方案

    这是我解决问题所遵循的程序:

    1. 将 Python 3.5 安装为 Web 应用程序扩展。这可以使用 Web 应用程序的 Azure 门户轻松完成:“设置 > 扩展”
    2. 在 Web 应用程序的 Azure 门户中,转到“高级工具”。打开 Kudu 高级工具,然后打开 CMD 控制台(从 Kudu 页面顶部的“调试控制台”菜单中)。导航到主目录并找到新 Python 的安装位置。就我而言,它位于 "D:\home\python353x86"
    3. 现在是时候使用新的 Python 版本更新 web.config。此处详细解释了此路径:https://prashanthmadi.github.io/2016/11/15/django-app-with-httpplatformhandler-in-azure-app-services-windows-new.html。请注意将教程中的 processPath="D:\home\Python27\python.exe" 替换为您自己的 Python 路径。部署脚本也是如此
    4. 在您的静态目录中添加一个新的 web.config 文件,如同一教程中所述

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

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

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

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

    补充说明:

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

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

    start.py 是您的网络作业脚本。再次将 python 路径替换为您的实际路径。

    【讨论】:

      【解决方案3】:

      我已经通过将这两行添加到根 web.config 文件的 &lt;handlers&gt; 部分的顶部解决了这个问题:

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

      其他的都和你的 web.config 一样,我不需要 static/ 目录中的单独配置文件

      【讨论】:

        【解决方案4】:

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

        1-) 你可以像下面这样定义你的 web.config:https://github.com/prashanthmadi/azure-django-customdeployment/blob/master/web.config

        2-) 配置静态文件处理程序,添加以下内容:https://stackoverflow.com/a/2066040/1384539

        【讨论】:

        • 谢谢蒂亚戈。但是您会注意到我的 web.config 文件已经与您所指的相同。当 debug=false 但不是在生产中时,这可以正常工作。知道发生了什么吗?
        • 还有关于如何使用 azure blob 存储设置更改的优秀文档吗?我找不到最新信息
        • 你可以直接通过portal添加你的静态文件或者使用python storage sdk:github.com/Azure/azure-storage-python
        • 关于调试,我不知道是什么错误,你需要检查日志
        猜你喜欢
        • 2018-09-25
        • 1970-01-01
        • 2011-08-11
        • 2017-10-27
        • 2016-12-10
        • 2015-10-30
        • 1970-01-01
        • 2015-10-02
        • 2014-07-25
        相关资源
        最近更新 更多