Nginx反向代理websockets

时间:2011-04-19 22:20:23

标签: apache node.js nginx fastcgi

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

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

1)PHP - 我需要一种方法来提供PHP文件 2)静态文件 - 我真的很喜欢nginx对于静态文件非常快。虽然有一些模块,所以这个问题不是太大。 3)当我需要更新我的Node应用程序时,我希望能够与主服务器分开重启该部分。此外,如果Node应用程序由于某种原因崩溃,我不希望整个Web服务器崩溃!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我正在做类似的事情,这是对我有用的nginx服务器配置(文件:MY_DOMAIN.tk.conf:/etc/nginx/config.d /),

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

    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