使用 Apache2 和 Daphne 部署 django-channels
Deploy django-channels with Apache2 and Daphne
我正在尝试学习使用 django-channels
并且已经学习了教程和 this multichat example。我现在正尝试使用 Apache 和 Daphne 将它部署在 Digital Ocean Droplet 上。我很乐意单独使用达芙妮,但我不知道如何使用。
这是我的 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 connection to 'ws://multichat.mysite.co.uk/chat/stream/'
failed: Error during WebSocket handshake: Unexpected response code:
404
我显然没有正确设置某些东西,但我不知道该转向哪里。如果我能得到关于如何只使用 Daphne 的指示,我会很高兴地抓取 Apache,但我已经尝试过但也没有任何结果
您已将 Apache 配置为使用 WSGI 协议为 Django 内容提供服务,但 WSGI 不支持网络套接字。这就是达芙妮在这里的原因。它不使用 WSGI 来提供 Django 内容,因此您可以将它与网络套接字一起使用。
要改为使用 Daphne,您应该从 apache 文件中删除 WSGI 设置并改为 ProxyPass
,它应该指向您的 daphne 服务器。正确的行应如下所示:
ProxyPass http://127.0.0.1:8001/
因为您的达芙妮服务器 运行 在同一台服务器上,但在端口 8001 上。
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
我正在尝试学习使用 django-channels
并且已经学习了教程和 this multichat example。我现在正尝试使用 Apache 和 Daphne 将它部署在 Digital Ocean Droplet 上。我很乐意单独使用达芙妮,但我不知道如何使用。
这是我的 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 connection to 'ws://multichat.mysite.co.uk/chat/stream/' failed: Error during WebSocket handshake: Unexpected response code: 404
我显然没有正确设置某些东西,但我不知道该转向哪里。如果我能得到关于如何只使用 Daphne 的指示,我会很高兴地抓取 Apache,但我已经尝试过但也没有任何结果
您已将 Apache 配置为使用 WSGI 协议为 Django 内容提供服务,但 WSGI 不支持网络套接字。这就是达芙妮在这里的原因。它不使用 WSGI 来提供 Django 内容,因此您可以将它与网络套接字一起使用。
要改为使用 Daphne,您应该从 apache 文件中删除 WSGI 设置并改为 ProxyPass
,它应该指向您的 daphne 服务器。正确的行应如下所示:
ProxyPass http://127.0.0.1:8001/
因为您的达芙妮服务器 运行 在同一台服务器上,但在端口 8001 上。
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