Я настраиваю веб-приложение с системой чата.Изначально я следовал этому уроку: 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),
(все остальные файлы точно такие же, как в учебнике, но слегка подправлены)