
私はデフォルトの起動システムがrunitであるシステムを開発しています。
残念ながら、 runit は実行中のすべてのアプリケーションを次のようにフォアグラウンドで実行する必要があります。
#!/bin/bash
exec sshd -D
sv
nginxはフォアグラウンドで実行する方法を提供していないため、runitがnginxを管理し続け、runitのコマンドを使用してnginxを停止、開始、および再起動できるようにするにはどうすればよいですか?
答え1
オプションが利用可能ですdaemon off
。
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf -g "daemon off;"
~からNginx Wiki:
runit / daemontoolsを使用して本番モードでdaemon offを安全に使用できますが、通常のアップグレードは実行できません。 master_process offは本番環境で使用しないでください。
runit
コントロールを使用すると、nginx
基本プロセスの親プロセスになりますnginx
。ただし、オンラインアップグレードを試みると、nginx
基本プロセスは新しいバイナリをフォークして実行します。
新しいマスタープロセスが作成されましたが、古いマスタープロセスがまだ存在するため(制御されているためrunit
)、新しいマスタープロセスの親プロセスはinitプロセスになります。runit
新しいマスタープロセスが開始されていないため、制御できないためです。 。
答え2
実際の世界で使用されているすべての基本プロセスを終了しないでください。ダウンタイムなしのアップグレードは実行されず、サポートされていません。
ポート80などを監視するには、ページセンターを使用してください。正しい方法で行い、魔法のようなものを含めないでください。それ以外の場合、nginxはダウンタイムなしのアップグレードを実行できず、アマチュアのように見えます。
# . . .
set -e
## config - start - should move to another file
CONF='/etc/nginx/nginx.conf'
# TODO: grab below by parsing CONF
PROTO=http
IP=0.0.0.0
PORT=80
## config - end - should move to another file
case "$(uname | tr '[A-Z]' '[a-z]')" in
darwin|freebsd|netbsd|openbsd) NC_ARGS="-n -w 5 -z '${IP}' '${PORT}'" ;;
linux) NC_ARGS="-n -w 5 --send-only '${IP}' '${PORT}'" ;;
*) echo "unsupported os $(uname)" >&2; exit 1 ;;
esac
/usr/bin/nginx -t -c "${CONF}"
/usr/bin/nginx -c "${CONF}"
sleep 5
while /usr/bin/nc $NC_ARGS </dev/null >/dev/null 2>&1; do
set -e # loop runs in a subshell
/usr/bin/curl -m5 -fsS -A 'runit script/0.0.0' \
"${PROTO}"://"${IP}":"${PORT}" | \
/usr/bin/grep -q 'This comment is required'
sleep 2
done