[英]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中的權限,為什么?
非常感謝你提前,
我希望這個問題能幫助別人。
干杯,邁克
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...
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日志記錄定向到stderr
或stdout
以便在Apache錯誤日志中捕獲它。 不要像使用Apache日志文件那樣創建單獨的日志文件,日志文件輪換之類的內容將自動為您處理。 有關示例,請參閱“Logging of Python exceptions”中的:
確保為VirtualHost
配置Apache的單獨錯誤日志,以便將站點的日志記錄單獨保存到主Apache錯誤日志中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.