django - 使用 Apache2 和 Daphne 部署 django-channels
问题描述
我正在尝试学习使用django-channels
,并且已经完成了教程和这个多聊天示例。我现在正在尝试使用 Apache 和 Daphne 将它部署在 Digital Ocean 液滴上。我很乐意单独使用 Daphne,但我不知道如何使用。
所以这是我的 Apache conf 文件:
<VirtualHost *:80>
ServerAdmin webmaster@mysite.co.uk
ServerName multichat.mysite.co.uk
ServerAlias www.multichat.mysite.co.uk
DocumentRoot /var/www/multichat
WSGIDaemonProcess multichat python-path=/var/www/multichat python-home=/var/www/multichat/env
WSGIProcessGroup multichat
WSGIScriptAlias / /var/www/multichat/multichat/wsgi.py
Alias /robots.txt /var/www/multichat/static/robots.txt
Alias /favicon.ico /var/www/multichat/static/favicon.ico
Alias /media/ /var/www/multichat/media/
Alias /static/ /var/www/multichat/static/
<Directory /var/www/multichat/static>
Require all granted
</Directory>
<Directory /var/www/multichat/media>
Require all granted
</Directory>
WSGIScriptAlias / /var/www/multichat/multichat/wsgi.py
<Directory /var/www/multichat/multichat>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
我已经安装了 Redis 并让它运行起来。
我已将此文件包含在/etc/systemd/system/daphne.service
[Unit]
Description=daphne daemon for multichat
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/var/www/multichat/multichat
ExecStart=/var/www/multichat/env/bin/daphne -b 0.0.0.0 -p 8001 multichat.asgi:application
# Not sure if should use 'on-failure' or 'always'.
Restart=on-failure
[Install]
WantedBy=multi-user.target
虽然网页出现并且我可以登录等,但当谈到聊天室时,我在控制台中出现以下错误:
WebSocket 连接到“ws://multichat.mysite.co.uk/chat/stream/”失败:WebSocket 握手期间出错:意外响应代码:404
我显然没有正确设置某些东西,但我不知道该去哪里。如果我能得到一个关于如何只使用 Daphne 的指示,我会很高兴地刮掉 Apache,但我已经尝试过,但也无济于事
解决方案
您已将 Apache 配置为使用 WSGI 协议提供 Django 内容,但 WSGI 不支持 Web 套接字。这就是达芙妮在这里的原因。它不使用 WSGI 来提供 Django 内容,因此您可以将它与 Web 套接字一起使用。
要改用 Daphne,您应该从 apache 文件中删除 WSGI 设置并ProxyPass
改为放置,它应该指向您的 daphne 服务器。正确的行应如下所示:
ProxyPass http://127.0.0.1:8001/
由于您的 daphne 服务器在同一台服务器上运行,但在端口 8001 上。
推荐阅读
- sql - 查询具有相关模型外键的相关模型(在一个优化查询中)
- mysql - 在 MySQL 中,如何根据另一个表中的更新列来更改表中列的值?
- android - 如何使用套接字将浮点数组发送到服务器
- algorithm - 如何在 dart-flutter 中对这样的时间列表进行排序 [ 2:00 AM , 10:00 AM , 6:00 PM ]?
- r - 我想在 R 中安装旧版本包
- react-native - 用于 tabBarLabel 的 React Navigation v5 更新本地化不起作用
- python - 如何使用包含字符串值的列表处理 Pandas 数据框列,获取唯一单词
- java - 当属性引用同一类时,如何将 DTO 转换为实体
- validation - Vuetify 数据表内联编辑验证
- css - 背景图像属性仅适用于 Firefox 浏览器