मैं OS X लॉगिन पर पोर्ट 80 पर nginx कैसे शुरू करूं?


24

मैंने होमब्रे का उपयोग करके 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.)

लेकिन मैं चाहता हूं कि Nginx, पोर्ट 80 पर, लॉगिन पर चल रहा है और मुझे ऐसा करने के लिए टर्मिनल खोलने और टाइप sudo nginxकरने की आवश्यकता नहीं है। मैं चाहता हूं कि यह Redis और PostgreSQL की तरह एक plist फ़ाइल से लोड हो।

मैंने /Library/LaunchAgents/उपयोगकर्ता फ़ोल्डर से समकक्ष को स्थानांतरित किया और इसके स्वामित्व को बदल दिया, फ़ाइल userमें निर्देश स्थापित करने की कोशिश भी की nginx.confऔर अभी भी Console.app में एक ही त्रुटि संदेश है:

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

(एक अन्य संदेश के साथ मुझे बता रहा है कि चूंकि nginxसुपर-उपयोगकर्ता विशेषाधिकारों के बिना चलाया जा रहा था, इसलिए userनिर्देश की अनदेखी की जा रही थी)


सुनिश्चित करें कि जब आप किसी भी LaunchDaemons फ़ोल्डर में इसे स्थानांतरित करते हैं, तो आपकी फ़ाइल का "रूट: पहिया" स्वामित्व होता है। अन्यथा लॉंचक्ट इसे "संदिग्ध स्वामित्व" का बीक्युस नहीं करेगा।
रिसायसिन

जवाबों:


12

मैंने पाया कि एक आसान तरीका यह था कि लाइब्रेरी / लॉन्चडैमन्स /

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

या, यदि आप चाहते हैं कि यह लॉगिन पर लॉन्च हो, तो आप इसे ~ / लाइब्रेरी / लॉन्चएगेंट /, उसी प्लिस्ट फ़ाइल में रख सकते हैं। यह आपको 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>

यह एक उपयोगी उत्तर है, लेकिन तकनीकी रूप से यह बूट पर nginx शुरू होता है, लॉगिन नहीं। यदि @Bryson वास्तव में केवल एक निश्चित GUI खाते में लॉग इन करने के बाद इसे चलाना चाहता है, तो यह बिल्कुल सही उत्तर नहीं है। लेकिन मुझे संदेह है कि वह वास्तव में चाहता है कि जैसे ही मशीन ने बूट किया है, भले ही जीयूआई लॉगिन विंडो पर इंतजार कर रहा है, बजाय इसके कि वह वास्तव में लॉग-इन होने तक इंतजार कर रहा है।
Mariff

मैं इसे करने के लिए जोड़ा ~/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: UserName। मैंने Programस्ट्रिंग को बदल दिया /usr/local/Cellar/nginx/1.2.7/sbin/nginxअगर वह मायने रखता है।
hobbes3

3
वास्तव में मैंने सिर्फ मूल लिया homebrew.mxcl.nginx.plist, बदल UserNameदिया root, फिर sudo chown root, और भाग गया sudo launchctl load -wऔर यह काम किया।
hobbes3

क्या मैं सिर्फ जांच कर सकता हूं - आपके पास ~ / पुस्तकालय / LaunchAgents / में एक .plist है (इसलिए यह केवल एक उपयोगकर्ता के लिए है), लेकिन यह रूट के रूप में शुरू होता है? मैंने प्रलेखन में उल्लिखित उस संभावना को कभी नहीं देखा है, और जब मैंने इसे मावेरिक्स पर आज़माया तो यह विफल रहा।
पितरौ

@ hobbes3 @ rich-kroll लगभग एक साल बाद लेकिन KeepAlive या तो सच हो सकता है, या एक तानाशाह को सेट कर सकता है जिसमें NetworkState शामिल है। तो ऊपर दिए गए उदाहरण में कहा जाना चाहिए <key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(ध्यान दें कि मैंने KeepAlive की जगह trueNetworkState वाले शब्दकोष से लिया है)। स्रोत: developer.apple.com/library/mac/documentation/Darwin/Reference/…
getWeberForStackExchange

9

मैं यहां आ गया क्योंकि मैं उसी समस्या में चल रहा था। मेरा समाधान रिच के ऊपर के समान था, सिवाय इसके कि मैंने Homebrew nginx स्टार्टअप स्क्रिप्ट का उपयोग किया:

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>

मेरे पास 2 अलायस अपने $ HOME / .profile में जोड़ा गया है ताकि इसे शुरू करना और 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'

मेरी समस्या यह थी कि किसी कारण से शुरू में नगनेक्स ठीक से शुरू नहीं हो रहा था। मुझे बस इसे उतारने के लिए स्टॉप-नेग्नेक्स चलाना था, और फिर इसे फिर से शुरू-नेग्नेक्स के साथ फिर से शुरू करना था।


4
वैकल्पिक: lunchy restart nginx, देख github.com/mperham/lunchy
आंद्रेई

1

आपके प्रश्न का सटीक उत्तर नहीं है , लेकिन काफी करीब आ सकता है: आप पैकेटेटाइल्टर pf(ओएस एक्स 10.9 पर परीक्षण) का उपयोग करके पोर्ट 80 को पोर्ट 8080 पर रीडायरेक्ट कर सकते हैं । निम्नलिखित लाइन को अपने में जोड़ें /etc/pf.conf(यह फ़िल्टरिंग नियमों के ऊपर आना चाहिए):

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

इस लाइन के तत्वों का स्पष्टीकरण (अधिकांश) यहां पाया जा सकता है

अधिक जानकारी के लिए, /superuser//a/521803 और http://www.openbsd.org/faq/pf/index.html देखें , हालाँकि उत्तरार्द्ध के एक नए संस्करण का वर्णन करने के लिए लगता है pf, जिसमें दिए गए हैं लाइन अलग तरह से लिखी जाएगी।


0

मैं दो स्पष्टीकरणों के बारे में सोच सकता हूं:

  1. आपकी .plistफ़ाइल में कुछ लाइनें इस तरह हैं :

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

    यह रूट के बजाय निर्दिष्ट उपयोगकर्ता के विशेषाधिकारों के साथ लॉन्च करने के लिए लॉन्च को बताता है।

    यदि आप nginx को 80 पोर्ट में बाँधना चाहते हैं, तो आपको .plist के बजाय nginx के उपयोगकर्ता निर्देश में उपयोगकर्ता नाम सेट करना चाहिए । nginx तब कार्यकर्ता प्रक्रियाओं के लिए विशेषाधिकार छोड़ देगा, हालांकि मास्टर प्रक्रिया अभी भी जड़ होगी।

  2. आपके पास एक nginx .plistहै ~/Library/LaunchAgents/(ध्यान दें ~) के बजाय /Library/LaunchAgents

    ध्यान दें कि .plists को सक्रिय और निष्क्रिय करना संभव है, इसलिए यह संभव है कि आपके सिस्टम पर दो nginx .plists हैं, लेकिन उनमें से केवल एक ही सक्रिय है।


0

मैंने पॉव सर्वर से प्रेरणा ली और एक प्लिस्ट बनाया जो पोर्ट फ़ॉरवर्डिंग स्थापित करता है। यह फ़ॉरेस्ट 80 से पोर्ट 8080, और पोर्ट 443 से पोर्ट 8443 पर पोर्ट करता है। इस तरह से मैं एक सामान्य उपयोगकर्ता के तहत nginx चला सकता हूं, और मेरे सभी कनेक्शन पारदर्शी रूप से काम करते हैं।

प्लिस्ट यहाँ है: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.