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

问题描述 投票:0回答:3

我想部署托管在Azure Web App中的Django网站。

静态文件可以在DEBUG模式下完美地服务(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)是否可以设置Azure Web应用程序以在不使用CDN的情况下在生产中提供静态文件?

2)如果是,该怎么办?

django azure static
3个回答
1
投票

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

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

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

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

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

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

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

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

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

附加说明:

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

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

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


1
投票

我通过在根web.config文件的<handlers>部分顶部添加以下两行来解决此问题:

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.