【问题标题】:Nginx reverse proxying websocketsNginx 反向代理 websockets
【发布时间】:2011-08-09 01:38:31
【问题描述】:

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

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

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

【问题讨论】:

  • 只需使用 node.js 负载均衡器,并在其后面有一个 node 和 nginx 服务器。

标签: apache node.js nginx fastcgi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我正在做类似的事情,这是适用于我的 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

    【讨论】:

      猜你喜欢
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 2020-01-05
      相关资源
      最近更新 更多