Nginx + (nodejs, socketio, express) + php网站

5
我正在开发一个完全基于js、HTML5画布的游戏,希望使其“实时”。通过我的研究,我发现node.js是一个令人兴奋的选择,因此我在我的Ubuntu 12 Web服务器上配置了它,并使用了socket.io、express等工具。
虽然我是一名程序员,但在Web服务器后端领域中只是初学者,这就是为什么我需要你的帮助。我对整个系统模型感到困惑,想要澄清它的工作原理。也许我在短时间内阅读了太多文章。
首先:我在我的Web服务器上运行nginx 1.2.x。据我所知,nginx负责处理请求,专用于端口80(对我来说),并服务于HTTP请求(还使用php-fpm来提供PHP)。 然后,我在端口8080上成功运行了一个nodejs服务器。由于其特性和协议,我希望通过websocket连接(但由于nginx尚不支持websocket,所以我对发生了什么感到困惑)。
如果我去http://mydomain.tld:8080,这会通过node服务器并避开nginx吗?在这种情况下,连接可以通过websocket进行,而不会退回到xhr或其他任何方式(我不希望这样,因为它不易扩展),对吗?
那么要在http://mydomain.tld/game/获得同样的效果,我应该怎么做?只需要在nginx.conf中将请求代理到node服务器上吗?像这样:
 # if a file does not exist in the specified root and nothing else is definded, we want to serve the request via node.js
try_files   $uri    @nodejs;          

location @nodejs
{       
     proxy_pass  127.0.0.1:8080;
     break;
}

来源:https://dev59.com/d2Yr5IYBdhLWcg3wB1-h#14025374

如果我们需要通过nginx进行websocket通信,它是一个好的代理解决方法吗?当我们需要在常规php站点内部和socket.io连接时使用它。目前我假设的重点是在80端口上运行流量并将标准请求和websocket流量分离。在我的情况下,最简单的解决方案是什么?

http://www.exratione.com/2012/07/proxying-websocket-traffic-for-nodejs-the-present-state-of-play/ 在这篇文章中,我发现HAProxy可能适合我,直到nginx 1.3版本,是吗?

我知道我的问题有点混乱,但我正在努力理解确切的技术。请给我一些提示 | 阅读文章 | 起点 | 基本配置。

附:我已经阅读了这里相关主题的大部分内容。

PS2.为了看起来不那么愚蠢:我已经在red5(基于Java的Flash服务器)+ Flash中完成了这个游戏,所以我只想重新考虑并使用适当的现代技术发布它。


这取决于您的服务器配置。例如,EC2通常提供一个iptables配置(即防火墙),只允许80(HTTP)和22(SSH)端口对外可见。您的8080端口仍然可以从本地主机访问。 - katspaugh
1个回答

6

最终,我的基本问题是正确配置nginx。

首先,我重新安装了带有nginx_tcp_proxy_module的修补程序版本。

下一步是设置正确的配置以处理请求:通过http或tcp。 我想让标准文件从webroot正常提供服务,只需通过node.js(以及socket.io js本身)提供游戏逻辑和.php文件通过php_fpm。

因此,我最终采用了以下有效的nginx设置:

user  www-data;
worker_processes  16;

events {
    worker_connections  1024;
}

http {
    upstream node-js-myapp {
        server 127.0.0.1:3000;
    }

    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    gzip  on;

    server {
        listen          80;
        server_name    domain.xx;  # Multiple hostnames seperated by spaces
        root            /var/www/domain.xx; # Replace this
        charset         utf-8;
        access_log  /var/log/nginx/domain.xx.access.log  combined;
        error_log   /var/log/nginx/domain.xx.error.log;

        location ~ \.php$ {
                fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name; 
                include /etc/nginx/conf.d/php_fpm; # Includes config for PHP-FPM (see below)
        }


        location / {
            index  index.html index.htm;
        }


        location ^~ /socket.io/ {
            try_files $uri @node-js-myapp;
        }

        location /status {
            check_status;
        }

        location @node-js-myapp { 
          proxy_set_header X-Real-IP  $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_pass  http://node-js-myapp;
        }
    }
}

tcp {
  upstream websocket-myapp {
    server 127.0.0.1:8080;
    check interval=3000 rise=2 fall=5 timeout=1000;
  }

  server {
    listen 3000;
    server_name _;
    access_log  /var/log/nginx/domain.xx.access.log;

    proxy_read_timeout 200000;
    proxy_send_timeout 200000;
    proxy_pass websocket-myapp;
  }
}

这个Node.js服务器运行良好:

var app = require('express').createServer()
var io = require('socket.io').listen(app);
io.set('transports', [
    'websocket'
  , 'flashsocket'
  , 'htmlfile'
  , 'xhr-polling'
  , 'jsonp-polling'
  ]);

app.listen(8080);

当请求的文件位于我的服务器的公共部分并在其HEAD部分中:

<script src="/socket.io/socket.io.js"></script>

我非常确定我的nginx并不完整,可能存在一些错误,但它仍然能够工作,并且是一个良好的起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接