Apache Nginx反向代理websockets

Apache Nginx反向代理websockets,apache,node.js,nginx,fastcgi,Apache,Node.js,Nginx,Fastcgi,有没有办法编译nginx来处理反向代理websockets请求?我正在Node.JS中构建一个实时应用程序,需要一个web服务器。我读到的所有东西都说Nginx无法反转代理websockets请求,所以我对应该如何处理这个问题有点困惑 我曾考虑在节点中实现所有服务器逻辑,但这种方法存在一些问题 1) PHP-我需要一种方法来提供PHP文件 2) 静态文件-我真的很喜欢nginx对于静态文件非常快。不过,有一些模块可以实现这一点,所以这个问题并不太大。 3) 当我需要更新我的节点应用程序时,我希望

有没有办法编译nginx来处理反向代理websockets请求?我正在Node.JS中构建一个实时应用程序,需要一个web服务器。我读到的所有东西都说Nginx无法反转代理websockets请求,所以我对应该如何处理这个问题有点困惑

我曾考虑在节点中实现所有服务器逻辑,但这种方法存在一些问题

1) PHP-我需要一种方法来提供PHP文件 2) 静态文件-我真的很喜欢nginx对于静态文件非常快。不过,有一些模块可以实现这一点,所以这个问题并不太大。
3) 当我需要更新我的节点应用程序时,我希望能够独立于主服务器重新启动该部分。另外,如果节点应用程序由于某种原因崩溃,我不希望整个web服务器都崩溃

最简单的解决方案是在nginx中为多个子域设置虚拟主机,并在单独的子域上运行每个服务。这样,您就不必担心在同一端口上区分websockets请求和标准http请求


此外,您可以使用php-FPM在nginx后面运行php,但这是一个相当大的挑战,因此Apache可能是一个更好的选择。

最简单的解决方案是在nginx中为多个子域设置虚拟主机,并在单独的子域上运行每个服务。这样,您就不必担心在同一端口上区分websockets请求和标准http请求


此外,您可以使用php-FPM在nginx后面运行php,但这是一个相当大的挑战,因此Apache可能是一个更好的选择。

我正在做类似的事情,下面是适用于我的nginx服务器配置(文件:MY_DOMAIN.tk.conf on:/etc/nginx/config.d/):

  • 让我们为ssl加密tls证书
  • php7.2反向代理
  • 端口8000上运行的websockets服务器的nodejs反向代理

    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    upstream appserver {
        server localhost:8000; # appserver_ip:ws_port
    }
    
    server {
    
        server_name MY_DOMAIN.tk;
    
        root /var/www/html;
        index index.php;
    
        location /ws {
            proxy_pass http://appserver;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }
    
    
        client_max_body_size 128m;
        # add_header Strict-Transport-Security "max-age=15768000" always;
    
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/MY_DOMAIN.tk/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/MY_DOMAIN.tk/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 = MY_DOMAIN.tk) {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    
        server_name MY_DOMAIN.tk;
        listen 80;
        return 404; # managed by Certbot
    
    }
    

通过这样做,你可以连接到wss://MY_DOMAIN.tk/ws

我也在做类似的事情,下面是适用于我的nginx服务器配置(文件:MY_DOMAIN.tk.conf on:/etc/nginx/config.d/),包括:

  • 让我们为ssl加密tls证书
  • php7.2反向代理
  • 端口8000上运行的websockets服务器的nodejs反向代理

    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    upstream appserver {
        server localhost:8000; # appserver_ip:ws_port
    }
    
    server {
    
        server_name MY_DOMAIN.tk;
    
        root /var/www/html;
        index index.php;
    
        location /ws {
            proxy_pass http://appserver;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }
    
    
        client_max_body_size 128m;
        # add_header Strict-Transport-Security "max-age=15768000" always;
    
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/MY_DOMAIN.tk/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/MY_DOMAIN.tk/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 = MY_DOMAIN.tk) {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    
        server_name MY_DOMAIN.tk;
        listen 80;
        return 404; # managed by Certbot
    
    }
    

通过这样做,你可以连接到wss://MY_DOMAIN.tk/ws

只需使用node.js负载平衡器,并在其后面安装node&nginx服务器。只需使用node.js负载平衡器,并在其后面安装node&nginx服务器即可。