在 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>
它确实有效,但我不明白目录部分的用途。事实上,如果我从文件中删除它,网络应用程序就会继续工作。
有人可以解释一下这个配置的每个部分的作用吗?
最佳答案
删除 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 扩展模块无法在子解释器上下文中正常运行。因此,最佳实践是强制使用主解释器上下文,但要做到这一点,您还需要让 WSGI 应用程序在其自己的守护进程进程组中运行,如WSGIDaemonProcess
设置的那样。和WSGIProcessGroup
.
关于python - Flask 的 Apache 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40295615/