簡體   English   中英

apache2使用什么權限/用戶來編寫django日志

[英]What permission/user does apache2 use to write django logs

我有一個非常好的問題,我想請專家為我評論一下。 (也許格雷厄姆·杜普頓)

所以我有一個Django Web應用程序(在ubuntu 16.04上開發),它在/var/log/apache2/APPNAME.log中發現了一些失敗。

因為/ var / log / apache2中的所有文件都有root:adm owner,我以同樣的方式授予了我的日志文件的所有權,並確保www-data是adm組的成員。 然后我將rwx授予了所有者組的adm組,我測試了一切正常。

24小時后,文件和父文件夾的權限已更改,我可以看到寫入權限已從日志文件和父目錄中撤消,導致權限被拒絕錯誤,因為無法寫入日志文件。

如果您能提供幫助,以下是我的問題:

1)放置Django日志文件的正確位置在哪里?

2)用戶權限寫入文件的過程是什么?

3)哪個進程重置/ var / log / apache中的權限,為什么?

非常感謝你提前,

我希望這個問題能幫助別人。

干杯,邁克

views.py

from django.shortcuts import render
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django import forms
from django.core.mail import send_mail, EmailMessage
from StudioHanel.forms import ContactForm

import traceback
import time

# import the logging library
import logging
import sys

# Get an instance of a logger
#logger = logging.getLogger('APPNAME')

def contact(request):
    logger.debug('Contact Start!') 

    if request.method == 'POST':
        etc...

settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },

    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },

        'applogfile': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': os.path.join('/var/log/apache2', 'APPNAME.log'),
            'maxBytes': 1024*1024*15,  15MB
            'backupCount': 10,
        },


     },

    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'APPNAME': {
            'handlers': ['applogfile',],
            'level': 'DEBUG',
        },
    }
}

1)放置Django日志文件的正確位置在哪里?

最近我在django-users郵件列表中開始討論用於Django項目的目錄,我得出結論,沒有標准的做法。 我已決定使用/var/log/django-project-name

在任何情況下, /var/log/apache2都是錯誤的地方,因為你發現了問題, logrotate會干擾。 更多關於以下內容。

2)用戶權限寫入文件的過程是什么?

如果你使用Gunicorn,它的gunicorn過程中,如果你使用uWSGI,這是uwsgi 從您對Graham Dumpleton的引用來看,您使用的是mod_wsgi。 所以這個過程就是mod_wsgi守護進程。

這些進程正在寫入文件的用戶是進程運行的用戶。 對於mod_wsgi,您可以為WSGIDaemonProcess指令指定user選項。 根據其文檔 ,“如果未提供此選項,則守護程序進程將作為Apache運行子進程的相同用戶運行,並且由User指令定義。” 在Ubuntu中,這是www-data 我認為使用user選項並將守護程序作為不同的專用用戶運行是個好主意。

您不應該將www-data添加到adm組。 adm組是有權讀取日志文件的人。 www-data不應該有這樣的權限。 (讀取和寫入自己的日志文件很好,但你不希望它有權讀取/var/log/syslog 。)

3)哪個進程重置/ var / log / apache中的權限,為什么?

它是logrotate ,由cron運行; 請參閱/etc/cron.daily/logrotate /etc/logrotate.d/apache2的配置操作與/var/log/apache2/*.log匹配的所有文件。 logrotate的主要目的是旋轉日志。 也就是說,它每天創建一個新的日志文件,昨天的名稱為access.log.1 ,在昨天的access.log.2.gz之前,依此類推,並刪除超過某些天的日志。 這樣做是為了節省空間並保持日志可管理。 如果文件錯誤, logrotate也會修復文件的權限。

理論上你應該配置logrotate來旋轉你的Django項目的日志,否則它們最終可能會填滿磁盤。

對於mod_wsgi,最好將Python日志記錄定向到stderrstdout以便在Apache錯誤日志中捕獲它。 不要像使用Apache日志文件那樣創建單獨的日志文件,日志文件輪換之類的內容將自動為您處理。 有關示例,請參閱“Logging of Python exceptions”中的:

確保為VirtualHost配置Apache的單獨錯誤日志,以便將站點的日志記錄單獨保存到主Apache錯誤日志中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM