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 站点 的相关文章

  • 如何修复超出最大调用堆栈大小

    有一个 MERN Firebase 应用程序并收到此错误和一堆 atdeepExtend deepCopy ts 71 RangeError Maximum call stack size exceeded getApps as apps
  • Express.js Passport认证自动失败跳过策略

    UPDATE 我已将代码从护照本地注册内部移至单独的处理程序 并且运行良好 问题在于 Passport 和本地注册的使用 但我不知道为什么 我使用 Node js Express Passport 进行身份验证和注册设置 这是以前使用过的标
  • 使用Nodejs、Express和AngularJS在浏览器中显示IP

    我正在学习 Nodejs 和 ExpressJS 我正在尝试使用 ExpressJS 和 2 个节点模块 请求IP https www npmjs com package request ip and geoip2 https www np
  • nginx上传client_max_body_size问题

    我正在运行 nginx ruby on rails 并且有一个简单的多部分表单来上传文件 一切正常 直到我决定限制要上传的文件的最大大小 为此 我设置了 nginxclient max body size to 1m 1MB 并且当该规则被
  • 为什么changeResourceRecordSets没有被授权访问此资源?

    我正在尝试在 Route 53 中创建一条别名类型的新记录 以告诉 Route 53 起诉 CloudFront 来为该站点提供服务 我正在尝试使用以下代码来执行此操作 let options ChangeBatch Changes Act
  • 节点:以编程方式检查包的最新版本

    我希望我的节点包 在 npm 上发布 在新版本可用时提醒用户 如何以编程方式检查已发布软件包的最新版本并将其与当前版本进行比较 Thanks 您可以结合npmview https npmjs com package npmview 用于获取
  • 使用 Sequelize (NodeJS) 代替 * 指定特定字段

    好吧 我在 NodeJS 中有一个项目 我正在其中使用 Sequelize 来实现 MySQL ORM 这件事工作得非常好 但是我试图弄清楚是否有一种方法可以指定在查询的基础上返回哪些字段 或者是否有一种方法可以在某处执行 query 例如
  • PDF 附件 NodeMailer

    预先感谢您的回复 我编写了一些使用nodemailer 0 7 1的代码 它发送电子邮件并将pdf附加到电子邮件中 但是 pdf 附件在编码时会自行损坏或截断或发生其他情况 我之所以说这是附件之前的文件 即我本地的文件 是512kb 而电子
  • Angularjs $http 似乎不理解响应中的“Set-Cookie”

    我有一个带有 Passport 模块的 Nodejs Express REST api 用于身份验证 登录方法 GET 在标头中返回一个 cookie 当我从 Chrome 调用它时 它工作正常 我的 cookie 已在我的浏览器中设置 但
  • Mongodb 以不区分大小写的方式排序

    我在 Nodejs express 中以 mongodb 作为数据库的一个项目中非常努力地构建 当我使用 sort 获取所有数据时 它以错误的方式返回数据 那么有没有办法按照我的预期得到正确的格式 如下所示 如果我们在数据库中有三个记录 i
  • Firebase CLI 部署错误:“现在在 Firebase CLI 中禁用部署到 Node.js 10 以下的运行时。”

    我有一个使用 Cloud Functions for Firebase 的项目 在将 Firebase CLI 更新到版本 9 0 0 后 我收到一条错误消息 错误 函数目录中的 package json 有一个引擎字段 不受支持 有效的选
  • 什么是 TTY?如何在 Ubuntu 上启用它?

    我目前正在设置一个 Node js 服务器 并且在这里使用调试模块https github com visionmedia debug https github com visionmedia debug 我正在尝试启用它 以便我可以在输出
  • 处理从nodejs到mongo db的连接丢失

    当nodejs和mongodb服务器之间的连接丢失时 我试图得到 连接丢失 或类似的信息 我使用本机驱动程序并具有以下代码 var mongo require mongodb var server new mongo Server host
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • Flask 或 Pyramid 中的简单网络 UDP 监听

    我需要创建一个 Web 应用程序来显示通过定期传入 UDP 数据包提供的数据 该站点可能位于 Flask 可能是 Pyramid 中 部署在 Nginx 下 如何创建一个非常简单的后台任务 基本上只是 socket recv 来侦听任何传入
  • 是否可以直接获取 Puppeteer 音频源和/或输入音频到 Puppeteer?

    我想将 WAV 或 MP3 输入到 puppeteer 作为麦克风 但是在无头模式下应用程序被静音 所以我想知道是否有一种方法可以直接将输入输入到浏览器中 我还想知道是否可以在无头状态下从浏览器获取音频源 和 或录制音频并将其放在文件夹中
  • Mongoose 查询执行后回调函数从未被调用

    以下是我的代码 mongoose connect mongodb localhost mydatabase var db mongoose connection db on error console error bind console
  • 多次训练brain.js?

    在第一次训练后 如何将新信息 仅新信息 而不是所有信息 因为这会花费太多性能 训练到我的用 Brain js 制作的神经网络 它有点粗糙 但您可以使用以下结构来实现 如果我们加入 2 个训练数据集 旧数据集与新数据集 然后重新训练keepN
  • 在express js中禁用http方法

    我正在我的 Express 应用程序上进行 nessus 测试 这是我得到的 基于每种方法的测试 HTTP 方法 ACL CHECKOUT COPY DELETE GET HEAD LOCK MERGE MKACTIVITY MKCOL 移
  • http://localhost:8080 未重定向到 opensso 登录页面

    我的 Liferay Tomcat 服务器在端口 8080 上运行 当我尝试通过输入 url 从服务器访问应用程序时http localhost 8080 它没有重定向到登录页面 而是给我错误 The Connection to abc x

随机推荐

  • 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 等配置了它 我是一