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.confConsole.app에서 여전히 동일한 오류 메시지를 시도했습니다 .

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

( nginx수퍼 유저 권한없이 실행 user되었으므로 지시문이 무시 되었다는 다른 메시지와 함께 )


LaunchDaemons 폴더에서 plist 파일을 이동할 때 "root : wheel"소유권을 가지고 있는지 확인하십시오. 그렇지 않으면 launchctl은 "의심스러운 소유권"때문에 실행되지 않습니다.
risyasin

답변:


12

더 쉬운 방법은 / Library / LaunchDaemons /에서 plist 파일을 추가하는 것입니다.

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

또는 로그인시 시작하려면 동일한 plist 파일 인 ~ / Library / LaunchAgents /에 넣을 수 있습니다. 이를 통해 sudo를 호출 할 필요없이 사용자 이름으로 시작된 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: UserName. 중요한 경우 Program문자열을 변경했습니다 /usr/local/Cellar/nginx/1.2.7/sbin/nginx.
hobbes3

3
사실 난 그냥 원래했다 homebrew.mxcl.nginx.plist변경 UserNameroot다음 sudo chown root과 RAN을 sudo launchctl load -w하고 일했다.
hobbes3

~ / Library / LaunchAgents /에 .plist가 있지만 (한 명의 사용자 전용) 루트로 시작합니까? 나는 문서에 언급 된 가능성을 본 적이 없으며 Mavericks에서 시도했을 때 실패했습니다.
Pitarou

거의 1 년 후 @ hobbes3 @ rich-kroll 그러나 KeepAlive는 true이거나 NetworkState를 포함하는 dict로 설정 될 수 있습니다. 따라서 위의 예 <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
대안 : github.com/mperham/lunchylunchy restart nginx 참조
Andrei

1

귀하의 질문에 대한 정확한 답변은 아니지만 충분히 가까이 올 수 있습니다. packetfilter를 사용하여 포트 80을 포트 8080으로 리디렉션 할 수 있습니다 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/521803http://www.openbsd.org/faq/pf/index.html을 , 후자는 최신 버전 설명하기 위해 보이지만, pf(가) 제공 한을, 줄은 다르게 쓰여질 것입니다.


0

두 가지 설명을 생각할 수 있습니다.

  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가있을 수 있지만 그 중 하나만 활성화되어 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.