>  Q&A  >  본문

Nginx 역방향 프록시 긴 연결 문제

A, B, C, D, E 서버가 여러 개 있습니다. 그 중 A는 외부 네트워크에 액세스할 수 있지만 다른 서버는 A를 통해 외부 네트워크에 액세스할 수 없습니다. http://api.xxx.com/get/user와 같은 파트너의 인터페이스에 초당 수백 번 액세스할 수 있습니다.

지난 며칠 동안 A와 파트너 서버(Z로 추정) 간의 긴 연결을 유지할 수 있는지 확인하려고 노력했는데, 수정 및 테스트 후에 Z가 반환한 헤더에 이미 http/1.1이 표시되어 있습니다. 연결은 유지되지만 소켓의 대기 시간은 여전히 ​​매우 높습니다. 또한 A의 로그에서 nginx의 $connection 매개 변수가 항상 증가하는 이유는 무엇입니까?

다음은 A:

의 프록시 통과 구성입니다. 으아악

제 구성에 문제가 있는 걸까요? 인터넷을 이해하지 못하고 그냥 헤매고 있는 중입니다. 누군가 지식이 있고 조언을 해주기를 바랍니다. 감사합니다.

PHP中文网PHP中文网2713일 전748

모든 응답(2)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-05-16 17:26:38

    공식 블로그를 보고 이 질문을 전달했기 때문에 확인을 돕기 위해 왔습니다. 직접 해결하셨는지 모르겠습니다

    먼저 구성에 대해 이야기해 보겠습니다. 프록시에 대한 여러 매개변수가 있습니다.
    $host$request_uri 주소는 예를 들어 A 시스템의 10.0.0.100/api/user에 액세스합니다(10.0.0.100으로 가정). 여기서 $host는 10.0.0.100이고 $request_uri는/api/user입니다. 이상한 일이 일어나서 A에 액세스한 다음 A에게 위임합니다. 좀 졸리네요. 이 상황에서는 어떻게 되는지 더 이상 설명하지 않겠습니다$host$request_uri就是指向你原来的地址,例如访问你的A机器(假设为10.0.0.100)的10.0.0.100/api/user,其中$host就是10.0.0.100,$request_uri就是/api/user,所以这里奇葩的事情发生了,访问A然后又代理到A,是不是已经崩溃了,有点儿困,我就不继续解释这种情况下到底会发生什么了,直接说下简单地解决办法
    ----------------就决定是你了,upstream----------------
    这里设你需要访问的外网ip为123.123.123.123,

    upstream backend {
        server 123.123.123.123;
        keepalive 10;
    }
    location / {
        proxy_pass http://$backend;
        proxy_http_version 1.1;
        proxy_ignore_client_abort on;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        proxy_buffer_size 64k;
        proxy_buffers   4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
    
        allow 10.0.0.0/8;
        deny all;
    }
    

    还有就是有些参数你不知道是啥意思,就不要加进去,不一定适合你的业务场景的
    这里着重解释一下upstream里面的这个keepalive ----------------결정은 업스트림의 몫입니다. ----------------
    여기에서 접속에 필요한 외부 네트워크 IP를 123.123.123.123,
    으로 설정하세요. 으아아아

    또한 일부 매개변수의 의미를 모르는 경우 비즈니스 시나리오에 적합하지 않을 수 있으므로 추가하지 마세요

    여기서는 업스트림

    keepalive 매개변수를 설명하는 데 중점을 둡니다. HTTP 1.1 사양에는 HTTP/2와 같은 요청 식별자가 없다는 것을 알고 있습니다. Keepalive TCP 연결은 한 번에 하나의 http 요청만 보낼 수 있으며, 요청이 반환될 때까지 두 번째 요청을 보낼 수 없습니다. 성능 Tengine과 같은 웹서버가 js와 같은 정적 파일을 하나로 병합하는 이유는 무엇입니까(시간과 연결을 절약하기 위해)🎜 여기서 숫자 10을 사용하는 이유는 무엇입니까? 외부 호스트를 요청하고 반환하는 데 100ms가 걸린다고 가정하면 단일 TCP는 초당 100번이라는 요구 사항을 완료하려면 긴 연결이 필요합니다. , 대략적으로 알고리즘은 이렇습니다. 실제 상황에서는 이 수치를 계산된 값보다 적절하게 크게 구성하면 안정성이 더 좋아질 수 있습니다🎜 🎜궁금하신 점은 메시지 남겨주세요🎜

    회신하다
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 17:26:38

    묻고 싶습니다: 현재 백엔드 서버가 동적이라면, nginx와 백엔드의 연결이 긴지 확인하기 위해 업스트림의 연결 유지를 어떻게 사용합니까? 감사해요!

    회신하다
    0
  • 취소회신하다