Node.js 如何使用WebSocket为多个express API配置nginx?

Node.js 如何使用WebSocket为多个express API配置nginx?,node.js,express,nginx,websocket,socket.io,Node.js,Express,Nginx,Websocket,Socket.io,我最近将Node.js/expressapi:s从Heroku移到了digital ocean ubuntu droplet。我的所有端点和WebSocket在本地和Heroku都可以正常工作,但在ubuntu droplet上,我的WebSocket停止工作(所有端点都可以正常工作) 我有四个不同的API:s,其中两个使用WebSocket设置,如下所示: *Index.js* const app = require("./app"); const http = requi

我最近将Node.js/expressapi:s从Heroku移到了digital ocean ubuntu droplet。我的所有端点和WebSocket在本地和Heroku都可以正常工作,但在ubuntu droplet上,我的WebSocket停止工作(所有端点都可以正常工作)

我有四个不同的API:s,其中两个使用WebSocket设置,如下所示:

*Index.js*
const app = require("./app");
const http = require("http");
const config = require("./utils/config");
const socketIo = require("socket.io");

const server = http.createServer(app);
const io = socketIo(server);

io.on("connection", (socket) => {
  console.log("New client connected");
  socket.on("disconnect", () => {
    console.log("Client disconnected");
  });
});

app.io = io;

app.get("/", (req, res) => {
  res.send("Node Server is running.");
});

server.listen(config.PORT, () => {
  console.log(`Server running on port ${config.PORT}`);
});
server {

        root /var/www/myapp.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name myapp.com www.myapp.com;

        location / {
                try_files $uri $uri/ =404;
        }

        location /api-with-websockets-1/ {
          proxy_pass http://localhost:3001/;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;

        }

    location /api-with-websockets-2/ {
        proxy_pass http://localhost:3002/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location /no-websockets-api-1/ {
        proxy_pass http://localhost:3003/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
        location /no-websockets-api-2/ {
        proxy_pass http://localhost:3004/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/myapp.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 = www.myapp.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


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


        listen 80;
        listen [::]:80;

        server_name myapp.com www.myapp.com;
    return 404; # managed by Certbot

}
我还学习了有关设置Node.js ubuntu droplet(使用https)的Digital Oceans教程:

我的nginx配置如下所示:

*Index.js*
const app = require("./app");
const http = require("http");
const config = require("./utils/config");
const socketIo = require("socket.io");

const server = http.createServer(app);
const io = socketIo(server);

io.on("connection", (socket) => {
  console.log("New client connected");
  socket.on("disconnect", () => {
    console.log("Client disconnected");
  });
});

app.io = io;

app.get("/", (req, res) => {
  res.send("Node Server is running.");
});

server.listen(config.PORT, () => {
  console.log(`Server running on port ${config.PORT}`);
});
server {

        root /var/www/myapp.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name myapp.com www.myapp.com;

        location / {
                try_files $uri $uri/ =404;
        }

        location /api-with-websockets-1/ {
          proxy_pass http://localhost:3001/;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;

        }

    location /api-with-websockets-2/ {
        proxy_pass http://localhost:3002/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location /no-websockets-api-1/ {
        proxy_pass http://localhost:3003/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
        location /no-websockets-api-2/ {
        proxy_pass http://localhost:3004/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/myapp.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 = www.myapp.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


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


        listen 80;
        listen [::]:80;

        server_name myapp.com www.myapp.com;
    return 404; # managed by Certbot

}
我注意到当我在浏览器中打开像这样的websocket url时

https://www.myapp.com/api-with-websockets-1/socket.io/?EIO=3&transport=polling&t=$test
我得到的答复是:

96:0{"sid":"i_VfLjian6BFmjRZAAAJ","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}2:40
那么我猜WebSocket在那里?但是我的客户端无法接收后端和套接字发出的任何消息。io-client显示connected:false(客户端没有其他错误消息、警告或任何内容)。我整晚都在尝试以不同的方式更改nginx配置,但似乎没有任何效果:(

你知道这是什么原因吗

编辑:在的帮助下,我能够连接/断开套接字,但发出消息API或客户端仍然无法工作:/

编辑2:通过更改客户端代码,我可以让WebSocket为一个api工作并发出消息

socketIOClient.connect(my-app.com/, , { resource: 'api-with-websockets-1' });
和nginx配置:

    location ~ ^/(socket\.io) {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
但是我不知道如何让WebSocket也在其他API中工作