Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 我在使用NodeJS、Express&;设置NGINX反向代理时遇到问题;Socket.io_Node.js_Express_Nginx_Socket.io_Electron - Fatal编程技术网

Node.js 我在使用NodeJS、Express&;设置NGINX反向代理时遇到问题;Socket.io

Node.js 我在使用NodeJS、Express&;设置NGINX反向代理时遇到问题;Socket.io,node.js,express,nginx,socket.io,electron,Node.js,Express,Nginx,Socket.io,Electron,这是我的第一篇文章。通常,我能够通过阅读现有问题/答案来解决问题,并注意到对重复的不满。我已经仔细研究了我能找到的与此相关的每一个问题,并且让我的轮子旋转了一周。不过,如果我遗漏了什么,请将我链接到任何重复的内容(假定它们不是完全不推荐或不正确的) 我非常确信我的初始错误是在默认配置或nginx配置中 基本上,这里的目标是使我既可以使用普通的nodejs/express服务网页,也可以使用socket.io在服务器和基于电子的客户端之间进行实时通信。我已经阅读了关于在不同端口上分离这些功能的各种

这是我的第一篇文章。通常,我能够通过阅读现有问题/答案来解决问题,并注意到对重复的不满。我已经仔细研究了我能找到的与此相关的每一个问题,并且让我的轮子旋转了一周。不过,如果我遗漏了什么,请将我链接到任何重复的内容(假定它们不是完全不推荐或不正确的)

我非常确信我的初始错误是在默认配置或nginx配置中

基本上,这里的目标是使我既可以使用普通的nodejs/express服务网页,也可以使用socket.io在服务器和基于电子的客户端之间进行实时通信。我已经阅读了关于在不同端口上分离这些功能的各种问题,这些问题是不必要的,并且会导致此类应用程序需要更多的工作

尝试的解决方案:

  • 最初的问题(在我将
    位置/socket.io/
    添加到默认文件之前)是,当我配置客户端的main.js和server的app.js文件时,什么都不会发生。我尝试删除客户端选项中的端口指令,并在服务器控制台的调试模式下看到这一点:
    “GET/?EIO=3&transport=polling&t=NJq2Wbs&b64=1 404 57.428 ms-1274”

  • 自从添加了
    location/socket.io/
    之后,我的问题是它现在说这个端口已经在使用中了。我不知道该如何纠正,因为其他问题都说有可能做到这一点,我肯定我遗漏了一些东西

  • 我尝试将它们设置为不同的端口(5001上的5000和socket.io),将客户机main.js配置为具有
    io(https://exampledomain.com:5001)
    和服务器app.js要有
    server.listen(5001,…)
    。运行此命令时,会导致两个控制台都为空(尽管尝试记录客户端或服务器上发生的任何事件)。当检查套接字上是否建立了连接时,它只返回false

  • 我不知道从这里到哪里去。在这一点上,可能到处都有一些小问题,所以这里是我的配置

    这是我在默认配置中的配置:

    # HTTP — redirect all traffic to HTTPS
    server {
        listen 80;
        listen [::]:80 default_server ipv6only=on;
        return 301 https://$host$request_uri;
    }
    
    # HTTPS — proxy all requests to the Node app
    server {
        # Enable HTTP/2
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name exampledomain.com;
    
        client_max_body_size 0;
        fastcgi_read_timeout 1d;
        proxy_read_timeout 1d;
    
        # Use the Let’s Encrypt certificates
        ssl_certificate /etc/letsencrypt/live/exampledomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/exampledomain.com/privkey.pem;
    
        # Include the SSL configuration from cipherli.st
        include snippets/ssl-params.conf;
    
        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://localhost:5000/;
            proxy_ssl_session_reuse off;
            proxy_set_header Host $http_host;
            proxy_cache_bypass $http_upgrade;
            proxy_redirect off;
            client_max_body_size 0;
            fastcgi_read_timeout 1d;
            proxy_read_timeout 1d;
        }
        
        location /socket.io/ {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:5000/;
        }
    }
    
    这是我的nginx.conf代码:

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    
    events {
        worker_connections 768;
        # multi_accept on;
    }
    
    http {
        ##
        # Custom Settings
        ##
        client_max_body_size 0;
        ##
        # Basic Settings
        ##
    
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 5;
        types_hash_max_size 2048;
        # server_tokens off;
    
        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;
    
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
    
        ##
        # SSL Settings
        ##
    
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;
    
        ##
        # Logging Settings
        ##
    
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    
        ##
        # Gzip Settings
        ##
        gzip on;
        gzip_disable "msie6";
    
        ##
        # Virtual Host Configs
        ##
    
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }
    
    以下是我认为来自我的app.js的相关代码:

    var express = require('express');
    var app = express();
    var path = require('path');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    var logger = require('morgan');
    
    app.use(bodyParser.urlencoded({ limit: '500mb',extended: true }));
    app.use(bodyParser.json({ limit: '500mb',extended: true}));
    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    var http = require('http');
    var server = http.createServer(app);
    var io = require('socket.io').listen(server);
    
    app.use(express.static(__dirname + "/public"));
    
    server.listen(5000, ()=>{
      console.log('server listening on port 5000');
    });
    module.exports = app;
    
    以下是我的electron客户端中的main.js:

    const io = require('socket.io-client');
    var socket = io("https://exampledomain.com/socket.io/",{});
    socket.connect();
    socket.on('welcome', () => {
        console.log('welcome received'); // displayed
        //socket.emit('test')
    });
    socket.on('error', (e) => {
        console.log(e); // not displayed
    });
    socket.on('ok', () => {
        console.log("OK received"); // not displayed
    });
    socket.on('connect', () => {
        console.log("connected"); // displayed
        //socket.emit('test');
    });
    
    var socket2 = io("http://exampledomain.com:5000",{});
    socket2.connect();
    socket2.on('error', (e) => {
        console.log(e); // not displayed
    });
    socket2.on('ok', () => {
        console.log("OK received"); // not displayed
    });
    socket2.on('connect', () => {
        console.log("connected"); // displayed
        //socket.emit('test');
    });