OS X girişinde nginx'i 80 numaralı bağlantı noktasından nasıl başlatabilirim?


24

Nginx'i homebrew kullanarak kurdum ve kurulumu tamamladıktan sonra aşağıdaki mesaj görüntülendi:

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

Ama istediğiniz giriş çalışan, 80 numaralı bağlantı noktasında, Nginx ve ben açık terminal ve tipine sahip istemiyorum sudo nginxbunu yapmak için. Redis ve PostgreSQL gibi bir plist dosyadan yüklenmesini istiyorum.

Pist'i /Library/LaunchAgents/kullanıcı klasöründen eşdeğerine taşıdım ve sahipliğini değiştirdim, ayrıca userdirektifin nginx.confdosyada ve Console.app'da da aynı hata mesajını ayarlamayı denedim :

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

( nginxSüper kullanıcı ayrıcalıkları olmadan çalıştırıldığından beri userdirektifin göz ardı edildiğini söyleyen bir mesajla birlikte )


Plist dosyanızın LaunchDaemons klasörlerinden herhangi birinde taşırken "root: wheel" sahipliğine sahip olduğundan emin olun. Aksi takdirde launchctl "şüpheli mülkiyet" nedeniyle çalıştırılmayacaktır.
risyasin,

Yanıtlar:


12

Daha kolay bir yaklaşım buldum / Library / LaunchDaemons / dizininde pist dosyası oluşturmak oldu.

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

Veya, oturum açma sırasında başlatılmasını istiyorsanız, aynı plist dosyasını ~ / Library / LaunchAgents / içine koyabilirsiniz. Bu, sudo çağrısı yapmanıza gerek kalmadan kullanıcı adınızdan launchd launchctl komutuna erişmenizi sağlayacaktır.

ve aşağıdakileri ekleyin (nginx kurulumunuzun yolunu ve kullanıcı adınızı kullanıcı adınıza güncellediğinizden emin olun):

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

Bu yararlı bir cevap, ancak teknik olarak açılışta değil, açılışta nginx'i başlatıyor. @Bryson gerçekten yalnızca belirli bir GUI hesabına giriş yaptıktan sonra çalışmasını istiyorsa, bu tam olarak doğru cevap değildir. Ancak, GUI gerçekte giriş yapana kadar beklemek yerine Login Window'da beklemesine rağmen, makine önyüklendiğinde çalışmasını istediğinden şüpheleniyorum.
Spiff

Ben onu ekledi ~/Library/LaunchAgents/ve ben Konsolu aşağıdaki hataları alıyorum: 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. Eğer önemliyse Programdizeyi değiştirdim /usr/local/Cellar/nginx/1.2.7/sbin/nginx.
Hobbes3

3
Aslında ben sadece orijinal aldı homebrew.mxcl.nginx.plistdeğişti UserNameetmek root, sonra sudo chown root, ve ran sudo launchctl load -wve işe yaradı.
Hobbes3

Sadece kontrol edebilir miyim - ~ / Library / LaunchAgents / içinde bir .plisteniz var (yani sadece bir kullanıcı için), fakat root olarak mı başlıyor? Belgelerde belirtilen bu olasılığı hiç görmedim ve Mavericks üzerinde denediğimde başarısız oldu.
Pitarou

@ hobbes3 @ rich-kroll Neredeyse bir yıl sonra ancak KeepAlive ya doğru olabilir ya da NetworkState içeren bir dikime ayarlayabilir. Bu yüzden yukarıdaki örnek söylemelidir <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(KeepAlive'nin yerine trueNetworkState sözlüğünü kullandığımı unutmayın ). Kaynak: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange

9

Buraya geldim çünkü aynı sorunla karşılaştım. Benim çözümüm, Homebrew nginx başlangıç ​​komut dosyasını kullanmam dışında, Rich'in yukarıdakiyle aynıydı:

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

Başvuru için, işte homebrew.mxcl.nginx.plist şöyle görünür:

<?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'in başlatılmasını ve durdurulmasını kolaylaştırmak için $ HOME / .profile dosyama 2 takma ad ekledim.

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

Benim sorunum, bir nedenden ötürü nginx'in başlangıçta doğru şekilde başlamamasıydı. Stop-nginx'i boşaltmak için çalıştırmam gerekti ve ardından start-nginx ile tekrar başlattım.


4
Alternatif: lunchy restart nginxbkz. Github.com/mperham/lunchy
Andrei

1

Sorunuza kesin bir cevap değil , ancak yeterince yaklaşabilir: paket filtresini kullanarak port 80'i port 8080'e yeniden yönlendirebilirsiniz pf(OS X 10.9'da test edilmiştir). Aşağıdaki satırları kendinize ekleyin /etc/pf.conf(filtreleme kurallarının üzerinde gelmelidir):

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

Bu çizginin elemanlarının (çoğu) bir açıklaması burada bulunabilir .

Daha fazla bilgi için, bkz /superuser//a/521803 ve http://www.openbsd.org/faq/pf/index.html ikincisi daha yeni bir sürümünü açıklamak gibi görünüyor olsa da, pfverilen hangi, satır farklı yazılır.


0

İki açıklama düşünebilirim:

  1. .plistDosyanızda bunun gibi bazı çizgiler var :

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

    Bu, başlatma işlemine nginx işlevini root yerine belirtilen kullanıcının yetkileriyle başlatmasını söyler.

    Nginx'in 80 numaralı bağlantı noktasına bağlanmasını istiyorsanız, kullanıcı adını .plist yerine nginx'in kullanıcı yönergesinde ayarlamalısınız . nginx daha sonra, ana süreç hala kök olmasına rağmen, işçi işlemleri için ayrıcalık bırakacaktır.

  2. Daha ziyade .plistiçinde bir nginx var ~/Library/LaunchAgents/( baştakilere dikkat edin ~) /Library/LaunchAgents.

    .Plists'i etkinleştirmek ve devre dışı bırakmak mümkün olduğunu unutmayın, bu nedenle sisteminizde iki nginx .plist olması mümkündür, ancak bunlardan yalnızca bir tanesi etkindir.


0

Pow sunucusundan ilham aldım ve liman taşımacılığı yapan bir yalvarma yaptım. 80 numaralı bağlantı noktasını 8080 numaralı bağlantı noktasına ve 443 numaralı bağlantı noktasını 8443 numaralı bağlantı noktasına iletir. Bu şekilde nginx'i normal bir kullanıcı altında çalıştırabilirim ve tüm bağlantılarım şeffaf bir şekilde çalışır.

Pist burada: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.