Назад | Перейти на главную страницу

Где некорневое веб-приложение должно вести журнал под Ubuntu?

У меня есть приложение на Python, которое выполняется под www-data в целях безопасности (не под root). Один из процессов может генерировать файл журнала для конкретного приложения, и я хочу где-нибудь разместить этот файл. Как я заметил, /var/log имеет root владелец и drwxr-xr-x права, так что мои не-root приложение не может писать здесь журнал. Как правильно вести журнал в этом случае? Мне нужно мусор www-data домашняя папка с журналами (например, ~/.myapp.log) или есть какое-то идиоматическое решение?

Это то что /dev/log для. Вы можете настроить демон syslog для перенаправления сообщений из вашего приложения в любой файл, который вам нравится.

Из python это должно быть так же просто, как позвонить syslog.syslog.

Ваше приложение, вероятно, не должно работать как www-data. Создайте для него нового пользователя системы - --system вариант, если вы используете adduser - и поместите его файлы в /srv/yourapp. Затем вы можете создать для него каталог журнала, например /var/log/yourapp, или ведите логи /srv/yourapp/logs.

Таким образом, ваш веб-сервер работает как www-dataваше приложение работает как yourapp, и вы можете запустить оба из root. Например, используя nginx с опцией user www-data; в своей конфигурации и запускать ваше приложение как приложение uWSGI (это сервер контейнера приложений) с соответствующим

uid = yourapp
gid = yourapp

в конфигурации .ini для yourapp в /etc/uwsgi/apps-enabled/. Конфигурация uWSGI отражает стиль конфигурации nginx. Вы создаете профили приложений в /etc/uwsgi/apps-available/ и символически связать их с /etc/uwsgi/apps-enabled/. Все остальное должно обрабатываться вашим дистрибутивом.

Насколько я могу судить, это канонический подход. По крайней мере, для веб-приложений Ubuntu и python. И это упрощает общее администрирование: сценарии запуска должны работать, как задумано, без каких-либо специальных изменений, обновления ничего не должны ломать ... обычные преимущества.

В качестве еще более конкретного примера у меня есть вики MoinMoin, работающая как приложение uWSGI за nginx в Ubuntu.

С сайта 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/.