Bagaimana cara memulai nginx pada port 80 saat login OS X?


24

Saya menginstal Nginx menggunakan homebrew dan setelah menyelesaikan instalasi pesan berikut ini ditampilkan:

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.)

Tapi saya ingin Nginx, pada port 80, berjalan saat login dan saya tidak ingin harus membuka terminal dan mengetik sudo nginxuntuk melakukannya. Saya ingin memuat dari file plist seperti Redis dan PostgreSQL lakukan.

Saya memindahkan plist ke /Library/LaunchAgents/dari folder pengguna yang setara dan mengubah kepemilikannya, juga mencoba mengatur userdirektif dalam nginx.conffile dan masih memiliki pesan kesalahan yang sama di Console.app:

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

(bersama dengan pesan lain yang memberi tahu saya bahwa karena nginxsedang dijalankan tanpa hak istimewa pengguna super, userarahan itu diabaikan)


Pastikan file plist Anda memiliki kepemilikan "root: wheel" ketika Anda memindahkannya di folder LaunchDaemons. jika tidak, launchctl tidak akan menjalankannya karena "kepemilikan yang meragukan".
risyasin

Jawaban:


12

Saya menemukan pendekatan yang lebih mudah adalah dengan membuat file add plist di / Library / LaunchDaemons /

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

Atau, jika Anda ingin meluncurkannya saat login, Anda dapat meletakkannya di ~ / Library / LaunchAgents /, file plist yang sama. Ini akan memungkinkan Anda untuk mengakses perintah launchd launchctl dari nama pengguna Anda tanpa perlu memanggil sudo.

dan masukkan yang berikut ini (pastikan untuk memperbarui jalur ke instal nginx Anda, dan nama pengguna ke nama pengguna Anda):

<?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>

Ini adalah jawaban yang berguna, tetapi secara teknis mulai nginx saat boot, bukan login. Jika @Bryson benar-benar hanya menginginkannya berjalan setelah ia masuk ke akun GUI tertentu, maka ini bukan jawaban yang tepat. Tapi saya curiga dia benar-benar ingin itu berjalan segera setelah mesin telah boot, bahkan jika GUI menunggu di Login Window, daripada menunggu sampai dia benar-benar login.
Spiff

Saya menambahkan ke ~/Library/LaunchAgents/dan saya mendapatkan error berikut di Console: 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: UserName. Saya mengubah Programstring menjadi /usr/local/Cellar/nginx/1.2.7/sbin/nginxjika itu penting.
hobbes3

3
Sebenarnya saya hanya mengambil yang asli homebrew.mxcl.nginx.plist, berubah UserNamemenjadi root, lalu sudo chown root, dan berlari sudo launchctl load -wdan itu berhasil.
hobbes3

Bisakah saya memeriksa - Anda memiliki .plist di ~ / Library / LaunchAgents / (jadi hanya untuk satu pengguna), tetapi dimulai sebagai root? Saya belum pernah melihat kemungkinan yang disebutkan dalam dokumentasi, dan ketika saya mencobanya di Mavericks gagal.
Pitarou

@ hobbes3 @ rich-kroll Hampir setahun kemudian, namun KeepAlive dapat benar, atau disetel ke dikt yang berisi NetworkState. Jadi contoh di atas seharusnya mengatakan <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(perhatikan bahwa saya mengganti KeepAlive truedengan kamus yang mengandung NetworkState). Sumber: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange

9

Saya tiba di sini karena saya mengalami masalah yang sama. Solusi saya mirip dengan Rich di atas, kecuali saya menggunakan skrip startup Homebrew nginx:

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

Untuk referensi, di sini terlihat seperti apa 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>

Saya memiliki 2 alias yang ditambahkan ke $ HOME / .profile saya untuk mempermudah memulai dan menghentikan nginx.

# 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'

Masalah saya adalah bahwa untuk beberapa alasan nginx tidak memulai dengan benar pada awalnya. Saya hanya perlu menjalankan stop-nginx untuk menurunkannya, dan kemudian memulai kembali dengan start-nginx.


4
Alternatif :,lunchy restart nginx lihat github.com/mperham/lunchy
Andrei

1

Bukan jawaban yang tepat untuk pertanyaan Anda, tetapi mungkin cukup dekat: Anda dapat mengarahkan ulang port 80 ke port 8080, menggunakan packetfilter pf(diuji pada OS X 10.9). Tambahkan baris berikut ke Anda /etc/pf.conf(seharusnya muncul di atas aturan penyaringan):

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

Penjelasan tentang (sebagian besar) elemen dari baris ini dapat ditemukan di sini .

Untuk informasi lebih lanjut, lihat /superuser//a/521803 dan http://www.openbsd.org/faq/pf/index.html , meskipun yang terakhir tampaknya menggambarkan versi yang lebih baru pf, di mana yang diberikan baris akan ditulis secara berbeda.


0

Saya dapat memikirkan dua penjelasan:

  1. Ada beberapa baris seperti ini di .plistfile Anda :

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

    Ini memberitahu launchd untuk meluncurkan nginx dengan hak istimewa dari pengguna yang ditentukan, bukan root.

    Jika Anda ingin nginx mengikat ke port 80, Anda harus mengatur nama pengguna dalam arahan pengguna nginx , daripada di .plist. nginx kemudian akan menghapus hak istimewa untuk proses pekerja, meskipun proses master masih akan menjadi root.

  2. Anda memiliki nginx .plistdalam ~/Library/LaunchAgents/(perhatikan yang memimpin ~) daripada /Library/LaunchAgents.

    Perhatikan bahwa mungkin untuk mengaktifkan dan menonaktifkan. Daftar, jadi ada kemungkinan ada dua daftar. Nginx di sistem Anda, tetapi hanya satu yang aktif.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.