javascript - 如何将 Socket.io 配置为在 https 上的同一端口上运行?

标签 javascript node.js sockets https socket.io

一如既往,我费尽心思寻找问题的答案,所以我再次向所有天才伸出援手! :)

我已经使用 socket.io(使用 express)设置了一个 Node.js 服务器,它使用端口 8443 运行良好。它运行良好:)。由于我的许多客户似乎不允许端口 8443 上的流量,因此他们无法使用我的服务。

我想知道如何在端口 443 上设置 Node.js,因为使用 Node-server 的站点已经在使用这个端口 (Https)。如果我尝试在我的 Node 服务器上使用端口 443,我会得到:warn - error raised: Error: listen EACCES

我的部分 Node-js 代码:

var fs = require('fs');
var https = require('https');
var express = require('express');
var socket = require('socket.io');
var port = 8443;

var sslOptions = {
  pfx: fs.readFileSync('mykey.pfx'),
     passphrase: ********
};

var app = express();

app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With, *');
  next();
});

var server = https.createServer(sslOptions, app);

var io = socket.listen(server, {
    "log level" : 1,
    "match origin protocol" : true,
    "transports" : ['websocket', 'flashsocket'
   , 'xhr-polling'
   , 'jsonp-polling']
});

//No need to list all my socket events I guess

server.listen(port);

连接到我的 Node 服务器的客户端代码:

var socket = io.connect("https://www.*MYWEBSITE*.com", { secure: true, port: 8443});

最佳答案

我认为您在这里问了几个不同的问题。我会自己回答第一个问题,它应该可以解决您最初的问题,但其他一些人提出了一些也值得了解的方便的部署选项。

首先,您不需要在它自己的端口上运行 socket.io 服务器。您可以让 socket.io 服务器将自己绑定(bind)到 express 应用程序。例如:

// ... require stuff
var app = express();

// ... set up your express middleware, etc

var server = https.createServer(sslOptions, app);
// attach your socket.io server to the express server
var io = require("socket.io").listen(server);
server.listen(port);

无论您如何设置 Node 应用程序,了解如何将 nginx 设置为反向代理都是值得的。这很好,因为在运行 Node 应用程序时,您不必是 root 用户就可以使用 < 1024 端口,并且您可以通过虚拟主机将许多应用程序绑定(bind)到同一个 IP 地址。

这是一个 nginx 服务器配置 block ,它将反向代理 Node 应用程序(并支持 websockets)。

server {
    listen 80;
    server_name app.com www.app.com # a list of hosts for this application
    access_log /var/log/nginx/access/app.log; # you'll need to create /var/log/nginx/access
    error_log  /var/log/nginx/error/app.log; # and you'll need to create /var/log/nginx/error

    # prevents 502 bad gateway error
    large_client_header_buffers 8 32k;

    location / {

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        proxy_set_header Accept-Encoding "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;

        proxy_buffers 8 32k;
        proxy_buffer_size 64k;

        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://127.0.0.1:8000; # put the port of your node app here
        proxy_redirect off;
    }
}

关于javascript - 如何将 Socket.io 配置为在 https 上的同一端口上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24237184/

相关文章:

node.js - 使用 NodeJS 的图像处理服务器

java - 尝试连接到 JDBC 时 Java TCP 套接字和 C TCP 套接字之间的区别

javascript - 在 ActionResult 中更改 HighCharts 中的标题样式

javascript - 在 NodeJS 中解析类似 JSON 的数据

php - facebook/digg 如何获取网页的所有图像?

node.js - 使用 Node 运行 .vbs 脚本

javascript - 使用文档片段渲染 Backbone View 会中断事件处理

node.js - 设置 Google Analytics 来跟踪命令行 Node 应用程序

C套接字关闭检测

c++ - 从 Linux 中的管道/套接字中读取所有结构或不读取任何结构?