рдЦреЗрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдзрд┐рдХрддрдо рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдзреВрдордХреЗрддреБ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗред
рдкрд╣рд▓реА рдмрд╛рдЗрдХ dklab realplexor рдкрд░ рдмрдирд╛рдИ рдЧрдИ рдереА, рдЬреЛ рдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдореНрдореАрдж рдереА, рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХрд╛ рдЕрдЧрд▓рд╛ рдкреНрд░рдпрд╛рд╕ рдерд╛ред рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рд╣рд╛рде рдЯреЗрдврд╝реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рд╣рдо 5-10-15 рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реА рдХреЗ рдмрд┐рдирд╛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдПред
рдПрдХ рдирдЦрд░реЗ рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдордиреЗ
nginx_http_push_module рдкрд░
рд░реБрдХрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдмрд┐рддрд╛рдпрд╛ рдЧрдпрд╛ рд╕рдордп рдЕрднреА рднреА рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдерд╛ред
рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ:
- рдПрдХ рдЕрдХреНрд╖рдо рдХреИрд╢ рдШрдЯрдирд╛рдУрдВ рдХреА рд╣рд╛рдирд┐ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ (250 рдкрд╛рд╕ рдХрд╛ рдПрдХ рдЪрдХреНрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдХреЗрд╡рд▓ 3 рдЗрд╡реЗрдВрдЯ рджреЗрддрд╛ рд╣реИ)ред
- рд╢рд╛рдорд┐рд▓ рдХреИрд╢ рдЕрдВрддрд┐рдо рдИрд╡реЗрдВрдЯ рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рдХрдорд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реНрддрд░ рдкрд░ рдПрдХ рд╕рд╛рде рдХрдИ рдЪреИрдирд▓реЛрдВ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдХреЛ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЪреИрдирд▓ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдИ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХрдо рд╕рдордп (рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╕рдордп) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдХрдореА рд╣реИред
рдЬреЗрдПрд╕рдЧрд▓ рдиреЗ рдЬреЗрдПрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХреА, рдЬрд┐рд╕рдиреЗ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛:
function Listener(url, successCallback, failureCallback) { var scope = this; var etag = 0, lastModified = 0; var launched = false; var failure = false; this.successTimeout = 0; this.failureTimeout = 5000; var getTimeout = function () { return failure ? this.failureTimeout : this.successTimeout; }; var listen = function () { $.ajax(scope.ajaxOptions); } var beforeSend = function (jqXHR) { jqXHR.setRequestHeader("If-None-Match", etag); jqXHR.setRequestHeader("If-Modified-Since", lastModified); }; var complete = function (jqXHR) { var timeout = getTimeout(); etag = jqXHR.getResponseHeader('Etag'); lastModified = jqXHR.getResponseHeader('Last-Modified'); var timeout = jqXHR.statusText == 'success' ? scope.successTimeout : scope.failureTimeout; if (timeout > 0) { setTimeout(listen, timeout); } else { listen(); } }; this.ajaxOptions = { url : url, type : 'GET', async : true, error : failureCallback, success : successCallback, dataType : 'json', complete : complete, beforeSend : beforeSend, timeout: 1000 * 60 * 60 * 24 }; this.start = function (timeout) { if (!launched) { if (typeof(timeout) == 'undefined' || timeout == 0) { listen(); } else { setTimeout(listen, timeout); } launched = true; } }; }
рддрдореНрдмреБрдУрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдиреГрддреНрдпреЛрдВ рдиреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдЙрд╕реЗ рдХреЛрдард░реА рдореЗрдВ рдЙрд╕рдХреЗ рдХрдВрдХрд╛рд▓ рднреА рдорд┐рд▓реЗ рд╣реИрдВ:
- рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрдИ рдИрд╡реЗрдВрдЯ рдЖрдП рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдПрдХ рдкреЗрдЬ рд░рд┐рдлреНрд░реЗрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд┐рд░ рд╕реЗ (рдХреИрд╢ рд╕реЗ) рдЖ рдЬрд╛рдПрдВрдЧреЗред
- рдпрджрд┐ рдЯреИрдм рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИ, рддреЛ рдЕрдиреБрд░реЛрдз рдорд░ рдЧрдпрд╛ рдФрд░ рдЕрдм рдкреГрд╖реНрда рддрд╛рдЬрд╝рд╛ рд╣реЛрдиреЗ рддрдХ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реБрдЖред
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
var etag = 0, lastModified = 0;
рдкрд░
var etag = 0:
lastModified = LOAD_TIME;
рдЬрд╣рд╛рдВ
LOAD_TIME рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреИрд╕реЗ
var LOAD_TIME = "<?=date('r');?>";
рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛, рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА рдХрд┐ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛
timeout: 1000 * 60 * 60 * 24
рдкрд░
timeout: 1000 * 20
рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕ рд╕реЗрдХрдВрдб (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╖реНрдЯрддрдо рдЕрдВрддрд░рд╛рд▓ 20 рд╕реЗрдХрдВрдб рдерд╛) рдирдЧрдиреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрд░ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдмрдирд╛рдирд╛ред
рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ, рдЙрд╕реЗ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЯрдХреНрдХрд░ рдорд┐рд▓реА - рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рдШрдЯрдирд╛рдУрдВ рдХреА рдирд╛рд░рдХреАрдп рдмрд╛рдврд╝ рд╢реБрд░реВ рд╣реБрдИред рд╕реНрдерд┐рддрд┐ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╕рд╛рдВрддреНрд╡рдирд╛ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдЬрдм рдХреНрд╡рд┐рдХрд░ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдкреВрд░рд╛ рд╣реИрдВрдбрд▓рд░ рд╣реЗрдбрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рдЖрдИрдл-рдиреЛ-рдореИрдЪ рдФрд░ рдЗрдл-рдореЙрдбрд┐рдлрд╛рдЗрдб-рдЪреВрдВрдХрд┐-рд░рд┐рдХреНрдд рдерд╛ред
рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдп рдорд┐рд▓рд╛:
<script> var LOAD_TIME = "<?=date('r');?>"; function Listener(url, successCallback, failureCallback) { var scope = this; var etag = 0; var lastModified = LOAD_TIME; var launched = false; var failure = false; this.successTimeout = 1000; this.failureTimeout = 0; var getTimeout = function () { return failure ? this.failureTimeout : this.successTimeout; }; var listen = function () { $.ajax(scope.ajaxOptions); } var beforeSend = function (jqXHR) { jqXHR.setRequestHeader("If-None-Match", etag); jqXHR.setRequestHeader("If-Modified-Since", lastModified); cw("BEFORE None-Match : "+etag); cw("BEFORE Modified : "+lastModified); }; var complete = function (jqXHR) { var timeout = getTimeout(); if (jqXHR.getResponseHeader('Etag') != null && jqXHR.getResponseHeader('Last-Modified') != null) { etag = jqXHR.getResponseHeader('Etag'); lastModified = jqXHR.getResponseHeader('Last-Modified'); } var timeout = jqXHR.statusText == 'success' ? scope.successTimeout : scope.failureTimeout; if (timeout > 0) { setTimeout(listen, timeout); } else { listen(); } }; this.ajaxOptions = { url : url, type : 'GET', async : true, error : failureCallback, success : successCallback, dataType : 'json', complete : complete, beforeSend : beforeSend, timeout: 1000 * 20 }; this.start = function (timeout) { if (!launched) { if (typeof(timeout) == 'undefined' || timeout == 0) { listen(); } else { setTimeout(listen, timeout); } launched = true; } }; this.start(); } </script>
рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЙрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
<script> $(document).ready(function() { Listener('/listener?cid=chanel_1', onSuccess, onError); }); function onSuccess (data) { if (data) { $("#messages").prepend(data.time + " | " +data.msg); } else { console.log("EMPTY DATA"); } } function onError () { alert("ERROR"); } </script>
рдЪреВрдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рдЪреИрдирд▓реЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ, рд╣рдордиреЗ рдЕрдкрдирд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
Php рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
<? function push ($cids, $text) { $c = curl_init(); $url = 'http://server_name/publisher?cid='; $message = array( 'time' => time(), 'msg' => $text ); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_POST, true); if (is_array($cids)) { foreach ($cids as $v) { curl_setopt($c, CURLOPT_URL, $url.$v); curl_setopt($c, CURLOPT_POSTFIELDS, json_encode($message)); $r = curl_exec($c); } } else { curl_setopt($c, CURLOPT_URL, $url.$cids); curl_setopt($c, CURLOPT_POSTFIELDS, json_encode($message)); $r = curl_exec($c); } curl_close($c); }
Dklab Realplexor рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд╕рд╛рде, рдбреЗрд╡рд▓рдкрд░ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ (http://dklab.ru/lib/dklab_realplexor) рдкрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдИ рдФрд░ рдкреВрд░реНрдг рдкреНрд░рд▓реЗрдЦрди рдЙрдкрд▓рдмреНрдз рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐,
nginx_http_push_module рдХреЗ рд╕рд╛рде
, рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рддреИрдпрд╛рд░ рдкреИрдХреЗрдЬ рдЦреЛрдЬрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ рдЬрд┐рд╕рдореЗрдВ
CentOS рдкрд░ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд╕реНрд░реЛрдд рд╕реЗ рд╕рдм рдХреБрдЫ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
рдПрдХ рдбреИрдбреА рдмрдирд╛рдПрдВ рдЬрд╣рд╛рдВ рд╣рдо рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрдЧреЗ
mkdir ~/nginx_push; cd ~/nginx_push;
рдЧрд┐рддреБрдм рд╕реЗ рдирд╡реАрдирддрдо рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
git clone git://github.com/slact/nginx_http_push_module.git
Nginx рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ nginx-1.1.15 рд╣реИ
wget http://nginx.org/download/nginx-1.1.15.tar.gz;
рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz; wget http://zlib.net/zlib-1.2.6.tar.gz;
рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдХреЛ рдЕрдирдкреИрдХ рдХрд░реЗрдВ:
tar -zxf nginx-1.1.15.tar.gz; tar -zxf pcre-8.21.tar.gz tar -zxf zlib-1.2.6.tar.gz
Nginx рд╕реНрд░реЛрдд рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ
cd nginx-1.1.15;
рдФрд░ nginx рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client/ --http-proxy-temp-path=/tmp/nginx/proxy/ --http-fastcgi-temp-path=/tmp/nginx/fcgi --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.6 --with-http_perl_module --with-http_stub_status_module тАУadd-module=../nginx_http_push_module/
рддреЛ
make make install
рдЕрдм рдлрд╛рдЗрд▓ /etc/init.d/nginx рдмрдирд╛рдПрдВ
nano /etc/init.d/nginx;
рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╣рд╛рдВ рд░рдЦреЗрдВ:
рдФрд░ рдЕрдм
chkconfig --add nginx chkconfig --level 345 nginx on
рд╡рд╣ рд╕рдм рд╣реИред рдЗрд╕ рдкрд░, nginx рд╕реНрдерд╛рдкрдирд╛ рдкреВрд░реНрдг рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдЖрдк nginx'a рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
service nginx start
рдЕрдм рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:
/ рдкреНрд░рдХрд╛рд╢рдХ - рдЪреИрдирд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдХреЛрдИ рднреА рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред
location /publisher { // , ?cid= set $push_channel_id $arg_cid; push_publisher; push_message_timeout 1m; // push_message_buffer_length 20000; // allow 127.0.0.1; deny all; }
/ рд╢реНрд░реЛрддрд╛ - рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рдФрд░ рдЪреИрдирд▓ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
location /listener { // , ?cid= set $push_channel_id $arg_cid; push_subscriber; push_subscriber_concurrency broadcast; default_type text/plain; }
рдпрд╣ рд╕рдм рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИред рд╕рдорд╛рдзрд╛рди рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХреНрд░реЙрд╕рдбреЛрдореЗрди-рдПрдЬреИрдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реБрдИрдВ, рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдореБрдЦреНрдп рд╢рд╛рдЦрд╛ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЛрдИ рдЬреЛрдВрд╕рдк рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди, рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (https://github.com/Kronuz/nginx_http_push_module) рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рдВрдЯрд╛ рдорд┐рд▓рд╛ред рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореВрд▓ рд╕реЗ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИред
рд╕реНрдерд╛рди / рд╢реНрд░реЛрддрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ jsonp рд╕рдорд░реНрдерди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛
// /?callback= push_channel_jsonp_callback $arg_callback;
рдЕрдм, рдХреЙрд▓рдмреИрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдбреЗрдЯрд╛ рдХреЛ jsonp рдореЗрдВ рд▓рдкреЗрдЯ рджреЗрдЧрд╛ред
рдХреЛрдИ рдЕрд▓рдЧ рдбреЗрдореЛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реАрдХреЗ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдореЗрдВ рд▓рд╛рдЗрд╡ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ -
vk.com/app2814545рдЗрд╕ рддрдХрдиреАрдХ рдкрд░, рд▓рдбрд╝рд╛рдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреА рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ), рдХреИрд╕реАрдиреЛ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ / рдЦрд░реНрдЪ рдХрд░рдиреЗ рдФрд░ рдХрдИ рдЕрдиреНрдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ред