Ошибка разрешения при работе с журналами Django в продакшене
При попытке применить конфигурацию логирования к моему Django проекту на рабочем сервере, сайт возвращает ошибку шлюза 502 и sudo journalctl -u gunicorn показывает следующее Permission denied: '/home/logs/MySite.log' error. Тот же самый конфиг работает на сервере staging и работает (используя тот же debug=false, gunicorn/nginx setup, не используя никаких настроек разработки, таких как ./manage.py runserver или debug=true). Единственная разница, о которой я знаю, заключается в том, что сервер staging обслуживается через http, а не https. Может ли кто-нибудь помочь исправить ошибку с разрешениями и запустить логирование на продакшене? Заранее спасибо!
Ошибка
Конфигурация протоколирования, отладка установлена на false
DEBUG = False
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt' : "%d/%b/%Y %H:%M:%S"
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
'level': 'WARNING',
'class': 'logging.FileHandler',
'filename': '/home/logs/MySite.log',
'formatter': 'verbose'
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'WARNING',
},
'mapApp': {
'handlers': ['file'],
'level': 'DEBUG'
}
},
}
Служебный файл Gunicorn:
[Unit] Description=Gunicorn daemon Requires=gunicorn.socket After=network.target
[Service] User=my_username Group=my_username WorkingDirectory=/home/MySite
ExecStart=/home/my_username/.virtualenvs/mySitePython3/bin/gunicorn --access-logfile - --workers 3 --bind unix:gunicorn.sock VicMySite.wsgi
[Install] WantedBy=multi-user.target
Файл сокета Gunicorn
[Install] WantedBy=sockets.target
[Unit] Description=Gunicorn WSGI socket
[Socket] ListenStream=/run/gunicorn.sock
[Install] WantedBy=sockets.target
Nginx config
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events { worker_connections 1024; }
http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server { listen 80; server_name mysite.org; return 301 https://$host$request_uri; }
# Ignore requests for incorrect hosts instead of forwarding to Django
# https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/#debug
server { listen 80 default_server; return 444; }
# Settings for a TLS enabled server.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name mysite.org;
ssl_certificate "/home/my_username/ssl/mysite_org_chain.crt";
ssl_certificate_key "/home/my_username/ssl/mysite.key";
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/MySite;
}
location /media/ {
root /home/MySite;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
}
Перезапуск сервера после внесения изменений:
. /home/my_username/.virtualenvs/mySitePython3/bin/activate
./manage.py migrate --settings=VicMySite.settings.prod
./manage.py collectstatic --settings=VicMySite.settings.prod
./manage.py clearcache --settings=VicMySite.settings.prod
sudo systemctl restart gunicorn
То, что я пробовал до сих пор:
подтверждение того, что gunicorn запущен от имени пользователя my_username (1. он есть в файле сокета, 2. когда я разрешил Django создать файл журнала, владелец и группа - оба my_username, 3. ps aux | grep gunicorn показывает процесс, запущенный от имени my_username)
>подтверждение того, что каталог 'logs' и файл 'MySite.log' имеют пользователя my_username как владельца, так и группу. установил для обоих chmod 777 временно, чтобы посмотреть, помогло ли это с ошибкой разрешений (не помогло)
.временно отключил selinux с помощью sudo setenforce 0
.