使用 Apache2 和 Daphne 部署 django-channels

Posted

技术标签:

【中文标题】使用 Apache2 和 Daphne 部署 django-channels【英文标题】:Deploy django-channels with Apache2 and Daphne 【发布时间】:2019-02-21 14:20:35 【问题描述】:

我正在尝试学习使用django-channels,并且已经完成了教程和this multichat example。我现在正在尝试使用 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

虽然网页出现并且我可以登录等,但当谈到聊天室时,我在控制台中出现以下错误:

到 'ws://multichat.mysite.co.uk/chat/stream/' 的 WebSocket 连接 失败:WebSocket 握手期间出错:意外的响应代码: 404

我显然没有正确设置某些东西,但我不知道该去哪里。如果我能获得有关如何仅使用 Daphne 的指示,我会很高兴地刮掉 Apache,但我已经尝试过,但也无济于事

【问题讨论】:

How to configure Apache to run ASGI in Django Channels? Is Apache even required?的可能重复 Henry,你能添加适合你的 apache 代码吗? 【参考方案1】:

您已将 Apache 配置为使用 WSGI 协议提供 Django 内容,但 WSGI 不支持 Web 套接字。这就是达芙妮在这里的原因。它不使用 WSGI 来提供 Django 内容,因此您可以将它与 Web 套接字一起使用。

要改用 Daphne,您应该从 apache 文件中删除 WSGI 设置,并改用 ProxyPass,它应该指向您的 daphne 服务器。正确的行应该是这样的:

ProxyPass http://127.0.0.1:8001/

因为您的 daphne 服务器在同一台服务器上运行,但在端口 8001 上。

【讨论】:

我删除了 WSGI,但现在出现内部服务器错误,消息是“没有协议处理程序对 IRL /chat/stream/ 有效(方案 'http')。如果您使用的是mod-proxy 的 DSO 版本,确保代理子模块包含在使用 Loadmodule 的配置中" 我已经运行a2enmod proxy_http,它对上述内容进行了排序,但现在我“尝试连接到 127.0.0.1:8001 (127.0.0.1) 失败”“无法连接到后端:127.0。 0.1" 这是否意味着达芙妮运行不正常? 因此,如果我从终端运行daphne multichat.asgi:application --port 8001 --bind 0.0.0.0 -v2,我可以启动网站,但没有加载任何静态文件并且聊天功能不存在 删除 WSGI 设置 意味着删除 WSGIScriptAliasdirectory for wsgi.py 和所有内容,对吗?【参考方案2】:
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]

<Location />
    ProxyPass http://127.0.0.1:8001/
</Location>

#And load the next modules in the main file config:

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_module modules/mod_proxy.so

#remove WSGI settings

【讨论】:

以上是关于使用 Apache2 和 Daphne 部署 django-channels的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要使用 daphne 进行反向代理?

使用 nginx、django、daphne 部署到 docker

使用 Daphne 和 Nginx 部署 django 频道的问题

使用daphne部署django channles websocket 项目

使用 SSL 使用 Daphne + NGINX 部署 Django 通道

在 nginx 后面使用 Daphne