Tại sao logrotate gây ra lỗi Apache mỗi lần?


15

Mỗi lần logrotatechạy Apache / 2.4.7 (Ubuntu) đều gặp lỗi seg và không khởi động lại:

[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

Kịch bản logrotate apache của tôi trông giống như:

/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
}

Tôi giữ các bản ghi mặc định trong /var/log/apache2, nhưng tôi giữ các bản ghi cụ thể vhost (đối với ba vhosts khác nhau được lưu trữ trên máy chủ này) trong /srv/apache/logthư mục (ví dụ mysite1_error.log, mysite1_access.log, mysite2_error.log, mysite2_access.log....).

Các phần có liên quan của /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

nơi export APACHE_LOG_DIR=/var/log/apache2$SUFFIX. Trong các tập tin conf vhost của tôi, chẳng hạn như /etc/apache2/sites-enabled/mysite1.conftôi có:

#/etc/apache2/sites-enabled/mysite1.conf
LogLevel debug
ErrorLog  /srv/apache/log/mysite1_error.log
CustomLog /srv/apache/log/mysite2_access.log combined

và tương tự cho các trang web khác.

Bất cứ ai cũng biết tại sao logrotate gây ra vụ tai nạn này?

Một điều nữa:

Buộc thủ công logrotate như root:

logrotate -v -f /etc/logrotate.d/apache2

không gây ra lỗi seg, nhưng tôi biết đó là logrotate vì tôi đã thử chơi với thời gian (hàng tuần, hàng ngày) và lỗi seg luôn xảy ra chính xác khi các bản ghi chỉ được xoay.

Cách sản xuất theo yêu cầu

# 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

Cuối cùng

Nếu tôi nhận xét /srv/apache/log/*.logkhối xoay trong /etc/logrotate.d/apachelỗi seg cũng không xảy ra.


Hình thành thông báo lỗi có vẻ như /usr/sbin/apachectl gracefullà người vi phạm (trong các tập lệnh lý thuyết trong /etc/logrotate.d/httpd-prerotate cũng là ứng cử viên). Bạn có thể xác nhận bằng cách chạy /usr/sbin/apachectl gracefulthủ công? Có thêm gợi ý nào khi điều này xảy ra trong lỗi toàn cầu của Apache (hoặc syslog toàn cầu) không, có thể khi bạn tăng LogLevel không chỉ trong <Virtualhost> mà còn trên toàn cầu?
Nils Toedtmann

/usr/sbin/apachectl gracefulthủ công ở dòng cmd không gây ra vấn đề gì (Cũng lưu ý rằng dòng này ban đầu /etc/init.d/apache2 reload > /dev/nullnhưng sau khi gặp lỗi seg, tôi đã đổi thành apachectllời khuyên tôi đọc trực tuyến, rõ ràng là nó không sửa được mọi thứ). LogLevel đã ở mức cao nhất có thể trên toàn cầu, trace8được đặt trong apache.conftệp.
fpghost

Và chỉ để loại trừ nó: /etc/logrotate.d/httpd-prerotatekhông tồn tại.
fpghost

Điều này thường được gây ra bởi một mô-đun không tắt đúng cách. Bạn đang sử dụng bất kỳ mô-đun kỳ lạ? Có gì thêm gần đây không? Mô-đun của bên thứ 3? Hãy thử vô hiệu hóa chúng.
Giovanni Tirloni

Vì vậy, việc /usr/sbin/apachectl gracefulgây ra một segfault khi được phát hành bởi logrotate, nhưng không phải khi được phát hành thủ công? Odd
Nils Toedtmann

Câu trả lời:


13

Có vẻ như nếu tôi chỉ thay đổi tập lệnh logrotate thành một khối duy nhất, tức là /var/log/apache2/*.log, /srv/apache/logs/*.log {....}tôi không nhận được segfault. Vì vậy, chỉ có hai khối đã gây ra lần thử khởi động lại thứ hai trong lần khởi động lại đầu tiên ...

Nếu tôi nhập apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &vào dòng cmd, hệ thống của tôi sẽ bị segfault, dường như xác nhận


1
Tôi có vấn đề chính xác này, nhưng chỉ có một khối trong tập lệnh logrotate của tôi bắt đầu. Có ý kiến ​​gì không?
kontextify
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.