使 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;
}
有没有办法只升级 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;
}