Nginx 反向代理 websocket

发布于 2024-11-02 12:21:58 字数 366 浏览 0 评论 0原文

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

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

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

Is there a way to compile nginx to handle reverse proxying websockets requests? I'm building a realtime app in Node.JS and need a web server on top of this. Everything I've read says Nginx cannot reverse proxy websockets requests, so I'm a little confused on how I should approach this problem.

I was thinking about just implementing all server logic in Node, but there are some problems with this approach

1) PHP - I need a way to serve PHP files
2) Static files - I really like that nginx is very fast for static files. There are some modules for this, though, so this problem isn't too big.
3) When I need to update my Node app, I would like to be able to restart that part separately from the main server. Also, if the Node app crashes for some reason, I don't want the whole web server to go down!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

看轻我的陪伴 2024-11-09 12:21:58

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

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

The simplest solution would be to setup virtual hosts in nginx for multiple subdomains and run each service on a separate one. That way you don't have to worry about distinguishing websockets requests from standard http requests on the same port.

Also, you can run php behind nginx using PHP-FPM but that's quite a challenge to get working, and for that reason Apache may be a better choice.

诺曦 2024-11-09 12:21:58

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

  • 让我们为ssl
  • php7.2反向代理
  • 加密tls证书

    在端口 8000 上运行的 websockets 服务器的 Nodejs 反向代理。

    map $http_upgrade $connection_upgrade {
        默认升级;
        '' 关闭;
    }
    
    上游应用程序服务器{
        服务器本地主机:8000; # appserver_ip:ws_port
    }
    
    服务器 {
    
        服务器名称 MY_DOMAIN.tk;
    
        根/var/www/html;
        索引index.php;
    
        位置 /ws {
            proxy_pass http://appserver;
            proxy_http_版本 1.1;
            proxy_set_header 升级 $http_upgrade;
            proxy_set_header 连接 $connection_upgrade;
        }
    
        地点 / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        位置 ~ \.php$ {
            包括片段/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }
    
    
        client_max_body_size 128m;
        # add_header 严格传输安全“max-age=15768000”始终;
    
        监听 443 ssl; # 由 Certbot 管理
        ssl_certificate /etc/letsencrypt/live/MY_DOMAIN.tk/fullchain.pem; # 由 Certbot 管理
        ssl_certificate_key /etc/letsencrypt/live/MY_DOMAIN.tk/privkey.pem; # 由 Certbot 管理
        包括/etc/letsencrypt/options-ssl-nginx.conf; # 由 Certbot 管理
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 由 Certbot 管理
    
    }
    
    服务器 {
        如果($主机= MY_DOMAIN.tk){
            返回 301 https://$host$request_uri;
        } # 由 Certbot 管理
    
        服务器名称 MY_DOMAIN.tk;
        听80;
        返回404; # 由 Certbot 管理
    
    }
    

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

I am doing something similar, here is the nginx server config( file: MY_DOMAIN.tk.conf on: /etc/nginx/config.d/) that work for me, with:

  • let's encrypt tls cert for ssl
  • php7.2 reverse proxy
  • nodejs reverse proxy for websockets server running on port 8000.

    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
    
    }
    

by doing this then you can conect to wss://MY_DOMAIN.tk/ws

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文