아파치에 대한 upstart-supervised init 스크립트?


16

우분투 10.04에서 아파치를 실행하고 시작시 멋진 감독 기능을 사용하고 싶습니다 (아파치 초기 스크립트에 대해서만 이야기하는 것이 아니라 적절한 서비스 감독 라 데몬 도구-apache가 죽었을 때 다시 시작하는 것) 그런 식으로).

누구든지 우분투 10.04에서 아파치를 감독하기 위해 실행중인 시작 구성이 있습니까?

구글은 나에게 도움이되지 않았지만 내 구글 푸가 약할 수 있습니다.


2
이것에 대해서도 알고 싶습니다. 나는 많은 것들 (주로 Django 프로세스)을 호스팅하고 취약한 init 스크립트를 조금 더 강력하게 덤프하고 싶습니다. 시작을 고려하지 않았지만 작동한다면 ...
Oli

1
필자의 일반적인 감독 방법은 daemontools를 사용하는 것입니다. 나는 새로운 upstart-ubuntu 세계에서 아무도 내 인터넷 검색에서 말할 수있는 한 upstart의 서비스 감독을 사용하지 않았다는 것에 약간 놀랐습니다. 나는 그것이 해결 된 문제 일 것으로 기대했다.
벤 윌리엄스

답변:


10

우와!

나는 conf 파일을 해킹하고 사용하여 거의 작동하는 내 자신의 버전을 작성했습니다 -D NO_DETACH.

첫번째로, 나는 세트에 있었다 User, Group그리고 PidFile/etc/apache2/apache2.conf수동보다는 그들로부터오고 있습니다 /etc/apache2/envvars. 나는 사람들을 얻을 수있는 방법을 작동하지 않을 수가 제대로 내보낼 수 바르 (나는 모두를 시도하지 env하고 exporthttp://manpages.ubuntu.com/manpages/lucid/man5/init.5.html ,하지만 좋은).

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

그런 다음 내 작업입니다 /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

start|stop|status|reload apache2의미있는 결과를 얻을 수 있습니다 . 나는 경우 kill -9마스터 아파치 프로세스, 그것은 거의 즉시 리스폰됩니다, 그리고 그것을 시작하고 예상대로 부팅을 중지합니다. 그래서 합리적으로 잘 작동하고 있습니다.


내가 일을 할 수 없다는 것을 시도했습니다.

  • -D NO_DETACH와 함께 제거하려고했습니다 .
포크를 기대하다
데몬 기대

서비스를 시작하지 못했습니다.

  • 비슷한 방법을 사용 /etc/apache2/envvars하여 ${APACHE_*}변수 를 채우려 고했습니다 .
수출 APACHE_RUN_USER = www-data
수출 APACHE_RUN_GROUP = www-data
내보내기 APACHE_PID_FILE = / var / run / apache2.pid

시작에 실패하여에 대한 오류가 발생했습니다 apache2: bad user name ${APACHE_RUN_USER}.

  • 콘솔 출력 및 콘솔 기본 옵션을 시도했습니다. 이 시점에서 나는 의미있는 오류 메시지를 얻는 것에 대해 정말로 불쾌했습니다. 차이가없는 것 같습니다.

    console output

  • 이것은 아파치 메시지를 디버깅하는 데 유용했습니다.

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

  • 이것은 /etc/apache2/apache2.conf실패한 또 다른 시도로 실패했습니다.

    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


네트워크 인터페이스가 구성되기 전에 'start on runlevel [2345]'이 (가) 시작될 수 있습니다. eth0이 "작동"상태이지만 사용 준비가되지 않은 것일 수 있습니다. 마찬가지로 로컬 파일 시스템이 없을 수도 있습니다. 대신 사용되는 하나의 표준이 시작됩니다 (로컬 파일 시스템 및 net-device-up IFACE! = lo).
SpamapS

흥미로운! 문제의 머신이 잠시 동안 재부팅되지 않았으므로 테스트를 해보고 싶습니다. 팁 고마워.
Ben Williams

1
안녕하세요, 좋은 질문, 더 나은 답변 :) envvars를 다음과 같이 작동시킬 수 있습니다 : script. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH 종료 스크립트
Martin Carpenter

5

글쎄,이 스크립트는 나를 위해 일했다 :

# 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

나는 또한이 문제를 겪었지만 다른 접근법을 사용했다. env 변수를 얻는 가장 쉬운 방법은 source 명령을 사용하여이를 apache envvars 파일로 지정하는 것입니다. 그런 다음 -D FOREGROUND 옵션을 사용하여 apache를 실행할 수 있습니다

따라서 기본적으로 다음과 같은 스크립트가 필요합니다 (광산은 /etc/apache2/apache2_foreground.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

그런 다음 실행 파일을 만들고 수퍼바이저를 해당 위치로 지정하십시오. 또한 정지 신호를 사용해야합니다.

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

스크립트의 첫 두 줄은 스크립트의 프로세스 그룹 ID를 포착하고 프로세스에 전달 된 신호에서 실행되는 트랩을 설정합니다.이 트랩은 모든 apache2 프로세스 (스크립트)를 실행하는 상위 프로세스의 부정 프로세스 ID로 종료를 실행합니다. -) 네거티브 PID로 죽이는 것은 감독자가 아파치 2 프로세스를 죽일 수 없었기 때문에 프로세스의 모든 자식을 죽이는 것을 의미합니다 (이 경우 모든 아파치 2 프로세스).

정지 신호 6은 트랩을 호출 할 수있는 다른 신호를 찾을 수 없으며 9는 잡을 수 없으며 2와 3은 아무것도하지 않으므로 사용됩니다 (스크립트는 죽지 않습니다)

그 후에는 apache2 구성을 수정하지 않고 원활하게 작동해야합니다.


2

Scott James Remnant의 몇 가지 게시물이 도움이 될만한 주제에 관한 글입니다.


자, 그들은 upstart supervisioning daemon에 대한 역사와 일부 세부 사항에 대해 이야기합니다. 여전히 upstart-supervised apache를위한 스크립트는 아니며, upstart 문서에 더 자세한 내용이 있습니다. 이것에 대한 최종 답변이 "직접 작성하십시오"라고 생각합니다.
벤 윌리엄스

0

예, 일반적으로 답은“자신의 글을 쓰십시오”입니다. 따라서 필자의 일반적인 제안은 시작하기-시작 페이지를 참조하고…

나보다 문제에 대해 더 잘 아는 사람이 작동하는 시작 스크립트를 생각해 내기를 바랍니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.