我想部署一个托管在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)如果是,该怎么做?
答案 0 :(得分:1)
联系Azure支持后,我能够解决问题。这实际上不是一个小问题,其他人可能已经经历过这个问题。下面的解决方案也显着改善了应用程序的性能。
根据Microsoft Azure支持团队:
以下是解决问题的步骤:
在静态目录中添加新的web.config文件,如同一教程中所述
使用调试控制台和“requirements.txt”文件安装Python软件包,运行:
D:\ home \ python353x86 \ python.exe -m pip install -r requirements.txt
将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的默认服务器知道在哪里可以找到并提供静态文件(以及媒体文件以及管理路由)