Nginx init.dスクリプト

Nginx init.dスクリプト

昨日、私のDebianコンピュータでdistをアップグレードした後、nginx initスクリプトでいくつかの問題が発生しました。 initスクリプトを使用してnginxを起動しようとするたびに、エラーメッセージが表示されます。

# service nginx start
Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.

systemctlステータスnginx.serviceの出力:

# systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: exit-code) since Tue 2015-05-19 12:36:12 CEST; 7s ago
  Process: 14087 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 14126 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=203/EXEC)

Journalctl -xnの出力:

# journalctl -xn
systemd[1]: nginx.service never wrote its PID file. Failing.
systemd[1]: Failed to start A high performance web server and a reverse proxy server.
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit nginx.service has failed.
--
-- The result is failed.
systemd[1]: Unit nginx.service entered failed state.
systemd[14126]: Failed at step EXEC spawning /usr/sbin/nginx: No such file or directory
-- Subject: Process /usr/sbin/nginx could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /usr/sbin/nginx could not be executed and failed.
--
-- The error number returned while executing this process is 2.
systemd[1]: nginx.service: control process exited, code=exited status=203
systemd[1]: Failed to start A high performance web server and a reverse proxy server.
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit nginx.service has failed.
--
-- The result is failed.
systemd[1]: Unit nginx.service entered failed state.

私のnginxファイルはinit.dにあります。

#! /bin/sh

### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/sbin/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
    . /etc/default/nginx
fi

set -e

. /lib/lsb/init-functions

case "$1" in
  start)
    echo -n "Starting $DESC: "
    start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
        --exec $DAEMON -- $DAEMON_OPTS || true
    echo "$NAME."
    ;;
  stop)
    echo -n "Stopping $DESC: "
    start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
        --exec $DAEMON || true
    echo "$NAME."
    ;;
  restart|force-reload)
    echo -n "Restarting $DESC: "
    start-stop-daemon --stop --quiet --pidfile \
        /usr/local/nginx/logs/$NAME.pid --exec $DAEMON || true
    sleep 1
    start-stop-daemon --start --quiet --pidfile \
        /usr/local/nginx/logs/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
    echo "$NAME."
    ;;
  reload)
      echo -n "Reloading $DESC configuration: "
      start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
          --exec $DAEMON || true
      echo "$NAME."
      ;;
  status)
      status_of_proc -p /usr/local/nginx/logs/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
      ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
    exit 1
    ;;
esac

exit 0

nginxデーモンファイルが配置されます/usr/local/sbin/nginx(私がコンパイルした場所)。

これまでに試したこと:デーモンファイルを/usr/local/sbin/nginx次の場所にコピーしました。/usr/sbin/nginx

使用するservice nginx startと、nginxを起動すると停止します。ポート80に接続しようとすると機能します。だから、引き続き初期化スクリプトを編集してPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binくださいPATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/sbin:/usr/bin

私はこれまで他のことを試していませんでした。

答え1

私のnginxファイルはinit.dにあります。

…はい全く関係ない。出力を見てくださいsystemctl。表示したいファイルを正確に伝えます。

ロード済み:ロード済み(/lib/systemd/system/nginx.service;有効化)

それあなたのサービスユニットです。systemctlサービスの開始を準備するためにサービスユニットが設定した内容を通知します。

プロセス: 14126 ExecStartPre=/usr/sbin/nginx -t -q -gデーモンプロセスが開始されました。(コード=終了、ステータス=203/EXEC)

これはExecStartPreサービスユニット設定で見つけることができるものです。これを見ると、これもまったく関係がないことがわかりますPATH(これはsystemdの設計によるものです)。その雑誌は何が起こったのかをより明確に説明しました。

systemd[14126]: EXEC ビルド段階で失敗しました。 /usr/sbin/nginx: そのファイルまたはディレクトリはありません。

どのように考えても、コンピュータはサービスを起動しようとすると、/usr/sbin/nginxその名前のファイルが存在しないため、プログラムとして実行できないと思います。

私の推測は、RootDirectoryサービスデバイスに設定があるか、ファイルを次の場所/usr/sbinにコピーすることです。いいえ変更されたルート環境またはプログラム・イメージをロードするために必要ないくつかの補助共有ライブラリーが、変更されたルート環境から欠落しています。

答え2

Debian 8でも同じ問題が発生しました。私のために、私は見つけた

[date] debian systemd[1]: nginx.service never wrote its PID file. Failing.

/var/log/syslogでは、これは質問に似ています。

# journalctl -xn
systemd[1]: nginx.service never wrote its PID file. Failing.

その理由は/lib/systemd/system/nginx.serviceに私が

PIDFile=/var/run/nginx.pid

しかし、nginxが構築されているので、pidを/usr/local/nginx/log/nginx.pidに書き込みます。

回避策は/usr/local/nginx/conf/nginx.confの行を変更/追加することです。

pid        /var/run/nginx.pid;

関連情報