首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不同端口上配置WSS支持的反向代理?

如何在不同端口上配置WSS支持的反向代理?
EN

Server Fault用户
提问于 2022-08-30 14:25:10
回答 2查看 1.4K关注 0票数 1

我使用的是vaultwarden坞容器,它基本上需要一个反向代理来提供SSL。

容器为Websockets运行单独的web服务器,因为Rust的火箭不支持同一端口上的web套接字。

关于VaultWarden的说明说:

  • 默认情况下,将/notifications/hub端点路由到WebSocket服务器(端口3012 ),确保传递连接和升级报头
  • 默认情况下,将其他所有内容(包括/Notification/hub/ to )路由到标准火箭服务器(端口80 )

我如何配置我的nginx反向代理来支持这个设置?

我的配置如下所示:

docker-compose.yml

代码语言:javascript
复制
version: '3'
services:
    vaultwarden:
      image: vaultwarden/server:1.25.2
      volumes:
        - /srv/vaultwarden/vaultwarden:/data/
      restart: always
      environment:
        - WEBSOCKET_ENABLED=true

    nginx:
      image: nginx:1.23.1
      volumes:
        - /srv/vaultwarden/nginx/templates:/etc/nginx/templates
        - /srv/vaultwarden/nginx/ssl:/etc/nginx/ssl
      ports:
        - "443:443"
      environment:
        - NGINX_PORT=443

nginx:

代码语言:javascript
复制
server {
    listen       ${NGINX_PORT} ssl http2 default;
    server_name  _;

    # SSL
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    # Web sockets
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://vaultwarden;
    }
}

我是否应该:

  • 直接将端口3012暴露在拱顶容器上??
    • 那么,nginx配置会是什么样的呢?

  • 在nginx容器上公开端口3012,并将其proxy_passing给vaultwarden容器?
    • 那会是什么样子?
EN

回答 2

Server Fault用户

发布于 2022-08-30 15:20:03

我建议在nginx中公开端口3012:

代码语言:javascript
复制
    nginx:
      image: nginx:1.23.1
      volumes:
        - /srv/vaultwarden/nginx/templates:/etc/nginx/templates
        - /srv/vaultwarden/nginx/ssl:/etc/nginx/ssl
      ports:
        - "443:443"
        - "3012:3012"
      environment:
        - NGINX_PORT=443

在nginx上传递WebSockets的代理可能有点棘手。我曾经很难正确地设置它(参见这个职位) --我还为WebSockets提供了一个自定义的URL/端点。

通常,WS代理可以工作的选项有几个:(1)您有用于WebSocket连接的自定义端点,或者(2) WS通过根/,但是在一个与D2不同的端口,或者(3)它更适合于socket.io (即每个端点/URL也是WS连接的一个单独的端点)。文件上说:

默认情况下,在端口3012处将/Notification/hub端点路由到WebSocket服务器,确保将连接和升级报头路由所有其他内容,包括/Notification/hub/ the,默认情况下在端口80处将其传递到标准火箭服务器

所以我想在nginx配置中应该是这样的:

代码语言:javascript
复制
       # WebSocket support
       location ~ ^/notifications/hub/ {
           proxy_pass http://vaultwarden:3012;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "Upgrade";
           proxy_set_header Host $host;
       }

       # HTTP proxy
       location / {
           proxy_pass http://vaultwarden;
       }

但它需要一些测试。

我希望这能对你有所帮助。

票数 1
EN

Server Fault用户

发布于 2022-08-31 14:31:55

经过一番挖掘,我发现:

如果您像上面在我的WEBSOCKET_ENABLED=true文件中那样将D0环境变量传递给vaultwarden容器,容器将启动2台服务器:

  1. 端口80上的Web服务器
  2. 端口3012上的Websocket服务器

客户端没有任何关于连接到端口3012的信息。客户端尝试在/notifications/hub上设置websocket。与您的常规web服务器相同的端口。

您不需要在docker-compose.yml文件中的两个容器上公开端口3012。您所需要的只是nginx配置文件中的以下内容:

代码语言:javascript
复制
location = /notifications/hub {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;

    proxy_pass http://vaultwarden:3012;
}

这将透明地使nginx将所有请求重定向到/notifications/hub上的vaultwarden容器上的端口3012。

因为nginx和vaultwarden都位于相同的docker-compose.yml文件中,所以它们位于同一个内部网络上,并且nginx容器已经可以访问vaultwarden容器上的所有端口。你不需要允许这个港口在任何地方。

客户端不知道在内部,web套接字使用的是不同的端口。端口转换都发生在服务器端.

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1109479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档