ทำไม logrotate ทำให้ Apache ต้องแยกข้อบกพร่องในแต่ละครั้ง


15

ทุกครั้งที่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เป็นผู้กระทำความผิด (ในทฤษฎีสคริปต์ภายใน /etc/logrotate.d/httpd-prerotate ก็เป็นผู้สมัครด้วย) คุณสามารถยืนยันด้วยการรัน/usr/sbin/apachectl gracefulด้วยตนเองได้หรือไม่ มีคำแนะนำเพิ่มเติมอีกหรือไม่เมื่อสิ่งนี้เกิดขึ้นในบันทึกข้อผิดพลาดส่วนกลางของ Apache (หรือ syslog ทั่วโลก) บางทีเมื่อคุณเพิ่ม LogLevel ไม่เพียง แต่ใน <VirtualHost> แต่ทั่วโลก?
Nils Toedtmann

/usr/sbin/apachectl gracefulด้วยตนเองที่บรรทัด cmd ทำให้ไม่มีปัญหา (โปรดทราบว่าสายนี้เดิม/etc/init.d/apache2 reload > /dev/nullแต่หลังจากได้รับข้อผิดพลาด seg ฉันเปลี่ยนไปapachectlตามคำแนะนำฉันอ่านออนไลน์เห็นได้ชัดว่ามันไม่ได้แก้ไขสิ่งต่าง ๆ ) LogLevel นั้นมีความเป็นไปได้สูงที่สุดทั่วโลกซึ่งtrace8ตั้งอยู่ในapache.confไฟล์
fpghost

และเพื่อออกกฎ: /etc/logrotate.d/httpd-prerotateไม่มีอยู่
fpghost

ซึ่งมักจะเกิดจากโมดูลไม่ได้ปิดอย่างถูกต้อง คุณใช้โมดูลที่แปลกใหม่หรือไม่? มีอะไรเพิ่มเมื่อเร็ว ๆ นี้? โมดูลบุคคลที่สาม? ลองปิดการใช้งานพวกเขา
Giovanni Tirloni

ดังนั้น/usr/sbin/apachectl gracefulจะทำให้เกิด segfault เมื่อออกโดย logrotate แต่ไม่เมื่อออกด้วยตนเอง? Odd
Nils Toedtmann

คำตอบ:


13

ดูเหมือนว่าถ้าฉันเพิ่งเปลี่ยนสคริปต์ logrotate เป็นบล็อกเดียวนั่นคือ/var/log/apache2/*.log, /srv/apache/logs/*.log {....}ฉันไม่ได้รับ segfault ดังนั้นมันเป็นเพียงสองช่วงตึกเท่านั้นที่ทำให้เกิดการรีสตาร์ทครั้งที่สองระหว่างการรีสตาร์ทครั้งแรก ...

ถ้าฉันป้อนapache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &ในบรรทัด cmd ระบบของฉันทำ segfault ซึ่งดูเหมือนจะยืนยัน


1
ฉันมีปัญหาตรงนี้ แต่มีเพียงหนึ่งบล็อกในสคริปต์ logrotate ของฉันที่จะเริ่มต้นด้วย ความคิดใด ๆ
kontextify
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.