我试图在我的 wsgi ini 文件中使用uid
/gid
参数运行 uWsgi,以便它在启动后放弃特权访问。
注意:当我从我的 ini 文件中删除这两个参数时,一切正常。另外,我的插座没有问题。但是,当我使用指定的uid
和gid
(nginx 用户和组)运行时,我收到一个错误,表明我的虚拟环境加载有问题,
Traceback (most recent call last):
File "wsgi.py", line 14, in <module>
from app import app as application
File "/var/www/wsgi/flask-appbuilder/peds_registry/app/__init__.py", line 1, in <module>
import logging
ImportError: No module named logging
同样,在没有 gid/pid 的情况下运行时可以正常工作。另外,请注意,用户和组 nginx 都存在并且都对 python 项目的目录结构拥有所有权。
我的 Nginx 配置的服务器/位置指令如下:
server {
listen 80;
server_name hostname.domain;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name hostname.domain;
ssl_certificate /etc/ssl/certs/host.chained.crt;
ssl_certificate_key /etc/ssl/certs/host.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location /test {
include uwsgi_params;
uwsgi_pass unix:/tmp/uwsgi.sock;
}
}
我的 uwsgi 启动是:
#!/bin/sh
# chkconfig: - 99 10
FLASK_HOME=/var/www/wsgi/flask-appbuilder
export PEDS_HOME
ACTIVATE_CMD=/var/www/wsgi/flask-appbuilder/venv/bin/activate
case "$1" in
start)
cd $FLASK_HOME
source $ACTIVATE_CMD
uwsgi -s /tmp/uwsgi.sock -H ./venv/ --ini /var/www/wsgi/flask-appbuilder/test.ini --virtualenv /var/www/wsgi/flask-appbuilder/venv --chmod-socket=666 --manage-script-name --mount /test=run:app --wsgi-file wsgi.py --logto test.log &
;;
stop)
pkill uwsgi
;;
restart)
$0 stop
$0 start
;;
*)
echo "usage: $0 (start|stop|restart|help)"
esac
而我的 uWsgi 启动 ini 是:
[uwsgi]
socket = /tmp/uwsgi.sock
chdir = /var/www/wsgi/flask-appbuilder/peds_registry
wsgi-file = wsgi.py
pyhome = /var/www/wsgi/flask-appbuilder/venv
callable = app
manage-script-name = true
mount: /test=run.py
如前所述,这在没有 gid/uid 参数的情况下可以正常加载,但是当我添加
uid = nginx
gid = nginx
到ini文件,我得到上面提到的错误。
我所有的搜索都产生了套接字的权限,但我的问题似乎是从虚拟环境中加载模块。
附带说明:我正在使用从 pip 安装到我的虚拟环境中的 uWsgi。