その他
    ホーム 技術発信 DoRuby Apacheのrestartやgraceful、stopなどの違い

    Apacheのrestartやgraceful、stopなどの違い

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    apachectlのrestartやgraceful、
    httpdのrestartやgraceful、
    /etc/init.d/httpdのrestart…、
    それぞれの微妙な違いをまとめました。

    apachectl graceful
    httpd -k graceful※どちらも同じ。
    apachectl gracefulを実行すると、内部でhttpd -k gracefulが呼ばれる(後述)
    子プロセスは現在のリクエストを処理した後、終了する。親プロセスは設定ファイルを再読み込みし、ログファイルを開き直す。子プロセスが徐々になくなり、替わりに新しい子プロセスが起動する。【注意点】
    設定ファイルに誤りがあったり等で親プロセスが再起動せず終了した場合、 子プロセスが放置されたりする場合がある(→再起動時に問題となる可能性がある)
    ので、再起動前にhttpd -tで構文チェックをした方がよい。
    apachectl restart
    httpd -k restart※どちらも同じ。
    apachectl restartを実行すると、内部でhttpd -k restartが呼ばれる(後述)
    子プロセスを即座にkill。親プロセスは終了しない。親プロセスは設定ファイルを再読み込みし、ログファイルを開き直す。その後新しい子プロセスを起動。→ログを見るとHUPシグナルが渡されたことが確認できます。
    /etc/init.d/httpd restart※httpd -k restartとは別もの。
    起動スクリプト内で定義されたstop→startが実行される。
    子プロセスを即座にkillし、全て終了後、親プロセスも終了。(stop)その後起動。(start)→ログを見るとTERMシグナルが渡されたことが確認できます。※Apacheのインストールディレクトリがデフォルトと違う場合は、
    /etc/init.d/httpd 内でhttpd実行ファイルの場所を修正する必要があります。

    「apachectl restart」と「httpd -k restart」は同じ

    apachectlに特定の引数を渡すと、内部で「httpd -k 引数」が実行されます。

    特定の引数とは、
    start | stop | restart | graceful | graceful-stop
    です。

    # less apachectl
    -------------
      ・
      ・
    case $ARGV in
    start|stop|restart|graceful|graceful-stop)
        $HTTPD -k $ARGV
        ERROR=$?
        ;;
    startssl|sslstart|start-SSL)
        echo The startssl option is no longer supported.
        echo Please edit httpd.conf to include the SSL configuration settings
        echo and then use "apachectl start".
        ERROR=2
        ;;
    configtest)
        $HTTPD -t
        ERROR=$?
        ;;
    status)
        $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } '
        ;;
    fullstatus)
        $LYNX $STATUSURL
        ;;
    *)
        $HTTPD $ARGV
        ERROR=$?
    esac
    
    exit $ERROR
    -------------
    

    これらの引数が渡された場合は、 httpdにそのまま引数が渡され
    挙動は上記表のとおりとなります。

    また、「apachectl restart」と「apachectl -k restart」も同じです。

    「httpd -k restart」と「/etc/init.d/httpd restart」は別もの

    どちらもhttpdを再起動しますが、処理プロセス(手続き)が異なるため挙動も異なります。

    「httpd -k restart」は、httpdバイナリ(実行ファイル)内の処理によって、
    「/etc/init.d/httpd restart」は、/etc/init.d/httpd(起動スクリプト)内の処理によって
    再起動されます。

    それぞれの処理内でkillの仕方が違う(渡されるシグナルが違う)ようで、

    httpd -k restartSIGHUP
    /etc/init.d/httpd restartSIGTERM
    /etc/init.d/httpd reloadSIGHUP

    となっているようです。

    /etc/init.d/httpd は、httpd実行ファイルを起動するためのスクリプトファイルです。
    手動インストール等でインストール場所が異なる場合は/etc/init.d/httpdを編集して
    httpd実行ファイルの場所を修正する必要があります。

    詳細は公式のドキュメントに記載されています。
    https://httpd.apache.org/docs/2.2/ja/stopping.html

    【ご案内】各種イベントはこちら

    アピリッツでは、定期的に勉強会やセミナー等、各種イベントを企画・運営しています。各イベントの詳細と参加申し込みは以下リンクからご確認ください。皆様にお会いできることを楽しみにしております。

    各種イベントのお申込みはこちら

    過去のイベントの様子はこちら

    アピリッツについて

    記事を共有