Nginx + (nodejs, socketio, express) + php站点 [英] Nginx + (nodejs, socketio, express) + php site

查看:22
本文介绍了Nginx + (nodejs, socketio, express) + php站点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个完全 js、HTML5 的画布游戏,并希望它是实时的".根据我的研究,我发现 node.js 是一个令人兴奋的前景,所以我在我的 ubuntu 12 网络服务器上使用 socket.io、express 等配置了它.

I'm working on a fully js, HTML5 canvas game and want it to be 'real-time'. Based on my research I find out node.js is an exciting prospect, so I configured it on my ubuntu 12 webserver with socket.io, express etc.

我是一名程序员,但只是网络服务器后端领域的新手,这就是我寻求您帮助的原因.我对整个系统模型感到困惑,想弄清楚它是如何工作的.也许,我在短时间内阅读了太多文章.

I'm a programmer, but just a rookie in the world of webserver backends, that's why I ask for your help. I got confused about the overall system model and want to be clarified how it's working. Maybe, I've read too much article in a short time.

首先:我在我的网络服务器上运行 nginx 1.2.x.据我所知,nginx 正在处理请求,它专用于端口 80(对我而言)和服务 http 请求(也使用 php-fpm 来服务 php).再说一次,我在端口 8080 上成功运行了 nodejs 服务器.我希望通过 websocket 连接(由于它的性质和协议),因为 nginx 不支持 websocket,但我对发生的事情感到困惑.

First of all: I run nginx 1.2.x on my webserver. As I know, nginx is handling the rquests, it's dedicated to port 80 (for me) and serving http requests (also using php-fpm to serve php). Then again, I have a succesfully running nodejs server on port 8080. I want the connection via websocket (due it's nature and protocol), since nginx not support websocket yet I got confused about what's going on.

如果我访问 http//mydomain.tld:8080,这是通过节点服务器并关闭 nginx 吗?在这种情况下,连接可以通过 websocket 而不是回退到 xhr 或其他任何东西(我不想要它,因为可扩展性),对吗?

If I go to http//mydomain.tld:8080, is this going to through node server and keep off nginx? In this case the connection could be via websocket and not falling back to xhr or anything else (i dont want it, because of scalability), right?

那我应该怎么做才能在 http//mydomain.tld/game/上产生同样的效果?只是将 nginx.conf 中的请求代理到节点服务器?喜欢:

Then what should i do to have the same effect at http//mydomain.tld/game/ ? Just proxy the request in nginx.conf to node server? Like:

 # 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://stackoverflow.com/a/14025374/2039342

当我们需要通过 nginx 进行 websocket 通信时,它是否是一个很好的代理解决方法?当我们想要一个常规的 php 站点和其中的 socket.io 连接时,我们会这样做吗?到这个时候,我认为重点是在端口 80 上运行流量,并将标准请求和 websocket 流量分开.就我而言,最简单的解决方案是什么?

And if it is a good proxy workaround when we need the websocket communication via nginx? Do we when we want a regular php site and socket.io connection inside it. By this time I presume the point is to run the traffic on port 80 and separate standard requests and websocket traffic. In my case what is the simpliest solution?

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

http://www.exratione.com/2012/07/proxying-websocket-traffic-for-nodejs-the-present-state-of-play/ in this article i found out HAProxy could be the one for me till nginx 1.3, is it?

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

I know my questions are a bit chaotic, but I'm straggling to understand the exact technik. Please give me some hint | article to read | starting point | basic config.

PS.:我在这里阅读了大部分相关主题.

PS.: I've read the most of the related topics here.

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

Ps2.: to look less dumb: I've already done this game in red5 (java based flash server) + flash, so I just want to reconsider and publish it with proper current technologies.

推荐答案

最后,我的基本问题是以正确的方式配置 nginx.

Finally, my basic problem was configuring the nginx in the right way.

首先,我使用 nginx_tcp_proxy_module 重新安装了 nginx 作为修补版本.

First I reinstalled nginx as a patched version with nginx_tcp_proxy_module.

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

The next step was setting up the right config to handle requests: via http or tcp. I wanted the standard files to be served normally from webroot, just the game logic by node.js (and the socket.io js itself ofc) and .php files by php_fpm.

所以我最终得到了以下有效的 nginx 设置:

So I ended up with the following working nginx setup:

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 服务器上运行良好:

It's working well with this node.js server:

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 部分:

While the requested file is in the public side of my server and in its HEAD section:

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

我很确定我的 nginx 不完整并且可能包含公牛......但它有点工作并且是一个很好的起点.

I'm pretty sure my nginx is not complete and could contain bulls..., but it's kind of working and a good starting point.

这篇关于Nginx + (nodejs, socketio, express) + php站点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆