使用 Docker 部署 MERN 应用程序时,NGINX 出现 Socket.io 错误

问题描述 投票:0回答:2

我使用 docker 在 digitalocean 上部署了一个 MERN 应用程序。后端和前端看起来不错,但由于某种原因,Websocket、socket.io 连接在已部署的应用程序上失败。

错误信息: enter image description here

我使用http-proxy-middleware,我的setupProxy.js文件:(main-be是容器的名称)

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function (app) {
  app.use(
    '/api',
    createProxyMiddleware({
      target: 'http://main-be:5001',
      changeOrigin: true,
    })
  );
};

前端/src/utils/axios.js:

import axios from 'axios';
export const baseURL = 'https://example.com';
export default axios.create({ baseURL });

前端/src/utils/constants.js:

const API_BASE_ORIGIN = 'wss://46.111.119.161';
export { API_BASE_ORIGIN };

...在这里我尝试了这些但没有成功:

const API_BASE_ORIGIN = 'https://example.com';
const API_BASE_ORIGIN = 'ws://46.111.119.161:5001';
const API_BASE_ORIGIN = 'ws://46.111.119.161'; 
const API_BASE_ORIGIN = 'wss://46.111.119.161'; 
const API_BASE_ORIGIN = 'wss://46.111.119.161:5001';

socketContext.js 的一部分

//* socket connection useEffect(() => { const newSocket = socketIo.connect(API_BASE_ORIGIN, { transports: ['websocket'], }); setSocket(newSocket); if (!newSocket) return; newSocket.on('connect', () => { console.log(`Hurrah Socket ${newSocket.id} Connected`); }); }, []);
NGINX 

default.conf 配置文件:

upstream api { server main-be:5001; } upstream client { server main-fe:3000; } server { listen 80; listen [::]:80; server_name _; return 301 https://$host$request_uri; } # main server block server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; # enable subfolder method reverse proxy confs include /config/nginx/proxy-confs/*.subfolder.conf; # all ssl related config moved to ssl.conf include /config/nginx/ssl.conf; client_max_body_size 0; location / { proxy_pass http://client; 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 { proxy_pass http://api; 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 /ws/ { proxy_pass http://client; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; } }
    
javascript node.js docker nginx digital-ocean
2个回答
3
投票
解决方案:

  • WDS_SOCKET_PORT=0

     添加到 React 前端 
    .env 文件。 (这样就不会添加不必要的额外端口

  • 将 nginx default.conf 配置文件编辑为此(不是整个文件):

    location /socket.io { proxy_pass http://api; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; }
    
    

setupProxy.js文件:

const { createProxyMiddleware } = require('http-proxy-middleware'); module.exports = function (app) { app.use( '/api', createProxyMiddleware({ target: 'http://main-be:5001', changeOrigin: true, }) ); };

前端/src/utils/axios.js:

import axios from 'axios'; export const baseURL = 'https://example.com'; export default axios.create({ baseURL });

前端/src/utils/constants.js:

const API_BASE_ORIGIN = 'https://example.com'; export { API_BASE_ORIGIN };
    

0
投票
我在使用 React 和 Nestjs 与 nginx 部署全栈应用程序时也遇到了一些困难。这是我的方法:

在此输入图片描述 我使用nginx如下:

© www.soinside.com 2019 - 2024. All rights reserved.