非 root Web 应用程序应该在 ubuntu 下将其日志写入哪里?

非 root Web 应用程序应该在 ubuntu 下将其日志写入哪里?

我有一个 python 应用程序,出于安全目的,它在 下执行www-data(而不是 下root)。其中一个进程可以生成特定于应用程序的日志文件,我想将此文件放在某个地方。正如我注意到的,/var/logroot所有者和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/

相关内容