V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
fyzzy1943
V2EX  ›  NGINX

使用 nginx 和 sse 时候的并发问题

  •  
  •   fyzzy1943 · 2016-07-07 15:34:45 +08:00 · 3478 次点击
    这是一个创建于 3080 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我按照 sse 的教程写了一段代码,大概是下面这个样子的。

      var es = new EventSource('/flush');
      es.addEventListener('message', function(e) {
        var d = JSON.parse(e.data);
        document.getElementById(d.symbol).innerHTML = '<br/>'+d.bid;
      }, false);
    

    自己运行是没什么问题的,浏览器能一直接收到服务器发送过来的数据,然后出现了一个问题,就是同时只有一个人能访问,第二个人访问的时候就是一直转圈加载,如果第一个人把页面关了,第二个人就加载出来了。一开始我以为是并发数的问题,然后上网找了找, nginx 里 worker_connections 是 1024;,都是默认的设置,然后我又改了 worker_processes 和 worker_cpu_affinity ,也没有效果,还是同时只能有一个人访问。

    我想问一下,这个可能是什么原因呢?谢谢了

    8 条回复    2016-07-08 15:20:58 +08:00
    sweb
        1
    sweb  
       2016-07-08 09:38:42 +08:00
    后端是什么? nodejs ?目测后端服务单线阻塞了。
    fyzzy1943
        2
    fyzzy1943  
    OP
       2016-07-08 10:17:03 +08:00
    @sweb 后端是 php 呀
    sweb
        3
    sweb  
       2016-07-08 13:07:11 +08:00
    看看 php 进程数,贴 nginx 配置和 php 代码
    fyzzy1943
        4
    fyzzy1943  
    OP
       2016-07-08 13:53:54 +08:00
    ```
    server {
    listen 80;
    server_name 127.0.0.3;
    root D:/www/www/SSE-learn/public;


    location / {
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }
    ```

    nginx 的配置是这样的,别的都是默认的,版本是 1.11.1

    ```
    set_time_limit(0);

    header('Content-Type: text/event-stream');
    header('X-Accel-Buffering: no');
    while(true) {
    $sleepSecs = mt_rand(250, 500) / 1000.0;
    usleep($sleepSecs * 1000000);

    $bid = mt_rand(1000, 2000) / 1000.0;
    $t = microtime(true);
    $d = array(
    'timestamp' => gmdate('Y-m-d H:i:s', $t) . sprintf('. %03d', ($t*1000)%1000),
    'symbol' => 'funny',
    'bid' => $bid,
    );

    echo 'data:' . json_encode($d) . PHP_EOL . PHP_EOL;
    @ob_flush(); @flush();
    ```

    PHP 代码大概是这样子的,然后想问下 windows 下运行 php-cgi ,是不是就是单进程模式运行的。
    sweb
        5
    sweb  
       2016-07-08 14:01:10 +08:00
    nginx 到 php-cgi 都没有什么问题,应该是你的 php-cgi 只起了一个进程导致的, php-cgi 数量是你可以设置的,一般我们都是在 linux 跑 php-fpm 的组合来玩的。
    fyzzy1943
        6
    fyzzy1943  
    OP
       2016-07-08 14:33:46 +08:00
    @sweb 我今天在找资料的时候发现 windows 似乎没有 fpm ,运行的话就是直接运行一个 php-cgi ,还没找到那个数量的设置,难道要多运行几个嘛?
    fyzzy1943
        7
    fyzzy1943  
    OP
       2016-07-08 14:34:59 +08:00
    D:\www\php708nts\php-cgi.exe -b 127.0.0.1:9000-c D:\www\php708nts\php.ini 就像这样的,直接是打开的 php-cgi
    sweb
        8
    sweb  
       2016-07-08 15:20:58 +08:00
    你需要的是一个 cgi 管理程序,官方集成的是 fpm ,所以你在 win 下不跑 fpm 的话,就得找替代品,要不你就用 apache 去跑, apache 有 php 的 mod ,不然你还真的要手动开启几个 php-cgi ,在 windows 下要不集成 IIS ,要不跑个集成包吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:43 · PVG 03:43 · LAX 11:43 · JFK 14:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.