我有一个Flask
个应用uwsgi
通过nginx
投放,全部由supervisord
控制
我已将user
中的/etc/supervisor.conf
参数设置为user=webdev
在../myapp/uwsgi_app.ini
和/etc/uwsgi/emperor.ini
中,我设置了uid=webdev
和gid=www-data
问题是,我在我的应用中遇到了权限问题。在我的一个视图中使用以下print
语句,我发现该应用程序正在以root
运行。这导致函数调用中出现需要创建目录的问题。
以下所有打印语句都位于Flask
视图中。
print 'group!! {}'.format(os.getegid())
print 'user id!! {}'.format(os.getuid())
print 'user!! {}'.format(os.path.expanduser('~'))
导致......
group!! 1000
user id!! 1000
user!! /root
编辑:我添加了以下打印语句:
from subprocess import call
print 'here is user',
call('echo $USER', shell=True)
print 'here is home',
call('echo $HOME', shell=True)
打印
here is user root
here is home /root
在服务器上的终端中,我输入$ id
,我得到uid=1000(webdev) gid=1000(webdev) groups=1000(webdev)
以下是$ getent group
root:x:0:
...
webdev:x:1000:
...
www-data:x:1001:nginx
nginx:x:996:nginx
...
以下是/etc/passwd
webdev:x:1000:1000::/home/webdev:/bin/bash
答案 0 :(得分:1)
这很奇怪,因为通常在以root
身份运行时您不会遇到任何权限问题(事实上相反,在这种情况下,您拥有的权限超过了必要的权限)。
我觉得您可能正在以webdev
而不是root
运行该流程。您可以尝试拨打os.getuid()
而不是os.expanduser()
吗?
当没有为用户设置主目录时,/root
目录通常用作默认目录。您还可以查看/etc/passwd/
的{{1}}条目,了解主目录的设置。
如果您未以webdev
身份运行,则您的权限问题可能与其他内容有关(可能root
不是您正在撰写的目录的所有者在?)。
编辑:如果您希望用户webdev
拥有正确的主目录,请运行以下webdev
:
root
之后, mkdir -p /home/webdev
usermod -m -d /home/webdev webdev
应显示正确的主目录。
编辑2:我错误地认为os.expanduser()
不是普通用户,而只是您正在使用的最低配置服务用户名,例如webdev
。我的错。
无论如何,正如我在评论中提到的那样,重要的是你的www
值。您没有以root用户身份运行,因为uid
不是0.在UNIX术语中没有其他问题。
我认为我想出来了。指定uid
&时,uWSGI的工作方式uid
选项最初仍以gid
运行,但会立即致电root
以取消其权限并切换到您提供的setuid()
和uid
。这可以解释您所看到的行为:仍然为gid
配置了环境,即使uWSGI现在以root
运行,webdev
和$USER
也必须仍然指向$HOME
。
您可以尝试通过在Flask视图中添加此行来测试它:
root
这将在webdev的主目录中创建一个空文件。现在以[{1}}身份登录,转到open('/home/webdev/testfile', 'a').close()
并执行webdev
。如果/home/webdev
的所有者为ls -l
,您就会以testfile
的身份运行。
如果您可以确定,那么您必须做的就是编写所有代码,假设webdev
和webdev
设置错误。我不确定它会如何影响您的代码,但请尝试避免相对路径(可以假设默认目标是您错误的主目录)。