如何使用 Apache 和 Daphne 部署 django 通道?

问题描述 投票:0回答:2

我正在尝试部署这个使用通道的 django 应用程序。我使用 Apache 进行常规 HTTP 请求,并希望将 Web 套接字请求转发到 Daphne。

以下是我的一些重要文件:

apache 配置:

<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

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

Alias /static /home/anna/tchan/static
<Directory /home/anna/tchan/static>
Require all granted
</Directory>

Alias /media /home/anna/tchan/media
<Directory /home/anna/tchan/media>
Require all granted
</Directory>

<Directory /home/anna/tchan/tchan>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIScriptAlias / /home/anna/tchan/tchan/wsgi.py
WSGIDaemonProcess django_app python-path=/home/anna/tchan python-home=/home/anna/tchan/venv
WSGIProcessGroup django_app

</VirtualHost>

settings.py的最后几行:

ASGI_APPLICATION = 'tchan.routing.application' CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { "hosts": [('127.0.0.1', 8001)], }, }, }

asgi.py

import os import django from channels.routing import get_default_application from django.core.asgi import get_asgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tchan.settings') django.setup() application = get_default_application()
这些就位后,我运行 

daphne -p 8001 tchan.asgi:application

,然后运行 
sudo service apache2 reload
。
最后,当在我的页面中测试 websocket 时,会发生以下情况:

websocket.js:4 WebSocket 连接到“ws://192.168.0.57/ws/chat/8/”失败:WebSocket 握手期间出错:意外的响应代码:403

无论我是否运行 daphne,都会发生此错误 403。

我在这里做错了什么? 注意:当使用 Django 的开发服务器和 docker 作为通道层时,应用程序按预期工作,我认为问题出在我的 Apache 配置上。

django apache reverse-proxy channel daphne
2个回答
3
投票
我想通了。要使 apache 能够重定向,我们需要:

sudo a2enmod proxy sudo a2enmod proxy_http sudo a2enmod proxy_wstunnel
其中一个未启用,导致 403 Forbidden。


0
投票
Apache 目前不支持运行 ASGI 服务器。所以你应该使用 ir 作为反向代理而不是网络服务器。

您应该在后台将 daphne 作为服务运行,并在 apahce 配置中为位置 /ws/ 创建代理,并将它们代理到外部 daphne 服务器。

© www.soinside.com 2019 - 2024. All rights reserved.