繁体   English   中英

为什么我的Nginx-Socket.io-Express-Setup无法通过HTTPS工作?

[英]Why is my Nginx-Socket.io-Express-Setup not working over HTTPS?

它在本地运行良好,但是一旦将它放在Nginx反向代理后面,我就会在Chrome开发者控制台中找到它:

GET https://127.0.0.1:8443/socket.io/?EIO=3&transport=polling&t=MoHVP61 net::ERR_SSL_PROTOCOL_ERROR

Nginx配置:

upstream io_nodes {
  ip_hash;
  server 127.0.0.1:8443;
}

map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     max;
    ~image/                    max;
}

server {
    listen       80;
    listen       [::]:80;
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  xxxxxxxxxx;
    expires      $expires;

    large_client_header_buffers 8 32k;

    error_page   404              /404.html;
    error_page   500 502 503 504  /50x.html;

    location / {
        proxy_pass http://io_nodes;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }

    location /socket.io {
        proxy_pass http://io_nodes;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }

    location = /404.html {
        root   /usr/share/nginx/html;
    }   
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    ssl_certificate      /etc/letsencrypt/live/thewthr.app/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/thewthr.app/privkey.pem;
    include              /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam          /etc/letsencrypt/ssl-dhparams.pem;

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }
}

Socket.io后端:

const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);

server.listen(process.env.PORT, () => console.log(`Express running → PORT ${server.address().port}`));

io.on('connection', () => console.log(`Socket.io running → PORT ${server.address().port}`));

Socket.io客户端:

let socket = io.connect(`127.0.0.1:8443`);

我假设您想通过Nginx代理使用https。

在这种情况下,您应该直接连接到Nginx服务器,而不是 Node实例。

var socket = require('socket.io-client');
socket.connect('https://127.0.0.1', { secure: true, rejectUnauthorized: true });

如果这不是正确的地址,请用实际的Nginx服务器替换“ 127.0.0.1”。 如果您的SSl证书无效/已自签名,请将拒绝未授权设置为false。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM