centos7+宝塔+nginx+django+wsgi+asgi+daphne部署服务器环境
1.宝塔中建立站点
2.上传项目文件到站点目录中
上传文件后,请设置好setting.py,asgi.py,wsgi.py
3.安装项目依赖包
可以在虚拟机环境中安装,也也可以直接在本机系统中安装,根据自己的情况来看。
在原项目下使用导出需要安装的包名:
pip3 freeze > packages.txt
在服务器的虚拟环境下,一键下载项目依赖包:
pip install -r packages.txt
如果有数据库连接,请初始化数据库
进入项目根目录运行
python3 manage.py migrate
4.创建uwsgi的配置文件
在项目根目录创建一个名称myproject.ini,名称可以根据自己的项目名来定义
#添加配置选择
[uwsgi]
#配置和nginx连接的socket连接
socket=127.0.0.1:7003
#配置项目路径,项目的所在目录
chdir=/www/wwwroot/server.manai.tech/
#配置wsgi接口模块文件路径,也就是wsgi.py这个文件所在的目录
wsgi-file=myproject/wsgi.py
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.myproject.pid
#配置dump日志记录
daemonize=uwsgi.pmyproject.log
5.修改nginx配置
修改站点的nginx配置
listen 80;
server_name server.manai.tech api.pms.webok.me;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/server.manai.tech;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:7003; #端口要和uwsgi里配置的一样
uwsgi_param UWSGI_SCRIPT myproject.wsgi; #wsgi.py所在的目录名+.wsgi
uwsgi_param UWSGI_CHDIR /www/wwwroot/server.manai.tech/; #项目路径
}
6.uwsgi启动项目
确保先安卓了uwsgi 没安装 运行 pip3 install uwsgi
在项目的目录下运行一下命令(创建了虚拟的,要在虚拟环境下启动)
uwsgi --ini myproject.ini
停止:kill -9 pid / uwsgi --stop uwsgi.pid
问题1:实际应用过程中发现UWSGI没有主动释放内存,导致内存不断增大。
办法:启动时:uwsgi --ini uwsgi.ini --evil-reload-on-as 100 --evil-reload-on-rss 100
#虚拟内存或者实际内存大于100M,UWSGI主进程将重启子进程
问题2:没有uwsgi命令,uwsgi: command not found
find / -name uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
7.asgi相关配置,以便运行websocket项目
# websocket
upstream channels-backend {
server 127.0.0.1:8001;
}
进入项目目录运行daphne命令
daphne -p 8001 myproject.asgi:application -b 0.0.0.0
问题:运行上面命令提示 bash:daphne command not found
先卸载daphne
pip3 uninstall daphne
然后重新安装
pip3 install daphne
然后重新建立软连接
find / -name daphne
ln -s /home/spark/bulut/python3/python3/bin/daphne /usr/bin/daphne
然后重新运行daphne命令就可以了
8.websocket在线测试
http://www.jsons.cn/websocket/
9.supervisor进程管理
上面已经完成了Daphne的部署,但是此时启动daphne是在服务器屏幕前端启动的,启动之后没法干别的事,而且在进程挂掉之后也没法自动重启,这两个问题还是挺严重的,因此需要使用supervisor来管理进程。
安装supervisor
yum install -y supervisor
安装完之后,最重要的就是配置conf文件,首先生成conf文件:
echo_supervisord_conf > /etc/supervisord.conf
修改配置文件/etc/supervisord.conf,最后一行增加(注意[include]前面不能有;)
[include]
files = supervisord.d/*.ini
表示配置文件读取supervisord.d目录下所有后缀为.ini的文件。
创建配置目录,并创建配置文件
mkdir /etc/supervisord.d/
vi /etc/supervisord.d/asgi.ini
内容如下:
[program:asgi]
directory = /www/wwwroot/server.manai.tech # 项目根目录
command = daphne -b 0.0.0.0 -p 8001 myproject.asgi:application
autostart=true
autorestart=true
# 日志文件
stdout_logfile=/www/wwwroot/server.manai.tech/logs/%(program_name).asgi.log
stderr_logfile=/www/wwwroot/server.manai.tech/logs/%(program_name).asgi.log
[program:uwsgi]
directory = /www/wwwroot/server.manai.tech
command = uwsgi --ini /www/wwwroot/server.manai.tech/myproject.ini
autostart=true
autorestart=true
# 日志
stdout_logfile=/www/wwwroot/server.manai.tech/logs/%(program_name).uwsgi.log
stderr_logfile=/www/wwwroot/server.manai.tech/logs/%(program_name).uwsgi.log
# 这个是必须的,不然启动服务会报错可以通过下面网站查看具体配置怎么写
#[http://supervisord.org/configuration.html#supervisord-section-settings]
[supervisord]
# supervisor日志,这里日志文件需要到路径下手动创建
logfile = /www/wwwroot/server.manai.tech/logs/supervisord.log
pidfile = /www/wwwroot/server.manai.tech/logs/supervisord.pid
directory = /www/wwwroot/server.manai.tech/logs
childlogdir = /www/wwwroot/server.manai.tech/logs
启动supervisord
supervisord -c /etc/supervisord.conf
问题:Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
[root@air rootair]# ps -ef | grep supervisord
root 1438 1 0 03:12 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 2882 2820 0 03:14 pts/0 00:00:00 grep --color=auto supervisord
[root@air rootair]# kill -s SIGTERM 1438
然后重新运行supervisord -c /etc/supervisord.conf
使用supervisorctl tail program_name stderr命令查看错误信息
sudo supervisorctl tail daphne stderr
修改了Supervisor 配置文件正确配置后,可以使用以下命令重新加载配置文件以使其生效:
sudo supervisorctl reread
sudo supervisorctl update
注意:/etc/supervisord.d/asgi.ini里面的单词千万别错了 directory
其他:
停用uwsgi重启uwsgi(我这里启用uwsgi的端口是7003)
netstat -anp|grep 7003|awk '{print $7}'|awk -F '/' '{print $1}'|xargs kill -s 9
supervisorctl restart uwsgi
同理重启daphne
supervisorctl restart daphne