如何在 uWSGI 中正确加载 Flask 应用程序模块?
How to correctly load Flask app module in uWSGI?
[编辑]
我设法通过从项目文件夹中启动 uwsgi 来加载 flask 应用程序模块。我现在遇到 nginx 没有权限访问套接字文件的问题(向下滚动到问题的末尾)。如果有人可以提供帮助..?
[/编辑]
关注 this tutorial I'm trying to run my Flask website with uWSGI and nginx。当完全按照教程所说的去做时,它工作正常。不过,我现在想要 运行 我自己的网站。我自己的网站项目结构如下:
myownproject
|-app
| -__init__.py
|-run.py
|-myownproject_nginx.conf
|-myownproject_uwsgi.ini
其中 app
像这样加载到 __init__.py
中:
app = Flask(__name__)
和 myownproject_uwsgi.ini 看起来像这样:
[uwsgi]
#application's base folder
base = /home/kramer65/myownproject
#python module to import
app = app
module = %(app)
# I disabled these lines below because I don't use a venv (please don't ask)
# home = %(base)/venv
# pythonpath = %(base)
#socket file's location
socket = /home/kramer65/myownproject/%n.sock
#permissions for the socket file
chmod-socket = 666
#the variable that holds the flask application inside the imported module
callable = app
#location of log files
logto = /var/log/uwsgi/%n.log
但是当我运行这个:
$ uwsgi --ini /home/kramer65/myownproject/myownproject_uwsgi.ini
[uWSGI] getting INI configuration from /home/kramer65/myownproject/myownproject_uwsgi.ini
我在 /var/log/uwsgi/myownproject_uwsgi.log
中得到以下日志:
*** Operational MODE: single process ***
ImportError: No module named app
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
为什么 uwsgi 找不到我的可调用函数?为什么 mountpoint
是空的 (=''
)?我在这里做错了什么?
有人知道我怎样才能让它正常工作吗?
[编辑]
好的,我在 myownproject
项目文件夹中尝试了 运行ning uwsgi --ini /home/kramer65/myownproject/myownproject_uwsgi.ini
,这解决了这个问题;它现在找到了可调用的并且似乎工作正常。
虽然我仍然得到 502,下一个问题似乎是 nginx 没有对套接字文件的权限的权限问题。 /var/log/nginx/error.log
说:
2015/10/27 11:40:36 [crit] 14276#0: *1 connect() to
unix:/home/kramer65/myownproject/myownproject_uwsgi.sock failed (13:
Permission denied) while connecting to upstream, client:
80.xxx.xxx.xxx, server: localhost, request: "GET / HTTP/1.1", upstream:
"uwsgi://unix:/home/kramer65/myownproject/myownproject_uwsgi.sock:",
host: "52.xx.xx.xxx"
所以我将 chmod-socket = 666
更改为 chmod-socket = 777
。在执行 ls -l
时,我实际上看到套接字文件具有完全权限,但我仍然收到上面粘贴的错误。
有什么想法可以让它发挥作用吗?
base
配置只是一个内部变量。您注释掉的部分导致了您的问题。
如果您不想使用 virtualenv 并设置您的 pythonpath,请将 base
配置更改为 chdir
。
chdir = /home/kramer65/myownproject
在内部,uWSGI 将 运行 来自 chdir
而不是来自当前目录。
关于socket权限问题,nginx用户(可能www-data
)没有权限访问你的个人文件夹(/home/kramer65/
)。您必须将套接字设置到另一个文件夹,nginx 和 uwsgi 可以访问该文件夹。
[编辑]
我设法通过从项目文件夹中启动 uwsgi 来加载 flask 应用程序模块。我现在遇到 nginx 没有权限访问套接字文件的问题(向下滚动到问题的末尾)。如果有人可以提供帮助..?
[/编辑]
关注 this tutorial I'm trying to run my Flask website with uWSGI and nginx。当完全按照教程所说的去做时,它工作正常。不过,我现在想要 运行 我自己的网站。我自己的网站项目结构如下:
myownproject
|-app
| -__init__.py
|-run.py
|-myownproject_nginx.conf
|-myownproject_uwsgi.ini
其中 app
像这样加载到 __init__.py
中:
app = Flask(__name__)
和 myownproject_uwsgi.ini 看起来像这样:
[uwsgi]
#application's base folder
base = /home/kramer65/myownproject
#python module to import
app = app
module = %(app)
# I disabled these lines below because I don't use a venv (please don't ask)
# home = %(base)/venv
# pythonpath = %(base)
#socket file's location
socket = /home/kramer65/myownproject/%n.sock
#permissions for the socket file
chmod-socket = 666
#the variable that holds the flask application inside the imported module
callable = app
#location of log files
logto = /var/log/uwsgi/%n.log
但是当我运行这个:
$ uwsgi --ini /home/kramer65/myownproject/myownproject_uwsgi.ini
[uWSGI] getting INI configuration from /home/kramer65/myownproject/myownproject_uwsgi.ini
我在 /var/log/uwsgi/myownproject_uwsgi.log
中得到以下日志:
*** Operational MODE: single process ***
ImportError: No module named app
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
为什么 uwsgi 找不到我的可调用函数?为什么 mountpoint
是空的 (=''
)?我在这里做错了什么?
有人知道我怎样才能让它正常工作吗?
[编辑]
好的,我在 myownproject
项目文件夹中尝试了 运行ning uwsgi --ini /home/kramer65/myownproject/myownproject_uwsgi.ini
,这解决了这个问题;它现在找到了可调用的并且似乎工作正常。
虽然我仍然得到 502,下一个问题似乎是 nginx 没有对套接字文件的权限的权限问题。 /var/log/nginx/error.log
说:
2015/10/27 11:40:36 [crit] 14276#0: *1 connect() to unix:/home/kramer65/myownproject/myownproject_uwsgi.sock failed (13: Permission denied) while connecting to upstream, client: 80.xxx.xxx.xxx, server: localhost, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/kramer65/myownproject/myownproject_uwsgi.sock:", host: "52.xx.xx.xxx"
所以我将 chmod-socket = 666
更改为 chmod-socket = 777
。在执行 ls -l
时,我实际上看到套接字文件具有完全权限,但我仍然收到上面粘贴的错误。
有什么想法可以让它发挥作用吗?
base
配置只是一个内部变量。您注释掉的部分导致了您的问题。
如果您不想使用 virtualenv 并设置您的 pythonpath,请将 base
配置更改为 chdir
。
chdir = /home/kramer65/myownproject
在内部,uWSGI 将 运行 来自 chdir
而不是来自当前目录。
关于socket权限问题,nginx用户(可能www-data
)没有权限访问你的个人文件夹(/home/kramer65/
)。您必须将套接字设置到另一个文件夹,nginx 和 uwsgi 可以访问该文件夹。