오류 로그보다 nginx를 더 디버깅하려면 어떻게해야합니까?


34

현재 상당히 많은 HTTP 홍수가 발생하고 있으며 nginx 리버스 프록시가 502 Bad Gateway를 생성합니다.

백엔드 서버의 프록시로 nginx를 실행하는 프론트 엔드 서버가 있지만 connect() failed (110: Connection timed out) while connecting to upstream오류가 많이 발생합니다. 그들의 톤. 백엔드에 연결하기 위해 프록시 서버를 우회하면 사이트를 제대로 실행할 수 있으므로 역방향 프록시에 있다는 것을 알 수 있습니다. 그러나 시간이 초과되는 이유를 결정하는 방법을 모르겠습니다.

어떤 도움?

CentOS 6.2에서 nginx 1.2.3 실행


Nginx를 최신 버전으로 업데이트하여 시작할 수 있습니다.
그럼에도 불구

2
....하고있다에서 어떤 모습이 의 nginx에서 CONNECIONS을 거부
symcbean

백엔드 서버는 무엇입니까? Nginx가 제공하는 오류가 실제로 백엔드에서 발생했을 때 오류로 인해 혼란 스러웠습니다. 여기서는 그렇지 않지만 자세한 내용으로 질문을 업데이트해야합니다.
jeffatrackaid

또한 개인 / 공용 네트워크를 통해 백엔드에 연결하고 있습니까? 방화벽, ddos ​​또는 기타 ip / rate-limiting 유형 도구에 프록시의 IP가 허용됩니까? 백엔드 서버의 netstat는 어떻게 생겼습니까? 몇 개의 연결이 열려 있습니까? 백엔드에서 MaxClient는 무엇입니까? 당신은 그것들을 소진하고 있습니까?
jeffatrackaid

답변:


19

이미 Nginx 오류 로깅 수준을 디버깅하기 위해 올렸다고 가정합니다. 그렇지 않은 경우 시작하십시오.

가장 좋은 방법은 아마도 straceNginx가 만든 시스템 호출을 보는 데 사용 하는 것 입니다. 특히, 당신은 connect()전화에 주의를 기울이고 이들의 리턴 코드를 주시 하고 싶을 것 입니다 ( man 2 connect여기에서 친구가 될 수 있음).

해당 정보를 확보 한 후에는 문제가 프론트 엔드 프록시에 국한되어 있는지 또는 프록시와 백엔드 애플리케이션 서버 간의 상호 작용과 관련이 있는지에 대한 정확한 추측을 할 수 있습니다.


37

dtrace 프로브를 넣고 싶지 않다면 이것보다 훨씬 더 독창적이지는 않습니다.

  1. 디버그 로그 레벨을 설정하십시오. /etc/nginx/nginx.conf :

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. 다른 창에서 tcpdump를 설정하십시오.

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. 또 다른 창에서 로그 파일을 모니터하십시오.

    tail -f /var/log/nginx/*
    
  4. strace를 사용하여 대화식으로 nginx 시작 :

    # top of /etc/nginx/nginx.conf:
    
    daemon off; # todo testing remove me not for production use
    

    그리고

     $ strace nginx 
    

로 컴파일 된 nginx로 추가 디버깅을 수행 할 수 있습니다 --with-debug. 다음을 실행하여 확인하십시오.

    nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug

기본적으로 컴파일되지 않은 또 다른 좋은 모듈은 HttpStubStatusModule 입니다. 우연히도 괜찮은 설정을하려면 사용자 정의 컴파일 된 nginx (distro의 패키징 도구를 사용하여 권장하는 패키징)가 필요합니다.

이들 중 대부분은 프로덕션 용도에 적합하지 않습니다. 더 많은 통계가 필요한 경우 gperf로 nginx를 컴파일하십시오.


2 단계에서, 나를 위해 다음과 같은 작품 : tcpdump를 -i는하지 포트 (22) -vvv -s0 -q -XXX
ccppjava

5

트래픽이 많은 사이트를 디버깅하는 것 같습니다.

지시문 debug과 함께 사용 debug_connection하면 nginx 오류 로그에 IP의 디버그 로그 만 표시됩니다.

전체 nginx 구성에 대해 디버그 옵션을 활성화하지 않고 유용한 오류 로그가 표시되면 reverse_proxy 연결을 담당 하는 별도의 error_log /path/to/some/file/ debug;지시문을 location {..}블록에 추가하십시오 .

이렇게하면 IP에서만 디버그 오류 로그를 분리 할 수 ​​있습니다.

(브라우저의) 요청과 관련 시키십시오.

예를 들어 https://easyengine.io/tutorials/nginx/debugging/을 확인하십시오.

Nginx의 HttpEchoModule을 사용할 수 있습니다.


2

나는 Nginx가 병목 현상을 발견하지 못했습니다. 대부분의 경우 백엔드보다 능력이 뛰어납니다. 그러나 Nginx없이 테스트했지만 오류가 없으면 다음 중 하나입니다.

  1. Nginx 구성 문제
    1. 업스트림 시간 초과 값이 잘못됨
    2. 업스트림의 잘못된 프로브 URL
    3. 너무 적은 노동자
    4. 기타.
  2. 운영 체제 TCP / IP 병목 현상
    1. 프록시 자체가 열린 포트 및 상태의 중복을 야기 할 수 있습니다. 파일 디스크립터, 포트, TCP 연결

Nginx 설정을 보지 않으면 아무도 아무도 이전에 댓글을 달 수 없습니다. 그리고 OS의 적절한 출력이 없으면 아무도 후자를 언급 할 수 없습니다.

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