2016-06-17 5 views
3

서버 푸시 기능을 사용하여 Onlineshop을 http2로 업데이트하려고하지만 nginx와 같은 웹 서버용 솔루션을 찾을 수 없습니다 (프록시 및 일부 경우) Upstream http2와 함께. 우리는 순간에 노드 http 모듈과 함께 nodejs를 사용하지만 노드 spdy 모듈로 전환합니다. spdy 모듈은 Server Push로 http2를 지원합니다. habe는 hgin을 nginx의 대안으로 시도했지만 http2 Upstream도 지원하지 않습니다.Nodejs의 push와 함께 Nodejs http2 (nginx 또는 기타 웹 서버)

나는 종류의 순간에 잃고 Nginx와의 1.13.9이 그것을 컴파일 당신은 밖으로 상자의 HTTP/2 서버 푸시를 가질 수있어 (다만 오늘 메인 라인에 푸시) 후

+0

Nginx 1.9.5+는 외부 모듈을 사용하지 않고 HTTP/2를 지원합니다. –

+0

예, 서버 푸시 없음, http2 업스트림 없음 –

+1

솔루션을 찾았습니까? – mz3

답변

0

도움이 필요하고 ngx_http_v2_module.

최근 추가에 관심이 있으시면 대부분의 기능을 추가 한 커밋 인 hg.nginx.org: HTTP/2: server push입니다.

그것의 사용은 비교적 간단합니다 : 노드를 프록시하는 서버에 http2_push_preload 지시문을 추가 한 다음 Link 헤더의 노드 메이크업의 사용으로합니다 (W3 사양에 설명 된대로 - https://www.w3.org/TR/preload/#server-push-http-2) 다음 nginx를 보내는의 일을 할 것입니다 서버 푸시를 나타내는 h2 프레임

예를 들어 index.html을 제공하지만 image.svg을 클라이언트에 푸시하는 / 끝 점이 있다고 가정합니다. 업스트림 서버를 구성하고 서버 구성의 수의 nginx에서

서버 구성에 http2_push_preload 사용 : 평소 원하는만큼

# Add an upstream server to proxy requests to. 
upstream sample-http1 { 
    server localhost:8080; 
} 


server { 
    # Listen on port 8443 with http2 support on. 
    listen     8443 http2; 


    # Enable TLS such that we can have proper HTTP2 
    # support using browsers. 
    ssl on; 
    ssl_certificate   certs/cert_example.com.pem; 
    ssl_certificate_key  certs/key_example.com.pem; 


    # Enable support for using `Link` headers to indicate 
    # origin server push. 
    http2_push_preload on; 


    # Act as a reverse proxy for requests going to /proxy/*. 
    # 
    # Because we don't want to rewrite our endpoints in the 
    # Node app, rewrite the path such that `/proxy/lol` ends up 
    # as `/lol`. 
    location/{ 
    proxy_pass  http://sample-http1; 
    } 
} 

는 그 다음 NodeJS 응용 프로그램에서, 당신은 /를 제공 싶지만 응답에 추가 Link 헤더를 추가 :

response.setHeader('Link', '</image.svg>; rel=preload; as=image'); 

PS : 그래, 당신이 그 꺾쇠 괄호를 유지하는 것; 나는 당신이 그들을 대체해야한다는 의미는 아닙니다.

그런데 방금 준 예제 (일부 디버깅 팁 포함)는 여기 https://ops.tips/blog/nginx-http2-server-push/에 작성되었습니다.

0

Nginx는 only just added support for HTTP/2 Push입니다. 최신 메인 라인 버전을 문지르지 않으면이 작업을 수행 할 수 없습니다. 또한 그것이 새롭기 때문에 또한 there are still some issues with it. Nginx는 백엔드 연결을 통해 http2를 지원하지 않습니다 (그리고 stated they won’t support this을 가짐). 따라서 사용자가 제안한 것처럼 다운 스트림 시스템에서 모든 것을 직접 밀어 낼 수는 없습니다.

어쨌든 푸시하는 것이 가장 좋은 방법인지 여부에 대한 질문이 있습니다. 다운 스트림 시스템은 클라이언트가 예를 들어 푸시를 지원하지 않더라도 업스트림 프록시 서버로 푸시 할 수 있습니다. 이는 낭비되는 푸시입니다.

더 좋은 방법은 프록시에서 푸시 다운 스트림 시스템이 (링크 헤더를 통해) 해당 푸시를 수행하도록 업스트림 시스템에 알려주는 것입니다. 이것은 다운 스트림 시스템이 제어 할 수없는 자산 (예 : 스타일 시트, JavaScript, 이미지 등의 정적 자산), 이미 푸시 된 자산 (캐시 다이제스트)의 중앙 저장소, HTTP/2를 완전히 지원해야합니다 (링크 헤더는 HTTP/1.1처럼 HTTP/2처럼 쉽게 전송할 수 있습니다).

링크 헤더를 통해 업스트림 프록시를 푸시하는 주된 단점은 링크 헤더가 응답에서 읽힐 때 요청 된 리소스가 준비 될 때까지 기다려야한다는 것입니다. 요청 리소스가 생성되는 데 약간의 시간이 걸리면 처리되는 동안 다른 리소스를 밀어 시작하는 것이 더 유리할 수 있습니다. 이것은 새로운 103 Early Hints HTTP Status code에 의해 해결되며 나중에 주 200 상태 코드를 보내기 전에 먼저 답장을 보낼 수 있습니다. 이 초기 메시지에는 업스트림 프록시에서 읽을 수 있고 리소스를 푸시하는 데 사용할 수있는 링크 헤더가있을 수 있습니다. 나는 Nginx 구현이 이것을 지원할 지 확신하지 못한다.

덧붙여서 Apache는 잠시 동안 Push를 지원했으며 훨씬 더 성숙한 구현을합니다. 직접 아파치 설정이나 링크 헤더를 통해 지원합니다 (기본적으로 호환성 문제로 인해 전송되지 않도록 구성된 103 응답 포함). 위에 설명 된 이유로 does not support direct push over back end connections이지만 HTTP/2를 통한 백엔드 프록시도 지원합니다. 잘 알려지지 않은 다른 서버 (예 : H2O)는 Nginx보다 HTTP/2를 지원합니다.

마지막으로 CDN을 사용하는 경우 백엔드 인프라를 업그레이드하지 않고도 CDN을 사용하여 HTTP/2 푸시 (링크 헤더를 통해)를 지원할 수 있습니다. 사실 Cloudflare는 Nginx 기반의 CDN으로 had HTTP/2 Push for a while이고 실제로는 two Cloudflare engineers which have back ported their implementation to the base Nginx code입니다.

관련 문제