Ubuntu에서 구성 테스트가 성공한 후에 만 ​​nginx를 다시 시작하려면 어떻게해야합니까?


111

Ubuntu 서버의 명령 줄에서 nginx 서비스를 다시 시작할 때 nginx 구성 파일에 오류가 있으면 서비스가 충돌합니다. 다중 사이트 서버에서는 구성 오류가없는 사이트도 포함하여 모든 사이트가 다운됩니다.

이를 방지하기 위해 먼저 nginx 구성 테스트를 실행합니다.

nginx -t

테스트가 성공적으로 실행 된 후 서비스를 다시 시작할 수 있습니다.

/etc/init.d/nginx restart

또는 다시 시작하지 않고 nignx 사이트 구성 만 다시로드합니다.

nginx -s reload

다시 시작 명령이 구성 테스트 결과에 조건부 인 두 명령을 결합하는 방법이 있습니까?

나는 이것을 온라인에서 찾을 수 없었고 이것에 대한 공식 문서 는 다소 기본적입니다. 나는 리눅스를 그다지 잘 모르기 때문에 내가 찾고있는 것이 내 앞에 있는지 또는 전혀 불가능한지 모르겠다.

nginx v1.1.19를 사용하고 있습니다.


nginx -t ($? 사용)의 반환 상태를 확인한 다음 반환 상태에 따라 다시 시작하는 작은 셸 스크립트는 어떻습니까?
TeTeT 2013 년

답변:


49

실제로 내가 아는 한 nginx는 빈 메시지를 표시하고 구성이 잘못되면 실제로 다시 시작하지 않습니다.

그것을 망치는 유일한 방법은 nginx 중지를 한 다음 다시 시작하는 것입니다. 중지는 성공하지만 시작은 실패합니다.


1
어떤 버전의 nginx에 대해 이야기하고 있습니까? 나는 v 1.1.19로 작업하고 있으며 구성 파일의 오류에 관계없이 다시 시작하려고 시도합니다. 문제가 있음을 알려 주지만 그때까지는 이미 너무 늦었습니다
jan

5
좋아, 방금 테스트했고 내 노트북에는 nginx 1.2가 있고 내가 설명한대로 작동했으며 내 VPS에는 귀하와 같은 1.1.19가 있으며 귀하의 질문에서 설명한 것과 동일합니다. 그래서 저는 이것이 1.2에서 처리되었다고 생각합니다
Mohammad AbuShady 2013 년

큰! 알아 내 주셔서 감사합니다. nginx <v1.2
jan

1
나는 그때 업그레이드해야 할 것 같다 :-) 어쨌든 변명 필요
jan

1
service nginx reload구성이 올바르게로드되었는지 여부를 표시하지 않으므로 구성이 잘못되었다고 의심되는 경우 쓸모가 없습니다. service nginx restart구성에 오류가 있으면 서버를 중지합니다!
Dan Dascalescu

80

nginx 1.8.0부터 올바른 솔루션은 다음과 같습니다.

sudo nginx -t && sudo service nginx reload

버그로 인해 구성 파일에 오류가 있어도 configtest항상 0 종료 코드를 반환합니다 .


3
nginx -t && sudo nginx -s reload
MechanisM

5
@MechanisM : nginx -tsudo가 없으면 권한 오류로 인해 거의 확실히 실패합니다.
Dan Dascalescu

재 장전의 마지막 부분을 대부분 보여주고 싶었습니다. 제 경우에는 사용자 정의 컴파일 된 nginx가 있고 /etc/init.d 등에 스크립트도 없습니다. 따라서 제 경우에는 "service nginx reload"가 아무 작업도 수행하지 않습니다
MechanisM

39

구성 테스트가 성공한 경우에만 다음 명령을 사용하여 Nginx (버전 1.5.9)를 다시로드합니다.

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

이 작업을 자주 수행해야하는 경우 별칭을 사용할 수 있습니다. 다음을 사용합니다.

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

여기서 트릭은 첫 번째 명령이 성공한 경우에만 두 번째 명령을 실행하는 "&&"에 의해 수행됩니다. 여기 에서 "&&"연산자 사용에 대한 자세한 설명을 볼 수 있습니다 .

서버를 다시 시작하려면 "reload"대신 "restart"를 사용할 수 있습니다.


pkill -1 nginx구성이 실패하고 오해의 소지가있는 성공을 반환하면 nginx 1.4.2 (실제로 내 init.d / nginx 다시로드가 수행하는 작업)가 다시로드되지 않습니다. 자신의 버전을 확인하십시오.
KCD

2
이것은 나를 위해 작동하지 않습니다. 테스트가 실패하더라도 두 명령 모두 실행됩니다.
Mario Campa

2
configtest 는 적어도 nginx 1.8.0에서 항상 0 종료 코드를 반환합니다 . nginx -t대신 사용하십시오 .
Dan Dascalescu

8
alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

그런 다음 "nginx.reload"명령 등을 사용합니다.


6

/etc/init.d/nginx reload및 사용하여 다시로드 할 수 있습니다.sudo service nginx reload

경우 nginx -t다음 몇 가지 오류가 발생이 다시로드되지 않습니다

따라서 &&를 사용하여 동시에 실행하십시오.

처럼

nginx -t && /etc/init.d/nginx 다시로드


배쉬에 대해 가르쳐 드릴게요. && does not run both at a same time왼쪽 명령이 종료 코드 0을 반환하면 오른쪽 명령을 실행합니다 nginx -t. 오류가 발생하면 종료 코드가 0이 아니므로 두 번째 명령이 실행되지 않습니다. nginx -s reload어쨌든 그것의
miknik

@miknik 나는 그것이 그가 말하려는 의미라고 생각합니다. 그냥 제대로 나오지 않았습니다. 그는 말한다 If nginx -t throws some error then it won't reload. 명령문 run both at a same time은 단일 명령 또는 한 줄로 해석 될 수도 있습니다. 나는 그가이 경우에 반드시 말하는 것을 해석하지 않는다 in parallel.
matt

2

신호를 사용하여 nginx를 제어 할 수 있습니다.

문서에 따르면 nginx 마스터 프로세스에 HUP 신호를 보내야합니다.

HUP-구성 변경, 변경된 시간대 유지 (FreeBSD 및 Linux에만 해당), 새 구성으로 새 작업자 프로세스 시작, 이전 작업자 프로세스의 정상 종료

http://nginx.org/en/docs/control.html 에서 문서를 확인하십시오.

다음과 같이 nginx 마스터 프로세스 PID에 HUP 신호를 보낼 수 있습니다.

kill -HUP $( cat /var/run/nginx.pid )

위의 명령은에서 nginx PID를 읽습니다 /var/run/nginx.pid. 기본적으로 nginx pid가 작성 /usr/local/nginx/logs/nginx.pid되지만 config에서 재정의 할 수 있습니다. nginx.configPID를 저장하는 위치를 확인하십시오 .


1

적어도 데비안에서는 nginx 시작 스크립트에 다음을 수행하는 다시로드 기능이 있습니다.

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

당신이해야 할 일은 호출하기 때문에 service nginx reload대신 호출 하는 것 같습니다 .restarttest_nginx_config


service nginx reload구성이 정상적으로 테스트되었는지 여부 또는 다시로드되었는지 여부에 대한 어떤 종류의 표시도 제공하지 않습니다.
Dan Dascalescu

무엇 않습니다 test_nginx_config이 경우 다음합니까?
Daenney

1
둘 다 요점이 있다고 생각합니다. service nginx reload명령 줄에서는 충분하지만 때때로 stderr 출력을 캡처하여 문제 해결을 위해 스크립트로 되돌려 야 할 수 있습니다. nginx -t잘못된 매개 변수가있는 파일과 어떤 행에 있는지 알려줍니다.
anastymous
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.