nginx comet
13121 단어 nginx
실시 간 인터넷 프로그램, 예 를 들 어 온라인 채 팅 등 을 하려 면 현재 의 기술 은 두 가지 가 있 는데 하 나 는 당 김 (pull) 이 고 하 나 는 밀어 내 는 것 이다.(push) 어떤 방식 이 좋 은 지 저 는 네트워크 를 접 하 는 친구 들 이 알 고 있 습 니 다. 서버 측 푸 시 서비스 라 는 방식 은 완전한 실시 간 상호작용 을 만족 시 킬 수 있 고 클 라 이언 트 가 너무 많은 것 을 할 필요 가 없다 고 믿 습 니 다. NGiNX HTTP Push Module 이라는 nginx 플러그 인 은 바로 이 목적 을 위해 만 든 것 입 니 다. 클 라 이언 트 의 긴 연결 상 태 를 유지 합 니 다.(물론 모든 고객 의 스 레 드 가 아니 라 이벤트 방식 으로 처리 합 니 다. 즉, 연결 상 태 를 유지 하고 자원 을 절약 합 니 다. 이것 이 바로 nginx 라 는 경량급 웹 서버 의 귀여운 점 입 니 다) 그리고 이벤트 대기 열 을 유지 하고 게시 자 와 구독 자 서 비 스 를 제공 합 니 다.
그것 을 사용 하려 면 ngnix 를 컴 파일 해 야 합 니 다.http://pushmodule.slact.net/모듈 다운로드, 사용
./configure --add-module=/path/to/plugin && make && make install
컴 파일 하고 참고 하 세 요.http://github.com/slact/nginx_http_push_module/blob/master/protocol.txt이 두 파일 은 설정 을 배 웁 니 다. 다음은 비교적 간단 한 게시, 구독 모델 입 니 다.
nginx-push.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] $request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
# max allowed memory for buferring
push_max_reserved_memory 10M;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
###### Push configuration
# internal publish endpoint (keep it private / protected)
location /publish {
set $push_channel_id $arg_id; #/?id=239aff3 or somesuch
push_publisher;
push_store_messages on; # enable message queueing
push_message_timeout 2h; # expire buffered messages after 2 hours
push_max_message_buffer_length 10; # store 10 messages
push_min_message_recipients 0; # minimum recipients before purge
}
# public long-polling endpoint
location /activity {
push_subscriber;
# how multiple listener requests to the same channel id are handled
# - last: only the most recent listener request is kept, 409 for others.
# - first: only the oldest listener request is kept, 409 for others.
# - broadcast: any number of listener requests may be long-polling.
push_subscriber_concurrency broadcast;
set $push_channel_id $arg_id;
default_type text/plain;
}
###### END Push configuration
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
이것 은 ruby 인 스 턴 스 입 니 다.
require 'rubygems'
require 'em-http'
def subscribe(opts)
listener = EventMachine::HttpRequest.new('http://127.0.0.1/activity?id='+ opts[:channel]).get :head => opts[:head]
listener.callback {
# print recieved message, re-subscribe to channel with
# the last-modified header to avoid duplicate messages
puts "Listener recieved: " + listener.response + "
"
modified = listener.response_header['LAST_MODIFIED']
subscribe({:channel => opts[:channel], :head => {'If-Modified-Since' => modified}})
}
end
EventMachine.run {
channel = "pub"
# Publish new message every 5 seconds
EM.add_periodic_timer(5) do
time = Time.now
publisher = EventMachine::HttpRequest.new('http://127.0.0.1/publish?id='+channel).post :body => "Hello @ #{time}"
publisher.callback {
puts "Published message @ #{time}"
puts "Response code: " + publisher.response_header.status.to_s
puts "Headers: " + publisher.response_header.inspect
puts "Body:
" + publisher.response
puts "
"
}
end
# open two listeners (aka broadcast/pubsub distribution)
subscribe(:channel => channel)
subscribe(:channel => channel)
}
위의 이 예 는 5 초 마다 메 시 지 를 발표 하 는 동시에 nginx 서버 는 메 시 지 를 구독 클 라 이언 트 에 Push 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.