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.