OS Xログイン時にポート80でnginxを起動するにはどうすればよいですか?


24

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/同等のユーザーフォルダーから移動し、その所有権を変更userし、nginx.confファイルにディレクティブを設定してみましたが、Console.appにも同じエラーメッセージが表示されます。

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

nginxスーパーユーザー権限なしで実行されていたため、userディレクティブが無視されていたというメッセージが表示されます)


plistファイルをLaunchDaemonsフォルダーのいずれかに移動するときは、「root:wheel」の所有権を持っていることを確認してください。そうでない場合、launchctlは「疑わしい所有権」のために実行されません。
リシャシン14

回答:


12

/ Library / LaunchDaemons /に追加のplistファイルを作成する方が簡単な方法であることがわかりました

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

または、ログイン時に起動する場合は、同じplistファイルである〜/ Library / LaunchAgents /に配置できます。これにより、sudoを呼び出す必要なく、ユーザー名からlaunchd launchctlコマンドにアクセスできます。

そして、以下を挿入します(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>

これは便利な回答ですが、技術的にはログインではなく起動時にnginxを起動します。@Brysonが特定のGUIアカウントにログインした後にのみ実行したい場合、これは正解ではありません。しかし、私は彼が本当にそれはGUIではなく、彼が実際にログインするまで待っているよりも、ログインウインドウで待っていても、とすぐにマシンが起動しているように実行したいと思う。
SPIFF

それを追加し~/Library/LaunchAgents/、コンソールに次のエラーが表示されます3/30/13 9:39:24.047 AM com.apple.launchd.peruser.501[884]: (nginx) Unknown key for boolean: NetworkState 3/30/13 9:39:24.047 AM com.apple.launchd.peruser.501[884]: (nginx) Ignored this key: UserName 3/30/13 9:39:24.047 AM com.apple.launchd.peruser.501[884]: (nginx) Ignored this key: UserNameProgram必要に/usr/local/Cellar/nginx/1.2.7/sbin/nginx応じて文字列を変更しました。
-hobbes3

3
実際に、私はオリジナルを取り、homebrew.mxcl.nginx.plistに変更UserNameroot、それからsudo chown root、そして走りました、そして、sudo launchctl load -wそれは働きました。
-hobbes3

〜/ Library / LaunchAgents /に.plistがあります(したがって、1人のユーザー専用です)が、rootとして起動しますか?ドキュメントでその可能性について言及したことは一度もありませんでしたが、Mavericksで試したときに失敗しました。
ピタロウ14年

@ hobbes3 @ rich-krollほぼ1年後ですが、KeepAliveはtrueになるか、NetworkStateを含む辞書に設定されます。したがって、上記の例では、<key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>KeepAlive trueをNetworkStateを含む辞書に置き換えていることに注意してください。出典:developer.apple.com/library/mac/documentation/Darwin/Reference/...
getWeberForStackExchange

9

同じ問題にぶつかっているので、ここに来ました。私の解決策は、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を実行してアンロードしてから、start-nginxで再起動する必要がありました。


4
オルタナティブ:lunchy restart nginx、参照github.com/mperham/lunchy
アンドレイ

1

あなたの質問に対する正確な答えではありませんが、十分に近いかもしれません:パケットフィルター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を参照してくださいただし、後者はpf、行の書き方が異なります。


0

私は2つの説明を考えることができます:

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

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

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

    nginxをポート80にバインドする場合は、.plistではなく、nginxのユーザーディレクティブでユーザー名を設定する必要があります 。その後、nginxはワーカープロセスの特権を削除しますが、マスタープロセスは引き続きルートです。

  2. あなたはnginx .plistを持っています~/Library/LaunchAgents/(先頭に注意してください~)ではなく/Library/LaunchAgents

    .plistsをアクティブ化および非アクティブ化することができるため、システム上にnginx .plistsが2つある可能性がありますが、アクティブなのはそのうちの1つだけです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.