Mac の起動時に nginx を launchctl / launchd で自動起動(デーモン化)させる設定をあれこれ試行錯誤したメモ

 

nginx(えんじんえっくす)はロシアで生まれたWEBサーバーです。
”処理性能・高い並行性・メモリ使用量の小ささ”
重視で開発されているとのこと(wikipedia 2014/01/04時点)

wordpress.comやFacebookでの利用実績が有ります。

nginxの入門情報はこちらを参考に。
入門! nginx – 馬鹿と天才は紙一重

次のような書籍も出ています

ハイパフォーマンスHTTPサーバ Nginx入門

nginxでWEBサーバーを建てるにあたって
起動、停止はそれぞれ次のコマンドで実行できます。

$ nginx #起動
$ nginx -s quit #コネクションを閉じてから停止
$ nginx -c stop #コネクションが開いていても即時停止

ただこれだと、毎度起動を命令しない限りサーバーが立ち上がりません。

今回はMac起動とともに自動でnginxを起動させる設定をしましたのでそのメモです。

Mac起動時のプロセス自動起動にはlaunchctlを使います。
いつもLinuxでサーバーを立てている人にはなにそれ、ですね。

Linuxではランレベルに応じて
rcスクリプトからデーモンを起動する仕組みが有ります。
chkconfigでやるアレです。

Linuxでsshdが自動起動されるように設定されている例

$ chkconfig --list sshd
sshd           0:off	1:off	2:on	3:on	4:on	5:on	6:off

0〜6はrcスクリプト(/etc/rcX.d のX)の数字、ランレベルを表していて、
この場合標準(3)で起動状態となり、
シャットダウン時(0)と再起動時(6)にoffにされます。

# 参考 rcXが指すランレベルの一覧
0 : シャットダウンに向かう状態
1 : シングルユーザモード
2 : 使用されない
3 : 標準的な状態
4 : 使用されない
5 : GUIでログインする状態
6 : 再起動に向かう状態

ところがMacにはこういう仕組みがありません。
なんてこった∩・ω・)∩
でも無いんじゃないです。無くすことを選んだらしいです。

Macの仕組みの話はこちらを参考に。
Undocumented Mac OS X:第1回 initを置き換えるlaunchd【前編】

Mac OS X では launchd という仕組みが採用されたことで、
従来のinit.d、cron.d、xinetdなどがXMLによる単一書式で同じ場所に管理され、
サービス固有のパラメータの設定やユーザーごとのサービス管理が可能になっている様子。

確認してみたところ、例えばssh接続を受け付けるデーモンのsshdの起動設定は、
/System/Library/LaunchDaemons/com.apple.FileSyncAgent.sshd.plist
にXMLで記述されている。

nginxもこんな感じでplistを用意すれば良い。

launchdというキーワードがわかったところで検索してみると
nginxのwikiに「OSX launchd」という項目があるし、
(wiki > Configure > InitScripts > OSX launchd 2014/01/01時点)
homebrewでインストールしたnginxにはlaunchd用のplistがついてきている。
( /usr/local/opt/nginx/homebrew.mxcl.nginx.plist )

wikiに書いてあるplistとhomebrewでのインストールについてきたplistには違いがあるが、
homebrewでついてきたものをそのまま使うことにする。

homebrewでついてきたplistはこの内容だった。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.nginx</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/opt/nginx/bin/nginx</string>
        <string>-g</string>
        <string>daemon off;</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
  </dict>
</plist>

launchctlの設定項目の意味についてはこちらを参考

homebrewでついてきたplistを、launchctl用の設定ファイルを置くディレクトリにコピーする。
上記のplistのコピペではパスが異なる可能性があるので、
homebrewでインストールした方はこのコマンドでご自分のplistをコピーすることをおすすめします。
自分でビルドした、という方は上記plistのパス
(/usr/local/opt/nginx/bin/nginx)を修正して下さい。

$ sudo cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist /System/Library/LaunchDaemons

続いて任意だけれでも、コピーしたplistを一部編集。

$ sudo vi /System/Library/LaunchDaemons/homebrew.mxcl.nginx.plist

plistのLabelキーに指定されている文字列が、
Linuxでサービスを手動でコントロールするときの service 「デーモン名」 start コマンドのような、
launchctl start 「デーモン名」コマンドのデーモン名となる。
homebrew.mxcl.nginxは長いのでnginxにした。

<key>Label</key><string>homebrew.mxcl.nginx</string>

↓↓

<key>Label</key><string>nginx</string>

(編集を保存したら、)laucnchctlにplistを読みこませるには次のコマンドを使う。

$ sudo launchctl load -w /System/Library/LaunchDaemons/homebrew.mxcl.nginx.plist

loadが成功しているかは launchctl list で確認することが出来る。
$ sudo launchctl list | grep nginx
1733 - 0x7ff3306ca120.anonymous.nginx
1732 - nginx

launchctl list で確認できたら、次のコマンドがそれぞれエラー無く実行できるか確認。

sudo launchctl start nginx
sudo launchctl stop nginx

これでエラーが出なければ、
Macを再起動してhttp://localhost/にアクセスしてみる。
何もしていなくても自動でnginxが起動していて、
サーバーとして機能していることが確認できれば、OK。

※launchctl load に sudo を付けないとサーバーが起動しなかった。
また sudo を付けて load した場合は、
launchctl start/stop に sudo を付けないと
launchctl stop error: No such process
となってコントロール出来ない。

また、sudo launchctl stop を実行しても、
停止した後即時再起動されてしまう。
stopで止まってくれると感覚的に分かりやすいのでそうしたいけれども
そんな設定が可能なのかについては、まだlaunchctlをよく理解できておらず分からない。

launchctlによって起動されているnginxを永久停止したいときは、次のコマンドでunloadさせる。

$ sudo launchctl unload -w /System/Library/LaunchDaemons/homebrew.mxcl.nginx.plist

停止した後は、またloadすれば起動する。

この記事はお役に立ちましたか?


コメント

コメントする