尝试使用 apache 和 mod_wsgi 部署应用程序时出现奇怪的语法错误

Odd Syntax Error when trying to deploy app with apache and mod_wsgi

我正在学习如何通过构建最简单的 "Hello, Word!" 应用程序在 Ubuntu 16.04 服务器上使用 apache2.4 和 mod_wsgi 部署 Flask 应用程序,但我遇到了一个奇怪的语法与我的 wsgi 文件相关的错误,我很困惑。

Apache 似乎 运行 没问题,但是当我访问应用程序的域时,我收到了 apache 的标准 500 错误并且日志列出了以下内容:

[wsgi:error] [pid 28427:tid 140540431517440] mod_wsgi (pid=28427): Target WSGI script '/var/www/myapp.domain.com/myapp.wsgi' cannot be loaded as Python module.
[wsgi:error] [pid 28427:tid 140540431517440] mod_wsgi (pid=28427): Exception occurred processing WSGI script '/var/www/myapp.domain.com/myapp.wsgi'.
[wsgi:error] [pid 28427:tid 140540431517440] Traceback (most recent call last):
[wsgi:error] [pid 28427:tid 140540431517440]   File "/var/www/myapp.domain.com/myapp.wsgi", line 5, in <module>
[wsgi:error] [pid 28427:tid 140540431517440]     exec(file_.read(), dict(__file__=activate_this))
[wsgi:error] [pid 28427:tid 140540431517440]   File "<string>", line 4
[wsgi:error] [pid 28427:tid 140540431517440]     deactivate () {
[wsgi:error] [pid 28427:tid 140540431517440]                   ^
[wsgi:error] [pid 28427:tid 140540431517440] SyntaxError: invalid syntax

日志中引用的语法错误指向位于 ./venv/bin/activate

的虚拟环境激活脚本中的代码

我想知道我使用 venv 模块与 virtualenv 是否导致了这个问题

这是我的应用程序的 wsgi 文件的内容(test 是实例化 flask 的模块的名称):

#!/usr/bin/python3
activate_this = '/var/www/myapp.domain.com/venv/bin/activate'
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

import sys
sys.path.insert(0, '/var/www/myapp.domain.com')

from test import app as application

无论花括号后面是什么(集合或字典显示或字典理解)deactivate () { 都不是合法的Python 代码。当您尝试 运行 语法错误时,我没有看到任何奇怪或神秘的东西。

不推荐使用 activate_this.py 脚本,即使您的名称是正确的。有关如何将 Python 虚拟环境与 mod_wsgi 一起使用的信息,请参阅文档:

确保您也在使用 mod_wsgi 的守护程序模式。

该文档中的详细信息太多,无法在此处复制,您使用什么方法取决于如何使用 mod_wsgi。

我已经通过更改'python3 -m venv'构建的虚拟环境解决了这个问题。现在我通过 virtualenv 创建 venv,然后重新安装必要的模块。

原因是python3创建的venv没有activate_this.py的脚本,这对写myapp.wsgi很重要文件。

professional document中,原因如下:

    When needing to activate the Python virtual environment from within the 
    WSGI script file as described, it is preferred that you be using the either 
    virtualenv or virtualenvwrapper to create the Python virtual environment. 
    This is because they both provide the activate_this.py script file which 
    does all the work of setting up sys.path. When you use either pyvenv or 
    python -m venv with Python 3, no such activation script is provided.

祝你好运!