Nginx 411 오류 반환

5985 단어 nginx
Nginx 411 오류 반환
오늘 form 을 제출 할 때 411 오류 가 발생 했 습 니 다. 그 당시 에 저 는 과문 하고 411 을 처음 만 났 습 니 다. 조사 한 후에 멘 붕 이 발생 했 습 니 다. nginx 가 직접 요 구 를 되 돌려 주 었 습 니 다. 깊이 조사 한 결과 이 문 제 는 매우 쉽게 발생 할 수 있 었 습 니 다. 그래서 저 는 이상 하 게 예전 의 개발 에서 만난 적 이 없 었 습 니까?그러나 나 쁜 습관 으로 인 한 문제 이기 도 합 니 다. 생산 환경 테스트 환경 은 nginx 가 없 는데 유독 제품 서버 에 서 는 '나 쁘 죠?'
411 원인
nginx 가 내 놓 은 공식 설명 은 nginx 탄 411 회 를 유발 하 는 세 가지 상황 이 있다.
  • client sent invalid “Content-Length” header
  • client sent … method without “Content-Length” header
  • client sent “Transfer-Encoding: chunked” header

  • 제 장면 은 이 렇 습 니 다. httpclient 4 (자바) 로 api 서 비 스 를 호출 합 니 다. 이 api 가 사용 하 는 server 는 nginx 입 니 다. multipart 를 사용 하여 그림 파일 을 제출 할 때 파일 의 실제 길 이 를 무시 하거나 생략 했 기 때문에 (firebug 를 통 해 발견) request header 에 Content - Length 가 전혀 없습니다. 그것 은 위의 두 번 째 상황 에 부합 합 니 다.
    코드 를 고치다
    그리고 나 서 나 는 코드 수정 을 통 해 해결 하려 고 했 지만 httpclient 는 매우 딱딱 해서 나 는 한 마디 썼 다.
    1
    
    header httppost.setHeader("Content-Length", "0"); 

    그것 은 바로 잘못 보고 했다.
    1
    
    org.apache.http.ProtocolException: Content-Length header already present at org.apache.http.protocol.RequestContent.process(RequestContent.java:67) ...... 

    가방 밖에서 고치 기 가 쉽 지 않 은 것 같 습 니 다. 됐 습 니 다. 계속 구 글 을 하 세 요. 합 리 적 인 방법 이 있 을 겁 니 다. 코드 를 바 꾸 지 마 세 요.
    다시 컴 파일 nginx
    그래서 구 글 은 한 바퀴 돌 고 이 문장 똑 같은 문 제 를 만 났 습 니 다. 위 에서 말 한 세 번 째 상황 일 뿐 입 니 다. 그런데 다행히도 제 가 해결 하 는 방법 이 똑 같 을 수 있다 는 것 을 깨 달 았 습 니 다. nginx 에 Chunkin 모듈 을 추가 해 주 었 습 니 다. 한다 면 하 겠 습 니 다. nginx 의 wik i 와 이 문장 를 참고 하여 외부 모듈 을 순조롭게 추가 할 수 있 습 니 다. 쉽게 말 하면 다음 과 같은 몇 가지 단계 입 니 다.
  • 새 nginx (또는 원래 nginx 코드 가 있 습 니까?) 를 다운로드 하고 nginxHttpChunkinModule 을 다운로드 한 다음 압축 을 풀 었 습 니 다. (다운로드 주소 가 맞지 않 습 니 다. 전자 버 전 업데이트 가 빠 르 고 후 자 는 최근 에 DELETE 지원 방법 을 업데이트 하기 시 작 했 습 니 다)
  • nginx -V 이전에 nginx 를 컴 파일 했 을 때의 인 자 를 찾 아 기록 하 세 요
  • ./configure 그리고 매개 변 수 를 더 해 야 한다. 특히 --add-module=/path/to/your/module
  • 을 더 해 야 한다.
  • make (당장 make install
  • nginx 를 멈 추 지 않 고 새 버 전 으로 부 드 럽 게 넘 어 갑 니 다.
    이것 이 야 말로 가장 기술적 인 일이 다.
  • 원래 nginx 실행 가능 한 파일 을 백업 합 니 다. 예 를 들 어 nginxbak
  • cp obj/nginx 오래된 nginx 실행 가능 한 파일 의 위치 까지 아직 뛰 고 있 기 때문에 인자 -f
  • 를 추가 해 야 합 니 다.
  • kill -USR2 nginx ps aux | grep nginx 로 메 인 프로 세 스 를 제외 하고 워 커 프로 세 스 가 하나 더 있 습 니 다. 그 다음 에 ps 는 새로운 nginx 프로 세 스 가 시작 되 고 새로운 워 커 프로 세 스 도 시작 되 는 것 을 발견 할 수 있 습 니 다. 이때 동시에 작업 을 합 니 다.
  • kill - WHINCH nginx 오래된 nginx 프로 세 스 가 새로운 요청 을 처리 하지 않 게 합 니 다. 시간 이 지나 면 ps 를 사용 하면 오래된 worker process 가 사라 지고 멈 추 는 것 을 볼 수 있 습 니 다. 이 때 모든 요청 은 새로운 nginx 에 게 맡 깁 니 다.
  • kill -QUIT nginx 오래된 프로 세 스 를 종료 하면 새로운 프로 세 스 를 사용 할 수 있 습 니 다.
  • 물론 이 부 드 러 운 과도 적용 버 전 업그레이드 등 각종 nginx 실행 가능 한 파일 을 교체 하 는 경우 가 있 으 므 로 새 버 전이 좋 지 않 은 것 을 발견 하면 되 돌아 갈 때 어떻게 해 야 하 는 지 추가 로 말씀 드 리 겠 습 니 다.
  • kill -HUP nginx reload 프로필 없 이 오래된 nginx
  • 를 다시 시작 합 니 다.
  • kill -QUIT nginx 새로운 Nginx 인 스 턴 스 를 여 유 롭 게 닫 습 니 다
  • kill -TERM nginx 이거 랑 위 에 거 둘 중 에 하 나 를 고 를 수 있어 요.
  • 이후 이전의 nginxbak 다시 복사 해서 새 것 덮어 쓰기
  • 물론 이상 은 문명인 의 방법 이 었 고, 폭행 을 하려 고 해도 되 었 다...............................................
    nginx 프로필 수정
    그리고 새 모듈 이 유효 하도록 설정 을 바 꿔 야 합 니 다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    chunkin on; error_page 411 = @my_411_error; location @my_411_error {  chunkin_resume; } location /foo {  # your fastcgi_pass/proxy_pass/set/if and  # any other config directives go here... } ... 

    이렇게 고 친 후에 reload nginx 는 정상적으로 작 동 할 수 있 습 니 다. 상세 한 설정 방법 은 참고 하 시기 바 랍 니 다 wiki 감사합니다.
    그러면 여기까지 하기 전의 문 제 는 해결 되 었 습 니 다. 기록 해 보 세 요. 다른 환경 에서 비슷 한 문 제 를 만 나 지 못 했 기 때 문 입 니 다.
    이상

    좋은 웹페이지 즐겨찾기