Связь между ошибками клиента и сервера nodejs в продукт - PullRequest
0 голосов
/ 20 апреля 2019

Я настраиваю сервер в экземпляре Ubuntu AWS EC2, у которого есть реагирующий внешний интерфейс и экспресс-сервер nodejs. Эти два общаются через socket.io. Все отлично работает локально, но при размещении он регистрирует Failed to load resource: net::ERR_CONNECTION_REFUSED и GET ${url} net::ERR_CONNECTION_REFUSED. Сервер работает через pm2, а индекс клиента вызывается напрямую из 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
});

Я могу успешно получить доступ к клиенту, но между клиентом и сервером не происходит никакой связи. Я работал над этим в течение нескольких дней и гуглял, но не могу найти много примеров, которые я нашел, чтобы работать. Это кажется основной вещью, поэтому мне кажется, что я упускаю что-то очевидное!

Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2019

Конфигурация 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: также кажется, что ssl on устарела в результате выполнения listen ... ssl

Примечание № 2:

Do http.listen вместо io.listen, так как он выглядит как экспресс, также монтируется сервером http. Внизу io.listen может просто вызывать http.listen, так что то, что у вас есть, может работать, но это может сбивать с толку то, что на самом деле происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...