使 Nginx 代理仅升级 Docker Compose 堆栈中的 SignalR WebSocket 连接

Make Nginx Proxy only upgrade SignalR WebSocket connections in Docker Compose stack

有没有办法只升级 nginx.conf 文件中的 SignalR WebSocket 连接而不复制整个部分?

ASP.NET Core 在未升级时拒绝我的 SignalR 连接,但是我 运行 API 那个 ASP.NET Core 项目不会'当请求具有 header "Connection: " 升级"".

时,不接受带正文的 POST 请求

我目前的解决方案只是复制 nginx.conf 文件中的 "location" 部分,如下所示。有没有更优雅的解决方案?

谢谢!

我的 nginx.conf 文件:

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;

        include /etc/nginx/mime.types;

        gzip on;
        gzip_min_length 1000;
        gzip_proxied expired no-cache no-store private auth;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location / {
            proxy_pass http://ui:80;
            rewrite ^/(.*)$ / break;
        }

        location /shopvac/signalr {
            proxy_pass http://shopvac:80;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            rewrite ^/shopvac/(.*)$ / break;
        }

        location /shopvac {
            proxy_pass http://shopvac:80;
            rewrite ^/shopvac/(.*)$ / break;
        }
    }
}

我的 docker-compose.yaml 文件:

version: "3"

networks:
  proxy:
  database:

volumes:
  database-data:

services:
  proxy:
    image: nginx:latest
    depends_on:
      - ui
      - shopvac
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./logs/nginx:/var/log/nginx
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
  database:
    image: postgres:latest
    volumes:
      - database-data:/var/lib/postgresql/data
    expose:
      - "5432"
    networks:
      - database
    environment:
      - POSTGRES_DB=home-system
      - POSTGRES_USER=home-system
  ui:
    build:
      context: ./ui
      dockerfile: Dockerfile
    expose:
      - "80"
    networks:
      - proxy
  shopvac:
    build:
      context: ./shopvac
      dockerfile: Dockerfile
    depends_on:
      - database
    volumes:
      - /app
    expose:
      - "8080"
    networks:
      - proxy
      - database

找到解决方案!

所以你可以编辑nginx.conf中的"proxy_set_header Connection"属性来传递必要的值。

现在nginx.conf的重要部分如下:

location /shopvac {
    proxy_pass http://shopvac:80;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    rewrite ^/shopvac/(.*)$ / break;
}