osx snow leopard – OS Xログイン時にポート80でnginxを起動するには?

boot launchctl nginx osx-snow-leopard permissions

homebrewを使ってNginxをインストールしたところ、インストール完了後に以下のようなメッセージが表示されました

In the interest of allowing you to run `nginx` without `sudo`, the default
port is set to localhost:8080.

If you want to host pages on your local machine to the public, you should
change that to localhost:80, and run `sudo nginx`. You'll need to turn off
any other web servers running port 80, of course.

You can start nginx automatically on login running as your user with:
mkdir -p ~/Library/LaunchAgents
cp #{prefix}/org.nginx.nginx.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/org.nginx.nginx.plist

Though note that if running as your user, the launch agent will fail if you
try to use a port below 1024 (such as http's default of 80.)

しかし、私はポート80のNginxをログイン時に実行したいのですが、ターミナルを開いてsudo nginxを入力して実行する必要はありません。RedisやPostgreSQLのようにplistファイルから読み込ませたいのです

plist をユーザーフォルダから /Library/LaunchAgents/ に移動して所有者を変更し、nginx.conf ファイルに user ディレクティブを設定してみましたが、Console.app で同じエラーメッセージが表示されました

nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

(スーパーユーザ権限なしで nginx が実行されているので、user ディレクティブが無視されているという別のメッセージと一緒に)

  24  Bryson  2011-06-30


ベストアンサー

もっと簡単な方法は、/Library/LaunchDaemons/にadd plistファイルを作成することだとわかりました

sudo vi /Library/LaunchDaemons/org.nginx.nginx.plist

あるいは、ログイン時に起動させたい場合は、同じ plist ファイルである ~/Library/LaunchAgents/ に置くことができます。これにより、ユーザ名から launchd launchctl コマンドに sudo を呼ばなくてもアクセスできるようになります

を挿入して、以下のようにします(必ずnginxのインストール先のパスを更新して、ユーザー名をユーザー名にしてください)

<?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>nginx</string>
<key>Program</key>
<string>/usr/local/Cellar/nginx/1.6.2/bin/nginx</string>
<key>KeepAlive</key>
<true/>
<key>NetworkState</key>
<true/>
<key>LaunchOnlyOnce</key>
<true/>
<key>UserName</key>
<string>yourusername</string>
</dict>
</plist>

12  Rich Kroll  2012-03-12


私も同じ問題に直面していたので、ここにたどり着きました。私の解決策は、Homebrewのnginx起動スクリプトを使ったことを除いて、上記のRichさんの方法と似ています

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

参考までに、homebrew.mxcl.nginx.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>UserName</key>
<string>root</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/nginx</string>
</array>
<key>WorkingDirectory</key>
<string>/usr/local</string>
</dict>
</plist>

nginxの起動と停止を簡単にするために、$HOME/.profileに2つのエイリアスを追加しました

# Nginx needs to bind to port 80 so must run as /Library/LaunchDaemon with sudo
alias start-nginx='sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist'
alias stop-nginx='sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist'

私の問題は、なぜかnginxが正しく起動しないことでした。stop-nginxを実行してnginxをアンロードし、start-nginxで再起動するしかありませんでした

9  skuld  2012-09-14


質問に対する正確な答えではないが、十分に近いかもしれない: packetfilter pf (OS X 10.9でテスト済み)を使って、ポート80をポート8080にリダイレクトすることができる。/etc/pf.conf に次の行を追加してください (フィルタリングルールの上に来るはずです)

rdr pass on lo0 inet proto tcp from any to any port http -> localhost port 8080

この行の(ほとんどの)要素の説明は、こちらにあります

詳細については、https://superuser.com/a/521803http://www.openbsd.org/faq/pf/index.html を参照してください

1  Webthusiast  2014-02-04


2つの説明が思いつきます

  1. .plistファイルにはこのような行があります

    <key>Username</key>
    <string>some_user</string>
    

    これは、rootではなく、指定されたユーザの権限でnginxを起動するように launchd に指示します

    nginx を 80 番ポートにバインドしたい場合は、.plist ではなく、nginx の user ディレクティブで username を設定してください。 nginx はワーカープロセスの権限を落としますが、マスタープロセスは root のままです

  2. /Library/LaunchAgentsではなく、~/Library/LaunchAgents/(先頭の~に注意)にnginx .plistが入っています

    .plist を有効化したり無効化したりすることが可能なので、システム上に 2 つの nginx .plist が存在していて、そのうちの 1 つだけが有効になっている可能性があることに注意してください

0  Pitarou  2014-03-12


Pow サーバからヒントを得て、ポートフォワーディングを設定する plist を作りました。80番ポートを808080に、443番ポートを8443に転送します。これにより、通常のユーザでnginxを実行することができ、すべての接続が透過的に動作するようになりました

plistはこちらです。https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

0  stefansundin  2018-03-21


タイトルとURLをコピーしました