使用Apache2和Daphne部署Django频道

时间:2019-02-21 14:20:35

标签: django django-channels

我正在尝试学习使用django-channels,并且已经完成了本教程和this multichat example的学习。我现在正尝试使用Apache和Daphne将其部署在Digital Ocean Droplet上。我会很乐意单独使用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,但是我尝试过并且也没有用

3 个答案:

答案 0 :(得分:1)

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

要改为使用Daphne,应从apache文件中删除WSGI设置,并放入ProxyPass,它应指向daphne服务器。正确的行应如下所示:

ProxyPass http://127.0.0.1:8001/

由于daphne服务器在同一服务器上运行,但是在端口8001上。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

如果您正在使用daphane,请尝试运行以下命令。您很有可能会获得静态文件。

{{1}}

供参考,请通过https://docs.djangoproject.com/en/2.0/howto/static-files/deployment/#serving-static-files-in-production