ฉันจะเริ่ม nginx บนพอร์ต 80 ที่เข้าสู่ระบบ OS X ได้อย่างไร


24

ฉันติดตั้ง Nginx โดยใช้homebrewและหลังจากเสร็จสิ้นการติดตั้งข้อความต่อไปนี้จะปรากฏขึ้น:

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เพื่อทำมัน ฉันต้องการให้โหลดจากไฟล์ plist เช่น 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คำสั่งก็ถูกเพิกเฉย)


ต้องแน่ใจว่าไฟล์ Plist ของคุณเป็นเจ้าของ "root: wheel" เมื่อคุณย้ายไฟล์ในโฟลเดอร์ LaunchDaemons ไม่เช่นนั้น launchctl จะไม่เรียกใช้เพราะ "ความเป็นเจ้าของที่น่าสงสัย"
risyasin

คำตอบ:


12

ฉันพบวิธีที่ง่ายกว่าคือการสร้างไฟล์ plist ใน / Library / LaunchDaemons /

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

หรือหากคุณต้องการให้มันเปิดตัวในการเข้าสู่ระบบคุณสามารถวางไว้ใน ~ / Library / LaunchAgents / ซึ่งเป็นไฟล์ plist เดียวกัน สิ่งนี้จะช่วยให้คุณเข้าถึงคำสั่ง 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>

นี่เป็นคำตอบที่มีประโยชน์ แต่ในทางเทคนิคแล้วมันเริ่ม 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: 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

ฉันสามารถตรวจสอบได้ไหมว่าคุณมี. plist ใน ~ / Library / LaunchAgents / (สำหรับผู้ใช้หนึ่งรายเท่านั้น) แต่มันเริ่มต้นเป็นรูท ฉันไม่เคยเห็นความเป็นไปได้ที่กล่าวถึงในเอกสารประกอบและเมื่อฉันลองใช้กับ Mavericks มันล้มเหลว
Pitarou

@ hobbes3 @ rich-kroll เกือบหนึ่งปีต่อมา แต่ KeepAlive อาจเป็นจริงหรือตั้งเป็น dict ที่มี NetworkState ดังนั้นตัวอย่างข้างต้นควรพูด<key>KeepAlive</key><dict><key>NetworkState</key><true/></dict>(โปรดทราบว่าฉันแทนที่ KeepAlive trueด้วยพจนานุกรมที่มี NetworkState) ที่มา: developer.apple.com/library/mac/documentation/Darwin/Reference/
......

9

ฉันมาที่นี่เพราะฉันพบปัญหาเดียวกัน โซลูชันของฉันคล้ายกับ Rich ของด้านบนยกเว้นฉันใช้สคริปต์เริ่มต้น 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'

ปัญหาของฉันคือว่าด้วยเหตุผลบางอย่าง nginx เริ่มทำงานไม่ถูกต้องในตอนแรก ฉันต้องเรียกใช้ stop-nginx เพื่อยกเลิกการโหลดจากนั้นเริ่มต้นใหม่อีกครั้งด้วย start-nginx


4
ทางเลือก: lunchy restart nginxดูgithub.com/mperham/lunchy
Andrei

1

ไม่ใช่คำตอบที่แน่นอนสำหรับคำถามของคุณ แต่อาจเข้ามาใกล้พอ: คุณสามารถเปลี่ยนเส้นทางพอร์ต 80 ไปที่พอร์ต 8080 โดยใช้ packetfilter pf(ทดสอบบน OS X 10.9) เพิ่มบรรทัดต่อไปนี้ใน/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>
    

    สิ่งนี้บอกให้ launchd เรียกใช้งาน nginx ด้วยสิทธิ์ของผู้ใช้ที่ระบุแทนที่จะเป็นรูท

    หากคุณต้องการให้ nginx เชื่อมโยงกับพอร์ต 80 คุณควรตั้งชื่อผู้ใช้ในคำสั่งของผู้ใช้ของ nginx มากกว่าใน. plist nginx จะปล่อยสิทธิพิเศษสำหรับกระบวนการของผู้ปฏิบัติงานถึงแม้ว่ากระบวนการหลักจะยังคงเป็นรูท

  2. คุณมี Nginx .plistใน~/Library/LaunchAgents/(หมายเหตุชั้นนำ~) /Library/LaunchAgentsมากกว่า

    โปรดทราบว่าเป็นไปได้ที่จะเปิดใช้งานและปิดการใช้งาน. plists ดังนั้นจึงเป็นไปได้ว่ามี nginx .plists สองระบบในระบบของคุณ แต่มีเพียงหนึ่งในนั้นเท่านั้นที่เปิดใช้งาน


0

ฉันรับแรงบันดาลใจจากเซิร์ฟเวอร์ Pow และทำรายการที่ตั้งค่าการส่งต่อพอร์ต มันจะส่งต่อพอร์ต 80 ถึงพอร์ต 8080 และพอร์ต 443 ไปยังพอร์ต 8443 วิธีนี้ฉันสามารถเรียกใช้ nginx ภายใต้ผู้ใช้ปกติและการเชื่อมต่อทั้งหมดของฉันทำงานได้อย่างโปร่งใส

นักวางแผนอยู่ที่นี่: https://gist.github.com/stefansundin/f0ad99195333480157ce67e97c8d28c7

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.