Nginx + (nodejs、socketio、express) + php 站点

2023-11-23

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

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

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

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

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

 # 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;
}

From: https://stackoverflow.com/a/14025374/2039342

当我们需要通过 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,是吗?

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

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

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


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

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

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

所以我最终得到了以下有效的 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 不完整并且可能包含公牛......,但它正在工作并且是一个很好的起点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx + (nodejs、socketio、express) + php 站点 的相关文章

随机推荐

  • Gulp 4 - Gulpfile.js 设置

    我发现有关 Gulp 4 的文档非常难找到 所以我想我可以在这里询问是否有人可以提供帮助 无论如何 我对 Gulp 还很陌生 并且一直使用 Gulp 3 没有任何问题 直到我尝试在我们用于开发的虚拟机上运行它 我的 gulp 文件非常简单
  • 如何将我的 iOS 故事板设置为像 Instagram Stream 一样弹跳?

    我正在构建一个具有社交内容流的应用程序 并试图了解 Instagram 如何在应用程序中进行流式传输的行为 因此 基本上 顶部标题会滚动到屏幕之外 但会在屏幕和内容之间弹跳 我可以使顶部标题滚动离开屏幕 并且可以使视图不反弹 但我想使用拉动
  • Java 中日期到整数的转换

    我有一个 int 变量 如下所示 如何将其转换为 Date 对象 反之亦然 int inputDate 20121220 将值转换为String并使用SimpleDateFormat将其解析为Date object int inputDat
  • 检查矩阵是否奇异的快速方法? (不可逆,det = 0)

    检查小方阵 最好的方法是计算条件号通过 SVD 并检查它是否大于 1 epsilon 其中 epsilon 是机器精度 如果您允许漏报 即矩阵有缺陷 但您的算法可能无法检测到它 您可以使用维基百科文章中的 max a ii min a ii
  • MySQL 与 Group By 的一对多连接仅返回一个观察结果

    我有一个评论表和一个标签表 对于每个评论 可以有多个标签 也可以没有 我想加入这两个 这样我就可以获得每个评论的标签列表 评论表 CommentID Title 1 animals 2 plants 标签表 TagID CommentID
  • CustomTableCellView 的 -layoutSubviews 实现需要调用 super , NSInternalInconsistencyException

    在 tableView xib 的自定义单元格中使用 autoLayout 时 我收到以下错误 在 iOS 6 模拟器中运行时CustomCells的 layoutSubviews的实现需要调用super Assertion failure
  • 2 个双数之间的随机数

    是否可以在 2 个双精度数之间生成一个随机数 Example public double GetRandomeNumber double minimum double maximum return Random NextDouble min
  • 使用 SIMD 内在函数时这些额外的反汇编指令是什么?

    我正在测试使用 SIMD 指令与 RyuJIT 可以获得什么样的加速 并且我看到了一些我不期望的反汇编指令 我的代码基于这篇博文来自 RyuJIT 团队的 Kevin Frei 以及相关帖子here 这是函数 static void Add
  • QT Creator,c++11 语法检查

    如何关闭 c 11 基于循环范围的运算符的错误突出显示 代码下的红色波浪 int myint 1 2 3 4 5 for auto x myint 悬停提示显示 意外令牌 代码编译完美 另一个问题 自动完成不显示unique ptr in
  • 布局预览中的 TextClock 渲染问题

    当我在布局 Android Studio 布局预览中创建 TextClock 小部件时 没有显示更改 但在调试设备上小部件工作得很好 如果我评论它布局预览工作成功 另一台PC Android Studio工作成功并显示TextClock 错
  • SPRING MVC 中的 URL 模式限制

    我的 Spring Web MVC 应用程序在控制器中具有以下处理程序映射 RequestMapping method RequestMethod GET value something 当请求发送至 http www someURL co
  • Linux 排序不适用于负浮点数

    如何对这种输入进行排序 0 00159265291648695254 0 00318530179313823899 0 0 00999983333416666468 0 00362937767285478371 0 004777942590
  • 将数据框的两列转换为命名向量

    我需要转换多行两列data frame到一个命名的字符向量 我的data frame会是这样的 dd data frame crit c a b c d name c Alpha Beta Caesar Doris 我真正需要的是 what
  • 是否可以以编程方式抛出 APPWIDGET_UPDATE 的意图?

    想要我的小部件中的一个按钮来触发小部件类上的 APPWIDGET UPDATE 意图以强制更新 但我没有将 APPWIDGET UPDATE 视为意图中的静态字段 这可能吗 如何做到这一点 Intent intent new Intent
  • 如何更改列表框项目的文本?

    我有一个Listbox充满了项目 我需要更改项目的文本 使用项目配置我只能找到如何更改颜色 如何更改 Tkinter 上的项目文本Listbox 要更改文本 您必须删除并在正确的索引处重新添加项目 这是一个不断更新列表框中第二项的人为示例
  • android studio 错误:无法启动守护进程

    Android Studio 2 2版本 操作系统版本 Windows 10 Java JRE JDK版本 1 8 0 51 错误 无法启动守护进程 这个问题可能是守护进程配置不正确造成的 例如 一个使用了无法识别的 jvm 选项 请参阅用
  • 何时应用数据绑定?

    在对象生命周期的什么时间第一次解析绑定 这是一个简单的问题 但我在书籍和谷歌上都找不到任何信息 其实事情没那么简单 你不会得到这个问题的直接答案 这取决于上下文 这是两个简单的例子 如果有界属性由不在 ControlTemplate 内的
  • 在 Ionic 2 中禁用侧边菜单的滑动打开登录页面(或任何页面)的手势

    我是 Ionic 2 和 Angular2 的新手 我已经使用以下命令下载了新的 Ionic 模板 Ionic start appname sidemenu v2 ts 对于这个特定的解决方案 我添加了一个登录页面来验证用户 验证成功后 用
  • 更改轴而不更改数据 (Python)

    我如何绘制一些数据 删除由该数据创建的轴 然后用不同比例的轴替换它们 假设我有类似的东西 import matplotlib pyplot as plt fig plt figure ax fig add subplot 111 plt x
  • Nginx + (nodejs、socketio、express) + php 站点

    我正在开发一个完全 js HTML5 画布游戏 并希望它是 实时 的 根据我的研究 我发现 Node js 是一个令人兴奋的前景 因此我在我的 ubuntu 12 Web 服务器上使用 socket io express 等配置了它 我是一