Как я могу заставить мой сервер websocket каналов django работать через ssl? - PullRequest
0 голосов
/ 22 июня 2019

Я настраиваю веб-приложение с системой чата.Изначально я следовал этому уроку: https://channels.readthedocs.io/en/latest/tutorial/index.html

Он работал безупречно при разработке, но мне пришлось использовать daphne, чтобы заставить его работать при развертывании приложения, потому что я использую apache.

sudo daphne -b 0.0.0.0 -p 81 myapp.asgi:application

Но когда я использовал certbot для получения ssl-сертификатов для https, при попытке отправить сообщение я начал получать следующие ошибки консоли:

 Mixed Content: The page at: https://example.com/home/chat/46508f6fc17b04ad04ba0e8e5095e4b233944ed3d4145e5501ada21bab7042c6/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://example.com:81/ws/chat/46508f6fc17b04ad04ba0e8e5095e4b233944ed3d4145e5501ada21bab7042c6/'. This request has been blocked; this endpoint must be available over WSS.

Моей первой мыслью было изменение javascript в комнате..html из этого:

 var chatSocket = new WebSocket(
                    'ws://' + window.location.host +
                    ':81/ws/chat/' + roomName + '/');

в это:

var chatSocket = new WebSocket(
                    'wss://' + window.location.host +
                    ':81/ws/chat/' + roomName + '/');

это не сработало и привело к следующей ошибке при попытке отправить сообщение:

(index):150 Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

mysite-le-ssl.config:

<VirtualHost *:443>


        ServerName www.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined



         <Directory /home/me/myproject/myapp>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIScriptAlias / /home/me/myproject/myapp/wsgi.py
        WSGIDaemonProcess my-app python-path=/home/me/myproject python-home=/home/me/myproject/venv
        WSGIProcessGroup kalos-app

Include /etc/letsencrypt/options-ssl-apache.conf
ServerAlias mydomain.com
SSLCertificateFile /etc/letsencrypt/live/example.com-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com-0001/privkey.pem
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>

        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
</IfModule>

room.html (только для веб-сокетов):

var roomName = {{ room_name_json }};
document.getElementById("chat-log").scrollTop = document.getElementById("chat-log").scrollHeight;

var chatSocket = new WebSocket(
'wss://' + window.location.host +
':81/ws/chat/' + roomName + '/');

routing.py:

from . import consumers

websocket_urlpatterns = [
    url(r'^ws/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer),
    url(r'^wss/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer),

(все остальные файлы точно такие же, как в учебнике, но слегка подправлены)

...