ทุกครั้งที่logrotate
รัน Apache / 2.4.7 (Ubuntu) จะพบกับข้อผิดพลาดของ seg และไม่รีสตาร์ท:
[Wed Sep 10 06:35:54.266018 2014] [mpm_event:notice] [pid 20599:tid 140630283466624] AH00493: SIGUSR1 received. Doing graceful restart
[Wed Sep 10 06:35:54.885118 2014] [core:notice] [pid 20599] AH00060: seg fault or similar nasty error detected in the parent process
สคริปต์ logrotate ของ apache ของฉันดูเหมือนว่า:
/var/log/apache2/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/usr/sbin/apachectl graceful
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
}
/srv/apache/log/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/usr/sbin/apachectl graceful
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
}
ฉันเก็บบันทึกค่าเริ่มต้นใน/var/log/apache2
แต่ฉันเก็บบันทึกเฉพาะ vhost (สำหรับสาม vhosts ที่แตกต่างกันเป็นเจ้าภาพบนเซิร์ฟเวอร์นี้) ใน/srv/apache/log
ไดเรกทอรี (เช่นmysite1_error.log
, mysite1_access.log
, mysite2_error.log
, mysite2_access.log
.... )
ส่วนที่เกี่ยวข้องของ/etc/apache2/apache.conf
:
#/etc/apache2/apache.conf
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel trace8 # I set to try and get more info about this problem.
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
export APACHE_LOG_DIR=/var/log/apache2$SUFFIX
ที่ไหน ในไฟล์ vhost conf ของฉันเช่น
/etc/apache2/sites-enabled/mysite1.conf
ฉันมี:
#/etc/apache2/sites-enabled/mysite1.conf
LogLevel debug
ErrorLog /srv/apache/log/mysite1_error.log
CustomLog /srv/apache/log/mysite2_access.log combined
และคล้ายกับไซต์อื่น ๆ
ใครรู้ว่าทำไม logrotate ทำให้เกิดความผิดพลาดนี้
อีกหนึ่งสิ่ง:
บังคับให้ logrotate ด้วยตนเองเป็น root:
logrotate -v -f /etc/logrotate.d/apache2
ไม่ได้ทำให้เกิดความผิดพลาดของ seg แต่ฉันรู้ว่ามันเป็น logrotate ในขณะที่ฉันพยายามเล่นกับเวลา (รายสัปดาห์รายวัน) และความผิดของ seg เกิดขึ้นเสมอเมื่อบันทึกถูกหมุนเท่านั้น
วิธีการทำซ้ำตามความต้องการ
# Set a crontab to run each minute (simulating cron.daily run of logrotate)
crontab -e
*/1 * * * * root /usr/sbin/logrotate -v -f /etc/logrotate.d/apache2 > /home/myuser/logrotate.log 2>&1
ในที่สุด
ถ้าฉันใส่ความคิดเห็น/srv/apache/log/*.log
บล็อกการหมุนใน/etc/logrotate.d/apache
ข้อผิดพลาด seg จะไม่เกิดขึ้นเช่นกัน
/usr/sbin/apachectl graceful
ด้วยตนเองที่บรรทัด cmd ทำให้ไม่มีปัญหา (โปรดทราบว่าสายนี้เดิม/etc/init.d/apache2 reload > /dev/null
แต่หลังจากได้รับข้อผิดพลาด seg ฉันเปลี่ยนไปapachectl
ตามคำแนะนำฉันอ่านออนไลน์เห็นได้ชัดว่ามันไม่ได้แก้ไขสิ่งต่าง ๆ ) LogLevel นั้นมีความเป็นไปได้สูงที่สุดทั่วโลกซึ่งtrace8
ตั้งอยู่ในapache.conf
ไฟล์
/etc/logrotate.d/httpd-prerotate
ไม่มีอยู่
/usr/sbin/apachectl graceful
จะทำให้เกิด segfault เมื่อออกโดย logrotate แต่ไม่เมื่อออกด้วยตนเอง? Odd
/usr/sbin/apachectl graceful
เป็นผู้กระทำความผิด (ในทฤษฎีสคริปต์ภายใน /etc/logrotate.d/httpd-prerotate ก็เป็นผู้สมัครด้วย) คุณสามารถยืนยันด้วยการรัน/usr/sbin/apachectl graceful
ด้วยตนเองได้หรือไม่ มีคำแนะนำเพิ่มเติมอีกหรือไม่เมื่อสิ่งนี้เกิดขึ้นในบันทึกข้อผิดพลาดส่วนกลางของ Apache (หรือ syslog ทั่วโลก) บางทีเมื่อคุณเพิ่ม LogLevel ไม่เพียง แต่ใน <VirtualHost> แต่ทั่วโลก?