我正在使用docker compose来构建一个以django,nginx作为服务的项目。当我启动daphne服务器时,当客户端尝试连接到websocket服务器时,我收到以下错误:
*1 recv() failed (104: Connection reset by peer) while reading response header from upstream客户端显示了以下内容
failed: Error during WebSocket handshake: Unexpected response code: 502这是我的docker-compose.yml
version: '3'
services:
nginx:
image: nginx
command: nginx -g 'daemon off;'
ports:
- "1010:80"
volumes:
- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
- .:/makeup
links:
- web
web:
build: .
command: /usr/local/bin/circusd /makeup/config/circus/web.ini
environment:
DJANGO_SETTINGS_MODULE: MakeUp.settings
DEBUG_MODE: 1
volumes:
- .:/makeup
expose:
- '8000'
- '8001'
links:
- cache
extra_hosts:
"postgre": 100.73.138.65Nginx:
server {
listen 80;
server_name thelab518.cloudapp.net;
keepalive_timeout 15;
root /makeup/;
access_log /dev/stdout;
error_log /dev/stderr;
location /api/stream {
proxy_pass http://web:8001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://web:8000;
}和圆盘的web.ini文件:
[watcher:web]
cmd = /usr/local/bin/gunicorn MakeUp.wsgi:application -c config/gunicorn.py
working_dir = /makeup/
copy_env = True
user = www-data
[watcher:daphne]
cmd = /usr/local/bin/daphne -b 0.0.0.0 -p 8001 MakeUp.asgi:channel_layer
working_dir = /makeup/
copy_env = True
user = root
[watcher:worker]
cmd = /usr/bin/python3 manage.py runworker
working_dir = /makeup/
copy_env = True
user = www-data发布于 2017-04-12 13:30:58
非常明确地说,要成功运行通道,您需要有一个实现stated in the fine manual协议的专用应用程序服务器,比如提供的daphne
整个Django执行模型已经通过通道进行了更改,因此有单独的“接口服务器”负责接收和发送消息,例如,WebSockets、HTTP或SMS,以及运行实际代码的“工作服务器”(可能在不同的服务器或VM或容器上...)。两者通过一个“信道层”连接在一起,信道层负责来回传送消息和回复。
当前的实现提供了3个通道层,用于在接口服务器和工作服务器之间对话ASGI:
您可以像配置数据库一样配置它们:
CHANNEL_LAYERS = {
"default": {
"BACKEND": "asgi_redis.RedisChannelLayer",
"ROUTING": "my_project.routing.channel_routing",
"CONFIG": {
"hosts": [("redis-channel-1", 6379), ("redis-channel-2", 6379)],
},
},
}当然,这意味着您的docker配置必须更改并添加一个或多个接口服务器,而不是nginx (即使在这种情况下,您将需要接受不同端口上的websocket连接以及所有可能连接的问题),并且很可能需要一个redis实例来连接所有这些服务器。
这反过来意味着,在circus和nginx能够支持ASGI之前,不可能将它们与django-channel一起使用,或者这一支持将仅用于系统的常规http部分。
您可以在Deploying section of the official documentation中找到更多信息。
发布于 2018-10-25 18:50:02
看起来您盯着端口8001上的daphne,并试图在docker-compose中暴露端口8000和8001。端口8000未指向任何服务器(daphne位于8001上)。在您的nginx中,请将代理设置为8001端口,并在docker-compose中仅公开端口8001。
我已经创建了一个简单的示例,如何在github上设置它,其中我有asgi和wsgi服务器的代理,但您只能使用asgi服务器:
nginx:
upstream app {
server wsgiserver:8000;
}
upstream ws_server {
server asgiserver:9000;
}
server {
listen 8000 default_server;
listen [::]:8000;
client_max_body_size 20M;
location / {
try_files $uri @proxy_to_app;
}
location /tasks {
try_files $uri @proxy_to_ws;
}
location @proxy_to_ws {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_pass http://ws_server;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Url-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
}docker-compose.yml:
version: '2'
services:
nginx:
extends:
file: docker-common.yml
service: nginx
ports:
- 8000:8000
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
volumes_from:
- asgiserver
asgiserver:
extends:
file: docker-common.yml
service: backend
entrypoint: /app/docker/backend/asgi-entrypoint.sh
links:
- postgres
- redis
- rabbitmq
expose:
- 9000
wsgiserver:
extends:
file: docker-common.yml
service: backend
entrypoint: /app/docker/backend/wsgi-entrypoint.sh
links:
- postgres
- redis
- rabbitmq
expose:
- 8000 https://stackoverflow.com/questions/43268988
复制相似问题