Docker nginx websocket代理==客户端在等待请求时关闭了连接 [英] Docker nginx websocket proxy== client closed connection while waiting for request

查看:126
本文介绍了Docker nginx websocket代理==客户端在等待请求时关闭了连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我拼命尝试将Nginx代理设置为websocket.Websocket连接,但随后我得到

I desperately trying to setup nginx proxy to websocket. Websocket connects but then I'm getting

2018/02/10 19:30:34 [info] 7#7:* 238客户端关闭连接而等待请求,客户端:172.18.0.1,服务器:0.0.0.0:8888

2018/02/10 19:30:34 [info] 7#7: *238 client closed connection while waiting for request, client: 172.18.0.1, server: 0.0.0.0:8888

这是最小的示例:

nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}
error_log /dev/stdout debug;

http  {
    resolver 127.0.0.11 ipv6=off;
    include       mime.types;
    access_log /dev/stdout;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream tornado {
      server ws:8888;
      #server ws:8889; I may add another upstream here
    }

    server {
         add_header X-Frame-Options SAMEORIGIN;
         add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";

        listen 8888;

        server_name pychat.org;
        charset     utf-8;
        client_max_body_size 75M;

        location / {
             proxy_pass http://tornado/;
             #>>> otherwise error 400
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
             proxy_set_header Host $host;
             proxy_send_timeout 330;
             proxy_read_timeout 330;
             #>>>>>>
             #proxy_redirect off;
             proxy_set_header X-Real-IP $remote_addr;
             #proxy_set_header X-Scheme $scheme;
        }

    }
}

server.py

import tornado.ioloop
from tornado.websocket import WebSocketHandler, WebSocketClosedError
from tornado import web
class MainHandler(WebSocketHandler):

    def open(self):
        print("WebSocket opened")

    def on_message(self, message):
        print("ws mess" +  message)
        self.write_message(u"You said: " + message)

    def on_close(self):
        print("WebSocket closed")

    def check_origin(self, origin):
        return True

def make_app():
    return tornado.web.Application([
        (r'.*', MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

docker-compose.yml

version: '2.3'
services:
  nginx:
    build:
      context: ../
      dockerfile: ./dockerfilenginx
    ports:
     - 8888:8888
  ws:
    build:
      context: ../
      dockerfile: ./docker/Dockerfilews

Dockerfilenginx :

FROM alpine:3.6
RUN apk update &&\
apk add vim nginx ca-certificates wget && update-ca-certificates
COPY ./docker/nginx-test.conf /etc/nginx/nginx.conf
CMD ["nginx", "-g", "pid /tmp/nginx.pid; daemon off;"]

Dockerfilews

FROM alpine:3.6
RUN apk update &&\
 apk add python3 &&\
pip3 install tornado
WORKDIR /usr/src
COPY ./server.py /usr/src
CMD python3 server.py

然后只需尝试打开服务器的WebSocket,例如通过浏览器控制台(shift + ctrl + i).

Then just try to open a WebSocket to the server, e.g. from browser console (shift+ctrl+i).

ws = new WebSocket('ws://localhost:8888')
ws.send("wsdata")

如果我删除nginx代理并仅在docker上公开websocket端口-一切正常.

If I remove nginx proxy and just expose websocket port on docker - everything will work.

推荐答案

您可以为nginx尝试使用此代理配置吗,我将其用于django和daphne

can you try this proxy config for nginx, i use it for django and daphne

proxy_http_version 1.1; 解决了该问题.

location / {
    proxy_pass http://ws:8888;
    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;
}

这篇关于Docker nginx websocket代理==客户端在等待请求时关闭了连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆