我的家庭服务器上运行着 Flask/UWSGI 应用程序。最近的 Ubuntu 升级删除了 Python 3.10 并安装了 Python 3.12。我已经创建了一个新的 venv 并安装了该应用程序,但它不再运行。在 UWSGI 日志中,它显示:
ModuleNotFoundError: No module named 'wsgi'
我的应用程序称为 sieve,工作目录是 /usr/share/sieve。我正在使用一个 ini 文件 /usr/share/sieve/sieve.ini,它看起来像这样:
[uwsgi]
module = wsgi
callable = app
master = true
processes = 5
socket = /usr/share/sieve/sieve.sock
chmod-socket = 660
vacuum = true
die-on-term = true
logto = /usr/share/sieve/sieve.log
logfile-chown = jon:www-data
log-date = [%%Y-%%m-%%d %%H:%%M:%%S]
我也尝试过
module=sieve.wsgi
和
module=wsgi:app
如其他地方建议的那样。
应用程序位于sieve 子目录和 /usr/share/sieve/sieve/wsgi.py 如下所示:
#!/usr/bin/env python
from run_app import app
if __name__ == '__main__':
app.run(debug=True)
服务定义包括这些行:
WorkingDirectory=/usr/share/sieve
Environment="PATH=$PATH:/usr/share/sieve/venv/bin"
ExecStart=/usr/share/sieve/venv/bin/uwsgi --ini sieve.ini --enable-threads
我不确定自上次工作以来发生了什么变化,但进一步查看向上查看日志,此设置工作正常:
[2024-08-27 21:32:30] - *** Starting uWSGI 2.0.21 (64bit) on [Tue Aug 27 21:32:30 2024] ***
[2024-08-27 21:32:30] - compiled with version: 11.3.0 on 20 November 2022 14:54:48
[2024-08-27 21:32:30] - os: Linux-6.8.0-40-generic #40~22.04.3-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 30
17:30:19 UTC 2
当前版本不起作用(具有相同的站点代码和配置)。
[2024-09-24 20:33:49] - *** Starting uWSGI 2.0.27 (64bit) on [Tue Sep 24 20:33:49 2024] ***
[2024-09-24 20:33:49] - compiled with version: 13.2.0 on 24 September 2024 18:04:08
[2024-09-24 20:33:49] - os: Linux-6.8.0-45-generic #45-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 30 12:02:04 UTC 2024
为什么我的应用程序停止工作以及我需要做什么才能使 UWSGI 找到模块再次?
问题在于,的 uWSGI 配置文件在错误的位置查找
wsgi
模块。当指定
module = wsgi
时,uWSGI 会在当前目录下查找名为
wsgi.py
的文件,或者在 Python 路径中查找名为
wsgi
的模块。
为了解决这个问题,需要告诉 uWSGI
wsgi
模块(实际上是
wsgi.py
文件)位于
sieve
模块中。
以下是需要进行的更改:
-
修改 uWSGI 配置文件 (
/usr/share/sieve/sieve.ini
):
将以下行:
ini
module = wsgi
替换为:
ini
module = sieve.wsgi:app
这个配置告诉 uWSGI 在
sieve
模块中查找名为
wsgi
的模块,并在该模块中加载名为
app
的可调用对象 (callable)。
- 确保虚拟环境已激活:
在启动 uWSGI 之前,请确保在的服务定义或启动脚本中激活了的虚拟环境。 这可以通过在
ExecStart
行之前添加以下内容来完成:
ExecStart=/bin/bash -c 'source /usr/share/sieve/venv/bin/activate && /usr/share/sieve/venv/bin/uwsgi --ini sieve.ini --enable-threads'
完成这些更改后,重新启动 uWSGI 服务,的 Flask 应用程序应该可以正常工作了。
其他建议:
- 确保在新的虚拟环境中安装了所有必需的 Python 包,包括 Flask 和 uWSGI。
-
检查 uWSGI 日志文件 (
/usr/share/sieve/sieve.log
) 以获取更详细的错误消息。