在Flask的官方文档中,在配置Apache部分,它说要创建一个站点可用文件,如下所示:
<VirtualHost *>
ServerName example.com
WSGIDaemonProcess yourapplication user=user1 group=group1 threads=5
WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi
<Directory /var/www/yourapplication>
WSGIProcessGroup yourapplication
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
它确实有效,但我不明白目录部分的用途。事实上,如果我从文件中删除它,Web应用程序将继续工作。
有人可以解释一下这个配置的每个部分是做什么的吗?
答案 0 :(得分:1)
删除Directory
部分会产生三种后果。
首先,根据权利,您的Apache服务器应该拒绝接受对WSGI应用程序的请求。这是因为您删除了Allow from all
指令,该指令告诉Apache允许其授予对WSGI脚本的访问权限。它没有失败表明您的Apache服务器具有松散的安全配置,默认情况下允许访问文件系统的任何部分,这被认为是不好的做法,因为它可以吸取整个Apache实例的安全性。
第二个是您的WSGI应用程序不会在由mod_wsgi创建的单独的守护程序进程中运行,而是由WSGIDaemonProcess
指令设置。这是删除WSGIProcessGroup
的结果。这是一个坏主意,因为这意味着您的WSGI应用程序以嵌入模式运行,这意味着它在Apache子进程中运行。这被认为是一个坏主意,因为默认的Apache配置以及它如何管理进程/线程的目标是静态文件托管和PHP。这种配置对于Python Web应用程序非常糟糕,因此使用mod_wsgi托管的Web应用程序可能会执行得很糟糕,具体取决于它正在做什么以及您获得了多少流量。守护进程模式是推荐模式,因为您可以更好地对其进行自定义,以使其最适合您的特定WSGI应用程序。
第三个是您的WSGI应用程序将在子解释器中运行,而不是每个进程的主要Python解释器上下文。这是删除WSGIApplicationGroup %{GLOBAL}
的结果。在子解释器上下文中运行可能很糟糕,因为有各种用于Python的第三方C扩展模块将无法在子解释器上下文中正常运行。因此,最佳做法是强制使用主解释器上下文,但要做到这一点,您还需要在WSGIDaemonProcess
和WSGIProcessGroup
设置的自己的守护程序进程组中运行WSGI应用程序。 / p>
答案 1 :(得分:0)
配置文件用于mod_wsgi
包,它实现了一个简单易用的Apache模块,该模块可以托管任何支持Python WSGI规范的Python Web应用程序。
来自mod_wgsi归档的wiki:
mod_wgsi Configuration Directives
WSGIApplicationProcess
WSGIProcessGroup指令可用于指定将在哪个进程组中执行WSGI应用程序或WSGI应用程序集。同一进程组中的所有WSGI应用程序都将在同一组守护程序进程的上下文中执行。
WSGIApplicationGroup
WSGIApplicationGroup指令可用于指定WSGI应用程序或WSGI应用程序集所属的应用程序组。同一应用程序组中的所有WSGI应用程序都将在处理请求的进程的同一Python子解释器的上下文中执行。
这解释了Order
和Allow
部分:
mod_wgsi Access Control Mechanisms