引言
由于工程需要包含聊天功能,希望使用websocket进行通信。然而,dwebsocket模块虽然在runserver时运行正常,但在Nginx+Uwsgi部署下无法正常运行。事实上由于wsgi协议的工作流,长连接如websocket几乎不可能维持。所以需要寻找新的实现方式。下面介绍包括使用Redis作为django的缓存及websocket的开发环境和生产环境配置。
注: 由于我用的是root账号,不需要使用sudo。在安装中如果出现权限不足的问题请自行加sudo。
第一次写这种类型的博客,如有错误敬请指正。
从哪里开始
原先的配置基本是按照黄超的博客进行的,本段内容基本上与该文章一致,截取到安装虚拟环境的内容。如果已经配置了Uwsgi和Nginx,只是需要对websocket的支持,可以跳过本段。
mysql安装
apt install mariadb-server mariadb-client libmariadbd-dev libmysqlclient-dev
service mysql restart
service mysql status
mysql_secure_installation
Enter current password for root:[Just enter]
Set root password?[Y/n] Y
#enter your password
Remove anonymous users?[Y/n] Y
Disallow root login remotely?[Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now?[Y/n] Y
#Thanks for using MariaDB!
service mysql restart
安装Nginx
如果在本机runserver,则不需要安装Nginx。
apt install nginx
安装php
apt install php php-fpm
虚拟环境
apt install python3-dev
apt install python3-venv
python3 -m venv /path/to/.venv
进入虚拟环境:
source /path/to/.venv/bin/activate
退出虚拟环境:
deactivate
注: 请注意把/path/to换成自己的路径。
Redis安装与配置
Redis安装
apt-get install redis-server
安装完成后在linux下使用:
service redis-server start
开启redis-server。
可以用这个命令来检测redis-server是否正常工作:
redis-cli ping
PONG
收到PONG说明正常工作。
配置redis使用unix域套接字
这一小段设置使得redis使用unix域套接字而不是TCP/IP。可以选择忽略这一段。这会导致需要在django的settings.py
文件中的设置略有不同。
vim /etc/redis/redis.conf
# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
# port 6379
# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1
# Specify the path for the unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
unixsocket /path/to/redis.sock
unixsocketperm 777
以上实际是将:
port 6379
bind 127.0.0.1
注释掉,并将:
unixsocket /path/to/redis.sock
unixsocketperm 777
取消注释。
更改conf后,用:
service redis-server restart
重启服务。
配置Redis作为django会话存储和缓存的后端
在settings.py
文件中,设置:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "unix:///path/to/redis.sock?db=0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
保证MIDDLEWARE_CLASSES中以下内容存在:
MIDDLEWARE_CLASSES = [
'django.middleware.cache.UpdateCacheMiddleware', # This must be first on the list
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
...,
'