2016-07-16 1 views
2

저는 Openshift 클라우드에 Django 프로젝트를 배포하고 있습니다. 이 프로젝트는 channels과 웹 소켓을 사용하여 비동기 적으로 작동합니다. 문제는 브라우저에서 웹 소켓을 서버 측에서 실행중인 Daphne 서버에 연결할 수 없다는 것입니다.Daphne 서버가 HTTPS의 웹 소켓에 연결할 수 없습니다.

나는 django (python2.7) 및 redis 카트리지를 사용하여 실행합니다. 이 같은

post_deploy 스크립트 내가 사용 외모 :

... 
python manage.py runworker -v2 && daphne myapp.asgi:channel_layer -p 8443 -b $OPENSHIFT_REDIS_HOST -v2 
... 

여기 내 장고 구성입니다.

... 
ALLOWED_HOSTS = [ 
    socket.gethostname(), 
    os.environ.get('OPENSHIFT_APP_DNS'), 
] 

CHANNEL_LAYERS = { 
    "default": { 
     "BACKEND": "asgi_redis.RedisChannelLayer", 
     "CONFIG": { 
      "hosts": [("redis://:{}@{}:{}/0").format(
       OPENSHIFT_REDIS_PASSWORD, 
       OPENSHIFT_REDIS_HOST, 
       OPENSHIFT_REDIS_PORT 
       )], 
     }, 
     "ROUTING": "myapp.routing.channel_routing", 
    }, 
} 
... 

routing.py 에서 : settings.py에서

... 
ws_routing = [ 
    routing.route("websocket.connect", ws_connect), 
    routing.route("websocket.receive", ws_receive), 
    routing.route("websocket.disconnect", ws_disconnect), 
] 

channel_routing = [ 
    include(ws_routing, path=r"^/sync"), 
] 
... 

consumers.py에서; 내가 다프네 설정 때문에 this 문서의 WebSocket을 설정에서 포트 8443을 사용하고

var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws"; 
var path = ws_scheme+'://'+window.location.host + ':8443/sync'; 
var ws = new WebSocket(path); 
ws.onmessage = function(message) { 
    console.log(message.data); 
} 
ws.onopen = function() { 
    this.send('WS Connecting to receive updates!'); 
} 

공지 사항 : 클라이언트 측에서

def ws_connect(message): 
    Group("notifications").add(message.reply_channel) 

def ws_disconnect(message): 
    Group("notifications").discard(message.reply_channel) 

def ws_receive(message): 
    print "Receiving: '%s' from %s" % (message.content['text'], message.content['reply_channel']) 

, 나는이 코드를 실행 해요. 또한, 다프네가 Openshift (권한 문제)에서 0.0.0.0에 바인딩 할 수 없기 때문 주소를 OPENSHIFT_HOST 수밖에 없다

출력은 다음과 같습니다

first

second

third

모든 것이 클라이언트 측에서 괜찮아 보이지만 기억한다면 consumers.py 이 : "수신 : :에서"내 터미널 그래서

def ws_receive(message): 
    print "Receiving: '%s' from %s" % (message.content['text'], message.content['reply_channel']) 

는, 서버가 같은를 인쇄해야

하지만 그렇지 않다. 여기서 내가 놓친 게 뭐야?

tl; dr : 클라이언트 측 웹 소켓은 올바르게 연결되어 있지만 서버가이를 확인하기위한 메시지를 인쇄하지 않습니다.

답변

4

나는 그걸 만들 수있었습니다. 문제는 포트 포워딩과 관련이있어 보인다. 오픈 포크 형 클라우드의 아파치 서버를 통해 웹 소켓을 daphne 서버에 연결할 수 없게 만든다. 나는 그것을 변경하기로 결정 그래서 WebSocket을을 지원하는 mod_proxy_wstunnel를 설치 아파치를 업데이트 심지어 아파치의 conf 파일을 수정 할 수 없습니다

1) 장고 프로젝트에 대한 기본 카트리지 :

이 문제를 해결합니다. 또한 mod_proxy_wstunnel은 아파치 2.4에서 작동하지만 기본 카트리지는 2.2를 사용합니다.

채널 문서는 nginx를 사용하는 것이 좋습니다.그래서 cartridge을 발견하여 uwsgi 및 django와 함께 사용할 수있게되었습니다.

그 레포의 지침을 따르기는했지만 코드를 작성하기 전에 액션 바늘을 약간 수정하여 패키지의 최신 버전을 얻고 샘플 django 프로젝트를 내 것으로 교체했습니다. 나는 requirements.txt와 똑같이했다.

2) 밀어 넣은 후 redis 카트리지를 추가했습니다.

3) 그럼 uwsgi.yaml 조정할 진행 카트리지 템플릿이 적절한 값으로 설정하도록 제공 nginx.conf :

uwsgi: 
    socket: $OPENSHIFT_DIY_IP:15005 
    pidfile: $OPENSHIFT_TMP_DIR/uwsgi.pid 
    pythonpath: $OPENSHIFT_REPO_DIR/$APP_DIR 
    module: $APP_NAME.wsgi:application 
    virtualenv: $OPENSHIFT_DATA_DIR/virtualenv 

nginx.conf

uwsgi.yaml을 내 post_deploy 스크립트에서
... 
http { 
    ... 
    server { 
     listen  $OPENSHIFT_DIY_IP:$OPENSHIFT_DIY_PORT; 
     server_name localhost; 

     set_real_ip_from $OPENSHIFT_DIY_IP; 
     real_ip_header  X-Forwarded-For; 

     location/{ 
      uwsgi_pass $OPENSHIFT_DIY_IP:15005; 
      include  uwsgi_params; 
     } 

     location /sync { 
      proxy_pass http://$OPENSHIFT_DIY_IP:8443; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
     } 
     ... 
    } 
} 

나는 다음과 같은 한 :

... 
python manage.py runworker -v2 & 
daphne myapp.asgi:channel_layer -p 8443 -b $OPENSHIFT_DIY_IP -v2 & 
... 
,

그래서 다프네는 $ OPENSHIFT_DIY_IP에서 듣고있다 : 8443과의 nginx는 다음과 같이 WebSocket을에서 요청을 수신 할 때 :

이제
var path = 'wss://'+window.location.host + ':8443/sync'; 
var ws = new WebSocket(path); 
ws.onmessage = function(message) { 
    alert(message.data); 
} 
ws.onopen = function() { 
    this.send('WS Connecting to receive updates!'); 
} 

내가 볼 수 있습니다

terminal

그리고 브라우저에서 :

alert

일하고있다. 나는 이것이 내가 아닌 다른 누군가를 도울 수 있기를 희망한다.

관련 문제