我有一个 python 应用程序,出于安全目的,它在 下执行www-data
(而不是 下root
)。其中一个进程可以生成特定于应用程序的日志文件,我想将此文件放在某个地方。正如我注意到的,/var/log
有root
所有者和drwxr-xr-x
权限,所以我的非root
应用程序无法在此处写入日志。在这种情况下,写入日志的正确位置是什么?我需要删除www-data
包含日志的主文件夹(如~/.myapp.log
)还是有一些惯用的解决方案可用?
答案1
这就是/dev/log
目的。您可以配置 syslog 守护程序,将来自应用程序的消息重定向到您喜欢的任何文件。
从 python 来说,这应该很简单,只需调用
syslog.syslog
。
答案2
您的应用可能不应以 的身份运行www-data
。为其创建一个新的系统用户(--system
如果您正在使用,则为选项adduser
)并将其文件放在 下/srv/yourapp
。然后,您可以为其创建一个日志目录,例如/var/log/yourapp
,或将日志保存在 中/srv/yourapp/logs
。
这样,您的 Web 服务器将以 身份运行www-data
,您的应用将以 身份运行yourapp
,并且您可以从 root 身份启动两者。例如,使用 nginx 并user www-data;
在其配置中使用选项,并使用适当的
uid = yourapp
gid = yourapp
在 中 yourapp 的 .ini 配置中/etc/uwsgi/apps-enabled/
。uWSGI 配置反映了 nginx 配置的样式。你在 中创建应用程序配置文件/etc/uwsgi/apps-available/
并将它们符号链接到/etc/uwsgi/apps-enabled/
。其他一切都应由你的发行版处理。
据我所知,这是规范的方法。至少对于 Ubuntu 和 python webapps 来说是这样。它使一般管理更简单:启动脚本应该按预期工作,无需任何特殊的自定义编辑,更新不应该破坏任何东西……通常的好处。
作为一个更具体的例子,我在 Ubuntu 上的 nginx 后面有一个 MoinMoin wiki 作为 uWSGI 应用程序运行。
来自 nginx 站点:
location = /wiki { return 301 /wiki/; }
location /wiki/ {
gzip off;
include uwsgi_params;
uwsgi_param SCRIPT_NAME /wiki;
uwsgi_modifier1 30;
uwsgi_pass unix:/run/uwsgi/app/moin/socket;
}
来自 uWSGI moin.ini:
[uwsgi]
uid = moin
gid = moin
plugins = python
wsgi-file = /usr/share/moin/server/moin.wsgi
master = true
chmod-socket = 666
processes = 1
所有其他设置完全默认(usr/share/uwsgi/conf/default.ini
对我来说)
MoinMoin有自己独立的用户
# grep moin /etc/passwd
moin:x:109:111::/srv/moin:/bin/false
并且,因为它像其他所有东西(nginx、uwsgi)一样从存储库安装,所以其余的配置在/etc/moin/
。