Django/Azure:在生产环境中提供静态文件
我想部署托管在Azure Web应用程序中的Django网站 静态文件在调试模式(DEBUG=False)下可以完美地提供,但我找不到合适的设置,让服务器在生产中处理它。我的所有静态文件都收集在应用程序根wwwroot/static/的“static”目录中 下面是应用程序根目录下的web.configDjango/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> <
<?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环境,这造成了显著的速度减慢李>
- 不要使用虚拟环境
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时,这可以正常工作,但在生产环境中则不行。你知道发生了什么吗?你有好的文档吗