рдорд┐рдирдЯ рдореЗрдВ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдкрд░ рд░реАрдпрд▓рдЯрд╛рдЗрдо

рдЦреЗрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдзрд┐рдХрддрдо рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдзреВрдордХреЗрддреБ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗред
рдкрд╣рд▓реА рдмрд╛рдЗрдХ dklab realplexor рдкрд░ рдмрдирд╛рдИ рдЧрдИ рдереА, рдЬреЛ рдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдореНрдореАрдж рдереА, рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХрд╛ рдЕрдЧрд▓рд╛ рдкреНрд░рдпрд╛рд╕ рдерд╛ред рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рд╣рд╛рде рдЯреЗрдврд╝реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рд╣рдо 5-10-15 рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реА рдХреЗ рдмрд┐рдирд╛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдПред
рдПрдХ рдирдЦрд░реЗ рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдордиреЗ nginx_http_push_module рдкрд░ рд░реБрдХрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдмрд┐рддрд╛рдпрд╛ рдЧрдпрд╛ рд╕рдордп рдЕрднреА рднреА рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдерд╛ред

рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ:


рдХрдорд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реНрддрд░ рдкрд░ рдПрдХ рд╕рд╛рде рдХрдИ рдЪреИрдирд▓реЛрдВ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдХреЛ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЪреИрдирд▓ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдИ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХрдо рд╕рдордп (рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╕рдордп) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдХрдореА рд╣реИред

рдЬреЗрдПрд╕рдЧрд▓ рдиреЗ рдЬреЗрдПрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХреА, рдЬрд┐рд╕рдиреЗ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛:

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');?>"; /* * !        ,      ,   index.php,     JS ,    . */ 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); }); /* *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) { /* * $cids - ID ,  ,     - ID  * $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); } // push (1, ""); // push (array(1, 2, 3), ""); // push (array('chanel_1' => 1, 'chanel_2' => 'user_100500', 'chanel_3' => 'global'), ""); 


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; 


рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╣рд╛рдВ рд░рдЦреЗрдВ:

 #!/bin/sh ### BEGIN INIT INFO # Provides: nginx # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts the nginx web server # Description: starts nginx using start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/nginx NAME=nginx DESC=nginx # Include nginx defaults if available if [ -f /etc/default/nginx ]; then . /etc/default/nginx fi test -x $DAEMON || exit 0 set -e . /lib/lsb/init-functions test_nginx_config() { if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1; then return 0 else $DAEMON -t $DAEMON_OPTS return $? fi } case "$1" in start) echo -n "Starting $DESC: " test_nginx_config # Check if the ULIMIT is set in /etc/default/nginx if [ -n "$ULIMIT" ]; then # Set the ulimits ulimit $ULIMIT fi start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON || true sleep 1 test_nginx_config start-stop-daemon --start --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; reload) echo -n "Reloading $DESC configuration: " test_nginx_config start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; configtest|testconfig) echo -n "Testing $DESC configuration: " if test_nginx_config; then echo "$NAME." else exit $? fi ;; status) status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $? ;; *) echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2 exit 1 ;; esac exit 0 


рдФрд░ рдЕрдм
 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
рдЗрд╕ рддрдХрдиреАрдХ рдкрд░, рд▓рдбрд╝рд╛рдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреА рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ), рдХреИрд╕реАрдиреЛ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ / рдЦрд░реНрдЪ рдХрд░рдиреЗ рдФрд░ рдХрдИ рдЕрдиреНрдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ред

Source: https://habr.com/ru/post/In139339/


All Articles