Socket.io и Экспресс с nginx - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь правильно настроить nginx, чтобы он мог обрабатывать прокси для Express (порт 8081) и Socket.io (порт 3000).Вот мой конфиг, который в настоящее время выдает ошибку 502 для всего запроса, а не только Socket.io:

server {

        root /var/www/example.com/public/;

        index index.html index.htm index.nginx-debian.html;

        server_name example.com;

        location /socket.io/ {
                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_set_header X-NginX-Proxy true;
                proxy_pass http://127.0.0.1:3000/;
                proxy_redirect off;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location / {
                #try_files $uri $uri/ =404;
                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_set_header X-NginX-Proxy true;
                proxy_pass http://127.0.0.1:8081/;
                proxy_redirect off;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_redirect off;
                proxy_set_header X-Forwarded-Proto $scheme;
        }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = example.com) {
        return 301 https://$host$request_uri;
} # managed by Certbot


        listen 80;
        listen [::]:80;

        server_name example.com;
    return 404; # managed by Certbot


}

Насколько я понимаю, мне нужно убедиться, что Websocket, используемый Socket.io,обновлен до HTTP, но здесь я пытаюсь понять, что мне нужно делать.Предположительно и Socket.io, и Express должны работать на разных портах, а затем необходимо прокси-сервер к nginx в соответствии с моей конфигурацией выше.

Если я отключу прокси-сервер Express и просто использую nginx для обслуживания файлов, тогда мои активыобслуживаются, но, очевидно, мне это нужно для работы как с Express, так и с Socket.io.

Редактировать: я использую nginx 1.14, но, глядя на сообщение в блоге nginx, мне нужно хотя бы 1,3 ... но все же выглядитуже несколько лет, поэтому не уверен, почему менеджер пакетов Ubuntu так устарел.Я не получаю ошибок конфигурации в, но соединение отказано в журналах ошибок из-за upstream.

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 12 февраля 2019

Experess и socket.io могут находиться на одном и том же порту.

const express = require('express')
const app = express()
const http = require('http').createServer(app)
const io = require('socket.io')(http)

app.use(
  express.static(__dirname + '/client')
)

io.on('connection', function(socket){
  console.log('Socket Connected');
   socket.emit('message', 'Hello Socket');
   socket.on('message', function (msg) {
      console.log(msg);
   });
})

http.listen(8080, () => console.log('Server is running @ localhost:8080')) //port

Я никогда не использовал nginx и не обслуживал приложение nodejs с сервером, отличным от самого nodejs.Я предполагаю, что у вас есть веб-приложение, которое вы обслуживаете через nginx?

Чтобы использовать сокет на другом порту, вы должны создать другой сервер nodejs через http, а затем использовать cors, чтобы позволить им соединиться.Мне сказали, что использование cors (Cross-Origin Resource Sharing) может быть опасным.Самое простое и безопасное для этого - держать ваше приложение под одним портом (сервером).

Socket.io заботится о настройке веб-сокета и обновлении соединения.Если вам нужно справиться с этим по-своему, я бы порекомендовал что-то вроде faye-websocket , но socket.io многое из этого абстрагирует.

Вы узнаете больше о socket.io с помощью nodejshttp серверы здесь .

На стороне клиента или на вашей веб-странице, например index.html ...

<!DOCTYPE html>
<html>
  <head>
    <title>Socket.io Test</title>
    <script src="socket.io/socket.io.js"></script>
  </head>
  <body>
    <!-- HTML -->
    <script>
      var socket = io();
      socket.on('message', function (msg) {
        console.log(msg);
        socket.emit('message', 'Back at you');
      });
    </script>
  </body>
</html>

, для запуска этого кода создайте новую папку socket.io_test, а затем внутри создайте файл с именем app.jsи еще одна папка client с файлом index.html.Скопируйте первый фрагмент кода в app.js, а второй в index.html.cd в корневую папку и запустите npm init -y, затем npm i -s express socket.io и, наконец, node app.js и укажите свой браузер на localhost:8080.

Надеюсь, это поможет

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