【问题标题】:Communicating between client and nodejs server errors in prodprod中客户端和nodejs服务器错误之间的通信
【发布时间】:2019-04-19 21:26:53
【问题描述】:

我正在 AWS EC2 ubuntu 实例中设置一个服务器,该实例具有一个反应前端和一个 nodejs 快速服务器。两者通过 socket.io 进行通信。在本地一切正常,但在托管时会记录 Failed to load resource: net::ERR_CONNECTION_REFUSEDGET ${url} net::ERR_CONNECTION_REFUSED。服务端通过pm2运行,客户端的index直接从nginx调用。

我尝试在 nginx 中为服务器端口创建一个端点并通过 url 调用它,并尝试只使用 localhost,结果相似。

nginx 配置:

server {
  listen 443 default_server;
  listen [::]:443 default_server;
  root /var/www/[url]/client/build;
  index index.html;
  server_name [url] www.[url];
  location / {
    root /var/www/[url]/client/build;
    index index.html;
    try_files $uri /index.html;
  }
  ssl on;
  ssl_certificate /etc/letsencrypt/live/[url]/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/[url]/privkey.pem;
}
server {
  listen 80 default_server;
  server_name _;
  return 301 https://$host$request_uri;
}
server {
  listen 5000;
  server_name localhost; #also tried the url here (when also changed in the server)
  location / {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
  }
}

服务器:

//...
const app = express();

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

const http = require('http').Server(app);
const io = require('socket.io')(http);
const config = require('../client/src/config.json');

io.on('connection', function (socket) {
    //...
    socket.on('send_url', (data) => {
        //connectUrl(data);
    });
});

io.listen(config.Global.serverPort);

客户端示例:

import openSocket from 'socket.io';
const socket = openSocket(`http://localhost:${config.Global.serverPort}`);
//...
socket.emit('send_url', {
    url: this.state.sheetURL,
    googleId: this.props.user.googleId,
    eventId: this.props.curEvent
});

我可以成功访问客户端,但是客户端和服务器之间没有通信。我已经为此工作了几天并四处搜索,但无法获得我发现的许多示例。这似乎是一件基本的事情,所以我觉得我一定遗漏了一些明显的东西!

谢谢!

【问题讨论】:

  • EC2的443端口开了吗?
  • 请在aws控制台开启ec2的80、8080、443、5000端口。
  • 那些端口都已经打开了
  • 当你在本地运行时,客户端和服务器之间有 nginx 吗?我立即认为它是 nginx 配置,因为 websockets 和代理因不总是一起工作而臭名昭著。

标签: node.js reactjs express nginx socket.io


【解决方案1】:

Nginx 配置是在 5000 端口创建一个单独的开口,然后将其代理到 5000 端口的后端,而不是将到 /socket.io 的流量转移到 5000 端口的不同后端。您需要放置一个 socket.io ssl 服务器块内的位置。

server {
  listen 443 default_server ssl;
  listen [::]:443 default_server ssl;
  root /var/www/[url]/client/build;
  index index.html;
  server_name [url] www.[url];
  location /socket.io/ {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
  }
  location / {
    root /var/www/[url]/client/build;
    index index.html;
    try_files $uri /index.html;
  }
  ssl_certificate /etc/letsencrypt/live/[url]/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/[url]/privkey.pem;
}
server {
  listen 80 default_server;
  server_name _;
  return 301 https://$host$request_uri;
}

旁注#1:在listen ... ssl 的 leu 中似乎不推荐使用 ssl on

旁注#2:

使用http.listen 而不是io.listen,因为看起来 express 也被 http 服务器挂载了。在io.listen 下方可能只是调用http.listen,所以你所拥有的可能会起作用,但它可能会混淆实际发生的事情。

【讨论】:

  • 谢谢!将 socket.io 的东西设置为主服务器块中的位置块效果很好。 (我也认为这有助于我更好地理解 nginx 的工作原理)
猜你喜欢
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
相关资源
最近更新 更多