IT Share you

Nginx를 통한 EventSource / 서버 전송 이벤트

shareyou 2020. 11. 16. 23:13
반응형

Nginx를 통한 EventSource / 서버 전송 이벤트


stream블록 과 함께 Sinatra를 사용하는 서버 측에서 .

get '/stream', :provides => 'text/event-stream' do
  stream :keep_open do |out|
    connections << out
    out.callback { connections.delete(out) }
  end
end

클라이언트 측 :

var es = new EventSource('/stream');
es.onmessage = function(e) { $('#chat').append(e.data + "\n") };

를 통해 직접 앱을 사용하면 http://localhost:9292/모든 것이 완벽하게 작동합니다. 연결은 지속적이며 모든 메시지가 모든 클라이언트에 전달됩니다.

그러나 Nginx,를 통과 http://chat.dev하면 연결이 끊어지고 매초마다 재 연결이 발생합니다.

Nginx 설정은 나에게 괜찮아 보입니다.

upstream chat_dev_upstream {
  server 127.0.0.1:9292;
}

server {
  listen       80;
  server_name  chat.dev;

  location / {
    proxy_pass http://chat_dev_upstream;
    proxy_buffering off;
    proxy_cache off;
    proxy_set_header Host $host;
  }
}

시도 keepalive 1024upstream섹션뿐만 아니라 proxy_set_header Connection keep-alive;에서 location.

아무것도 도움이되지 않습니다 :(

클라이언트에 전달되지 않는 지속적인 연결 및 메시지가 없습니다.


Nginx 구성이 정확하고 몇 줄만 놓쳤습니다.

다음은 EventSourceNginx를 통해 작업 하는 "마술 트리오"입니다 .

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;

로 배치 location부와 그것을 작동합니다.

추가해야 할 수도 있습니다.

proxy_buffering off;
proxy_cache off;

그것은 공식적인 방법이 아닙니다.

나는 이것을 "시행과 오류"+ "인터넷 검색"으로 끝냈다. :)


또 다른 옵션은 값이 'no'인 'X-Accel-Buffering'헤더를 응답에 포함하는 것입니다. Nginx는이를 특별히 취급합니다. http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering을 참조 하십시오.


이것을 처음부터 직접 쓰지 마십시오. Nginx는 멋진 이벤트 서버이며 업스트림 서버의 성능 저하없이 SSE를 처리하는 모듈이 있습니다.

https://github.com/wandenberg/nginx-push-stream-module 확인

작동 방식은 구독자 (SSE를 사용하는 브라우저)가 Nginx에 연결하고 연결이 중지되는 것입니다. 게시자 (Nginx 뒤의 서버)는 해당 경로에서 Nginx에 POST를 보내고 그 순간 Nginx는 브라우저에서 대기중인 EventSource 리스너로 즉시 전달합니다.

이 방법은 루비 웹 서버가 이러한 "긴 폴링"SSE 연결을 처리하는 것보다 훨씬 더 확장 가능합니다.

참고 URL : https://stackoverflow.com/questions/13672743/eventsource-server-sent-events-through-nginx

반응형