У меня есть приложение на 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/
.