我遇到了一个非常奇怪的问题。我创建了一个网站,但后端出现了问题。它运行在 Ubuntu 18.04 服务器上。后端是用 Python 和 Flask(一个微型 Web 框架)编写的。我已经设置了 Nginx 和 Gunicorn,因为不建议使用 Flask 的内置开发服务器。
我已经使用以下方法正确设置了 Nginx 和 Gunicorn本指南。这不是问题。我的网站是一个音频转换器,它使用 FFmpeg 和各种编码器,例如 LAME。因此它需要在终端中运行命令。例如,当 Python 尝试执行以下操作时:
os.system('wine ~/.wine/drive_c/ffmpeg.exe -i "1.wav" -ac 2 -vn -f wav - | lame -b 320 - "12345".mp3')
我在日志中看到以下错误:
gunicorn[2311]: sh: 1: lame: not found
gunicorn[2311]: sh: 1: wine: not found
我甚至尝试使用 subprocess 而不是 os.system,使用以下命令:
subprocess.run('wine ~/.wine/drive_c/ffmpeg.exe -i "1.wav" -ac 2 -vn -f wav - | lame -b 320 - "12345".mp3', shell=True)
但我遇到了同样的错误。
问题是,lame 和 wine 可以正常访问。为了证明我的观点,如果我在终端中直接运行完全相同的命令,即:
wine ~/.wine/drive_c/ffmpeg.exe -i "1.wav" -ac 2 -vn -f wav - | lame -b 320 - "12345".mp3
我没有收到任何错误并且 1.wav 文件成功转换为 MP3。
为什么当 Python 尝试运行这些命令时会出现这些错误?
**编辑:我一直在想,也许这就是问题所在:Gunicorn 是在虚拟环境中设置的,正如我所料本教程。虚拟环境中可能未安装 LAME 和 Wine?也许这就是为什么当我使用 Gunicorn 运行 Python/Flask 应用程序时,它不知道它们是什么?有没有办法检查是否是这种情况?
答案1
正如我所想,问题是由于 Gunicorn 安装在虚拟环境中造成的。我卸载了 Gunicorn,这次跳过了指南中在重新安装 Gunicorn 之前设置虚拟环境的步骤。我还将 myproject.service 文件从以下内容进行了更改:
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/myproject
Environment="PATH=/home/ubuntu/myproject/myprojectenv/bin"
ExecStart=/home/ubuntu/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app
更改为:
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/myproject
ExecStart=/home/ubuntu/myproject/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app
现在我只需要等待 Google Domains 将服务器的 IP 链接到我的域名 freeaudioconverter.net
答案2
您还可以在 [Service] Environment 中向 PATH 添加附加路径。这也适用于 uwsgi。
[Service]
Environment="PATH=/home/ubuntu/myproject/myprojectenv/bin:/usr/bin"
答案3
首先检查ffmpeg通过输入进行安装
$ ffmpeg -version
如果没有错误并且你看到了 ffmpeg 的版本,那么它就安装好了;如果你看到任何错误,那么就安装它
$ sudo apt update
$ sudo apt install ffmpeg
然后检查你的ffmpeg通过输入此命令可执行
$ which ffmpeg
输出将是这样的
/usr/bin/ffmpeg
然后像这样将此可执行文件复制到你的虚拟环境中
$ sudo cp /usr/bin/ffmpeg /my_project/my_env/bin/