※こちらは旧サイトです(新サイトはこちら

Nginx+uWSGIのWebsocketで「KeyError:'HTTP_SEC_WEBSOCKET_KEY'」を解決する

2017-12-04 19:27:20

うちの自宅サーバが逝ってしまって、ポートフォリオが見れなくなってしまったので、DockernizeしてGCEにとりあえずコンテナとして放り込んでおこうと移植した際に遭遇した事象

Websocketだけ見れない

元の構成はこんな感じ

今回移行先となる、GCEの無料枠プラン(物理メモリ500MBちょい)だと非力すぎて、uWSGIをEmperorで動かす利点がほぼないため、dockerfiles/django-uwsgi-nginxで公開されてるDockerfileを借りることにしました

しかし、Djangoの方はさくっと移行終わったものの、WebSocketだけ、KeyError:'HTTP_SEC_WEBSOCKET_KEY' が出てhandshakeでこける

uwsgi.websocket_handshake(env['HTTP_SEC_WEBSOCKET_KEY'], env.get('HTTP_ORIGIN', ''))

結論:uWSGIをSSLサポート付きでbuildする必要があった

dockerfiles/django-uwsgi-nginxのままだとSSLサポートが有効になっておらず、SSLサポート付きでbuildしてやる必要がありました

以下、やったことメモ

1.pip install前にコンパイル変数の設定

ENV CFLAGS="-I/usr/local/opt/openssl/include"
ENV LDFLAGS "-L/usr/local/opt/openssl/lib"
ENV UWSGI_PROFILE_OVERRIDE "ssl=true"
RUN pip3 install uwsgi -I

2.libssl-dev追加

RUN apt-get install -y libssl-dev