tập lệnh init mới được giám sát cho Apache?


16

Tôi muốn chạy apache trên Ubuntu 10.04 và sử dụng công cụ giám sát tuyệt vời khi mới bắt đầu như thế).

Có ai có cấu hình khởi động để giám sát apache trên Ubuntu 10.04 không?

Các Google không giúp được gì cho tôi, nhưng có thể là google-fu của tôi yếu.


2
Tôi cũng muốn biết về điều này. Tôi lưu trữ rất nhiều thứ (chủ yếu là các quy trình Django) và muốn bỏ các tập lệnh init mong manh của tôi cho một cái gì đó mạnh mẽ hơn một chút. Chưa được xem là mới bắt đầu nhưng nếu nó hoạt động ...
Oli

1
Tôi nên nói, phương pháp giám sát bình thường của tôi là sử dụng daemontools. Tôi hơi ngạc nhiên rằng trong thế giới mới nổi của Ubuntu, không ai đã sử dụng giám sát dịch vụ mới nổi, theo như tôi có thể nói trong sự googling của mình. Tôi đã mong đợi nó là một vấn đề được giải quyết.
Ben Williams

Câu trả lời:


10

Woooo!

Tôi đã viết phiên bản của riêng tôi hoạt động khá nhiều - với một số hack tập tin conf và sử dụng -D NO_DETACH.

Đầu tiên, tôi đã phải thiết lập User, GroupPidFiletrong /etc/apache2/apache2.conftay, chứ không phải là có họ đến từ /etc/apache2/envvars. Tôi không thể tìm ra cách để các vars đó được xuất đúng cách (tôi đã thử cả hai envexporttheo http://manpages.ub Ubuntu.com/manpages/lucid/man5/init.5.html , nhưng không tốt).

root@lucid:/etc/apache2# diff -u apache2.conf.orig apache2.conf
--- apache2.conf.orig   2010-09-20 13:46:33.857868534 +0930
+++ apache2.conf        2010-09-20 13:47:22.377842204 +0930
@@ -63,7 +63,7 @@
 # identification number when it starts.
 # This needs to be set in /etc/apache2/envvars
 #
-PidFile ${APACHE_PID_FILE}
+PidFile /var/run/apache2.pid

 #
 # Timeout: The number of seconds before receives and sends time out.
@@ -142,8 +142,8 @@
 </IfModule>

 # These need to be set in /etc/apache2/envvars
-User ${APACHE_RUN_USER}
-Group ${APACHE_RUN_GROUP}
+User www-data
+Group www-data

 #
 # AccessFileName: The name of the file to look for in each directory

Sau đó, đây là công việc của tôi /etc/init/apache2.conf:

# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog

description "apache2 http server"

start on runlevel [2345]
stop on runlevel [!2345]

pre-start script
    mkdir -p /var/run/apache2 || true
    install -d -o www-data /var/lock/apache2 || true
    # ssl_scache shouldn't be here if we're just starting up.
    # (this is bad if there are several apache2 instances running)
    rm -f /var/run/apache2/*ssl_scache* || true
end script

# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30

exec /usr/sbin/apache2 -D NO_DETACH
respawn

Tôi có thể làm start|stop|status|reload apache2và nhận được kết quả có ý nghĩa; Nếu tôi kill -9xử lý apache chính, nó sẽ được xử lý ngay lập tức và nó khởi động và dừng khi khởi động như mong đợi. Vì vậy, nó hoạt động hợp lý tốt, tôi nghĩ.


Có những điều tôi đã cố gắng mà tôi không thể làm việc.

  • Đã cố gắng để loại bỏ -D NO_DETACH, kết hợp với:
mong đợi ngã ba
daemon mong đợi

Điều đó không thể bắt đầu dịch vụ.

  • Đã thử sử dụng một phương thức tương tự /etc/apache2/envvarsđể điền vào các ${APACHE_*}biến:
xuất APACHE_RUN_USER = www-data
xuất APACHE_RUN_GROUP = www-data
xuất APACHE_PID_FILE = / var / run / apache2.pid

Điều đó không bắt đầu, và tạo ra một lỗi về apache2: bad user name ${APACHE_RUN_USER}.

  • Đã thử đầu ra giao diện điều khiển và các tùy chọn mặc định của bàn điều khiển; tại thời điểm này tôi thực sự chỉ lo lắng về việc cố gắng để có được thông báo lỗi có ý nghĩa. Dường như không có sự khác biệt.

    console output

  • Điều này rất hữu ích để gỡ lỗi tin nhắn apache:

    exec /usr/sbin/apache2 -X -e debug -E /var/log/apache2/foo.log

  • Đây là một nỗ lực khác để không sửa đổi /etc/apache2/apache2.confmà thất bại:

    exec APACHE_RUN_USER=www-data APACHE_RUN_GROUP=www-data APACHE_PID_FILE=/var/run/apache2.pid /usr/sbin/apache2 -D NO_DETACH -e debug -E /var/log/apache2/foo.log


Một điều cần chú ý .. 'bắt đầu trên runlevel [2345]' có thể bắt đầu trước khi giao diện mạng được định cấu hình .. vì vậy eth0 có thể "lên" nhưng nó có thể chưa sẵn sàng để sử dụng. Tương tự như vậy, bạn có thể không có bất kỳ hệ thống tập tin cục bộ. Một tiêu chuẩn được sử dụng thay thế là bắt đầu (hệ thống tập tin cục bộ và thiết bị mạng IFACE! = Lo).
SpamapS

hấp dẫn! Máy trong câu hỏi đã không được khởi động lại trong một thời gian, vì vậy tôi rất muốn thử nghiệm nó. Cảm ơn vì tiền hỗ trợ.
Ben Williams

1
Xin chào, câu hỏi tuyệt vời, câu trả lời thậm chí tốt hơn :) Bạn có thể nhận được các envv hoạt động như sau: script. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH kịch bản kết thúc
Martin Carpenter

5

Vâng, kịch bản này đã làm việc cho tôi:

# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog

description "apache2 http server"

start on runlevel [2345]
stop on runlevel [!2345]

pre-start script
    mkdir -p /var/run/apache2 || true
    install -d -o www-data /var/lock/apache2 || true
    # ssl_scache shouldn't be here if we're just starting up.
    # (this is bad if there are several apache2 instances running)
    rm -f /var/run/apache2/*ssl_scache* || true
end script

limit cpu 300 300
env APACHE_RUN_USER=www-data
env APACHE_RUN_GROUP=www-data
env APACHE_PID_FILE=/var/run/apache2.pid

# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30

exec /usr/sbin/apache2 -D NO_DETACH
respawn

3

Tôi cũng gặp phải vấn đề này, tuy nhiên tôi đã sử dụng một cách tiếp cận khác. Cách dễ nhất để có được các biến env là sử dụng lệnh nguồn và trỏ nó vào tệp envvars apache, sau đó bạn có thể chạy apache với các tùy chọn -D FOREGROUND

vì vậy về cơ bản, bạn cần một tập lệnh trông như thế này (của tôi nằm trong /etc/apache2/apache2_forground.sh):

#!/bin/bash

read pid cmd state ppid pgrp session tty_nr tpgid rest < /proc/self/stat
trap "kill -TERM -$pgrp; exit" EXIT TERM KILL SIGKILL SIGTERM SIGQUIT


source /etc/httpd/envvars
apache2 -D FOREGROUND

Sau đó, bạn làm cho nó có thể thực thi được và hướng người giám sát đến vị trí của nó, bạn cũng cần sử dụng điểm dừng 6

command=/etc/apache2/apache2_foreground.sh
stopsignal=6

Hai dòng đầu tiên trong tập lệnh bắt ID nhóm quy trình của tập lệnh và đặt bẫy chạy theo tín hiệu được truyền cho quy trình - bẫy này thực hiện lệnh giết với ID tiến trình phủ định của cha mẹ chạy tất cả các quy trình apache2 (tập lệnh chính nó) - giết chết với một bộ lọc âm có nghĩa là giết tất cả những đứa trẻ của quá trình đó cũng như vậy (vì vậy trong trường hợp này tất cả các quy trình apache2), mà không có điều gì tôi không thể làm cho người giám sát giết các quy trình apache2

Stopignal 6 được sử dụng vì tôi không thể phạt bất kỳ tín hiệu nào khác có thể gọi bẫy, 9 không thể bị bắt và 2 và 3 không làm gì cả (kịch bản không bị giết)

sau đó nó sẽ hoạt động trơn tru, không có sửa đổi cấu hình apache2 nào


2

Vài bài đăng của Scott James Remnant về chủ đề mà tôi hy vọng có thể giúp bạn:


OK, vì vậy họ đi vào một số lịch sử về việc bắt đầu giám sát daemon và một số chi tiết đẫm máu. Nó vẫn không phải là một kịch bản cho apache mới được giám sát, và, có nhiều chi tiết hơn trong tài liệu mới nổi. Tôi nghi ngờ câu trả lời cuối cùng cho vấn đề này sẽ là "tự viết".
Ben Williams

0

Ồ, vâng, điển hình là câu trả lời sẽ được viết bởi chính bạn, vì vậy gợi ý điển hình phù hợp của tôi sẽ là tham khảo trang Bắt đầu - mới bắt đầu và loại cách xa.

Tôi hy vọng ai đó hiểu biết nhiều hơn về vấn đề này hơn là tôi đưa ra một kịch bản mới nổi.


0

Tôi sẽ sử dụng một cách tiếp cận giống như của Ben Williams nhưng -D FOREGROUNDthay vì -D NO_DETACH.

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.