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

时间:2017-07-25 01:19:49

标签: django azure static

我想部署一个托管在Azure Web App中的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>

我还将静态目录定义为&#34;虚拟目录&#34;在Web应用程序设置中,使用&#34; \ static&#34;引用&#34; \ site \ wwwroot \ static&#34;,并检查&#34;应用程序&#34;复选框(我也尝试不加控制,但它不会改变任何内容。

但是,这不起作用。

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

2)如果是,该怎么做?

4 个答案:

答案 0 :(得分:1)

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

根据Microsoft Azure支持团队:

  • 我使用的默认Python版本(3.4)会产生一些问题,最好使用网络应用扩展程序安装新的Python版本。
  • 对于Python中的Azure Web App,最好使用 HTTP平台处理程序而不是fastcgi。
  • 我的加载页面也很慢。这是因为在应用程序重新启动时加载了大量Python包。由于某种原因,默认的Python版本往往会失败,因此即使“Always ON”设置为ON,应用程序也必须重新启动。看起来Azure实际上是从与Python代码不同的磁盘加载Python环境,这会造成显着的减速。
  • 不要使用虚拟环境

解决方案

以下是解决问题的步骤:

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

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

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

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

    此时,您的网络应用应该正常运行

    附加说明:

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

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

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

答案 1 :(得分:1)

我已经通过在root web.config 文件的<handlers>部分的顶部添加这2行来解决了这个问题:

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

其他所有内容都与您的 web.config 相同,我在static/目录中不需要单独的配置文件

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

如果在尝试了所有其他提议的解决方案之后仍然遇到麻烦,则可能必须了解,取决于运行应用程序的服务器,静态文件是服务器的方式。 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中设置静态网址,如下所示:

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的默认服务器知道在哪里可以找到并提供静态文件(以及媒体文件以及管理路由)