Развертывание Django-Channels 2 Apache CentOS 7 - PullRequest
0 голосов
/ 11 сентября 2018

Я не могу заставить Apache обслуживать веб-сокеты через Дафни. needs.txt Django==2.0.7 channels==2.1.3 asgiref==2.3.2 redis==2.10.6
settings.py

CHANNEL_LAYERS = {
    "default":{
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("localhost"), 6379],
        },
        "ROUTING": "myapp.routing.channel_routing",
    },
}

ASGI_APPLICATION = "myapp.routing.application"
USE_WEBSOCKETS = True

routing.py

#..imports  

websocket_urlpatterns = [
    url(r"", MyConsumer),
]

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                websocket_urlpatterns
            )
        )
    )
})

asgi.py

#.. imports

os.environment.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
application = get_default_application()

MyConsumer.py

#..imports

class MyConsumer(WebsocketConsumer):
    def websocket_connect(self, event):
        Logger.log("Connected " + json.dumps(event))
        self.send({
            "type": "websocket.accept"
        })

    def websocket_receive(self, event):
        Logger.log("Receive " + json.dumps(event))

    def websocket_disconnect(self, event):
        Logger.log("Disconnected " + json.dumps(event))

httpd.conf

#...
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC, OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://127.0.0.1:9001%{REQUEST_URI} [P, QSA, L]

supervisord.conf

;...    
[fcgi-program:asgi]
socket=tcp://127.0.0.1:9001
command=/var/www/venv/bin/daphne -u /run/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers myapp.asgi.application
numprocs=2
process_name=asgi%(process_num)d
directory=/var/www/venv/myapp/
autostart=true
autorestart=true
stdout_logfile=/tmp/asgi.log
redirect_stderr=true

В javascript я просто пытаюсь подключиться:

var location = window.location
var socket = new WebSocket('ws://' + location.host + ':9001' + location.pathname)
socket.onopen = function(e){
    console.log('open', e)
}
socket.onerror = function(e){
    console.log('error', e)
}
socket.onclose = function(e){
    console.log('close', e)
}

Каждый раз, когда к странице обращаются, через некоторое время она выдает WebSocket connection to 'ws://127.0.0.1:9001/' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET и печатает ошибкуи закройте сообщения в консоли.
Я следовал примеру настройки, предоставленной в readthedocs , и использовал экземпляр nginx, но он выдает ту же ошибку.
Кажется, что сообщение не получено бэкэндом, так что я полагаю, что в настройке должно быть что-то, а именно очередь сообщений или сервер redis.Чего мне не хватает?

1 Ответ

0 голосов
/ 09 ноября 2018

Да, я потратил немало времени на устранение неполадок, связанных с настройкой, аналогичной вашей. В настоящее время я использую каналы channel2, daphne, redis и apache вместе на сервере centos 7.5. Наконец работает отлично.

Я считаю, что устранение неполадок немного проще с помощью AsyncConsumer, дает немного больше контроля. Попробуйте сделать:

from channels.consumer import SyncConsumer, AsyncConsumer
class ChatConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        # when the socket connects
        print(event)
        await self.send({
            "type": "websocket.accept"
        })

тогда вы можете увидеть входящие данные, если таковые имеются.

А для apache, как и у вас, я использую движок перезаписи. (в файле vhost)

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://127.0.0.1:9001%{REQUEST_URI} [P,QSA,L]

Надеюсь, вы это выясните! / R

...