我有一个Flask
应用程序通过uwsgi
运行,由nginx
提供服务,全部由supervisord
控制
我已将/etc/supervisor.conf
中的user
参数设置为user=webdev
在../myapp/uwsgi_app.ini
和{uid=webdev
和{
问题是,我的应用程序有权限问题。在我的一个视图中使用以下print
语句,我发现应用程序正在以root
的形式运行。这会导致需要创建目录的函数调用出现问题。在
以下所有print语句都位于Flask
视图中。在
print 'group!! {}'.format(os.getegid())
print 'user id!! {}'.format(os.getuid())
print 'user!! {}'.format(os.path.expanduser('~'))
结果。。。在
^{pr2}$编辑:我添加了以下打印语句:
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
这很奇怪,因为通常您在以
root
身份运行时不会出现任何权限问题(实际上相反,在这种情况下,您拥有的权限可能会超过所需的权限)。在我觉得您可能是以}。你能试着叫
webdev
的身份运行进程,而不是{os.getuid()
而不是os.expanduser()
吗?在当没有为用户设置主目录时,
/root
目录通常用作默认目录。您还可以检查您的/etc/passwd/
中的webdev
条目,查看主目录设置为什么。在如果您不是以
root
身份运行,那么您的权限问题可能与其他问题有关(可能webdev
不是您正在写入的目录的所有者?)。在编辑:如果希望用户
webdev
有一个正确的主目录,请以root
的形式运行以下命令:之后,
os.expanduser()
应该显示正确的主目录。 在编辑2:我错误地假设
webdev
不是一个普通用户,而是一个配置最少的服务用户名,比如您使用的www
。我的错误。在无论如何,正如我在评论中提到的,重要的是你的
uid
值。您没有以root用户身份运行,因为您的uid
不是0。在UNIX术语中,其他的都不重要。在但我想我已经想好了。当您指定}。这将解释您看到的行为:环境仍然是为}必须仍然指向
uid
&;gid
选项时,uWSGI的工作方式是,它最初仍然以root
的形式运行,但立即调用setuid()
放弃其特权并切换到您提供的uid
和{root
配置的,即使uWSGI现在以webdev
的形式运行,$USER
和{root
。在您可以尝试通过在烧瓶视图中添加以下行来测试:
^{pr2}$这将在webdev的主目录中创建一个空文件。现在以
webdev
身份登录,转到/home/webdev
并执行ls -l
。如果testfile
的所有者是webdev
,那么您将以webdev
的身份运行。在如果您可以建立它,那么您所要做的就是编写所有代码,假设}设置错误。我不确定它将如何影响您的代码,但请尝试,例如,避免相对路径(可能假设默认目标是错误的主目录)。在
$HOME
和{相关问题 更多 >
编程相关推荐