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/521803 や http://www.openbsd.org/faq/pf/index.html を参照してください
1 Webthusiast 2014-02-04
2つの説明が思いつきます
.plist
ファイルにはこのような行があります<key>Username</key> <string>some_user</string>
これは、rootではなく、指定されたユーザの権限でnginxを起動するように launchd に指示します
nginx を 80 番ポートにバインドしたい場合は、.plist ではなく、nginx の user ディレクティブで username を設定してください。 nginx はワーカープロセスの権限を落としますが、マスタープロセスは root のままです
/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