在服务器上部署项目, 然后再在这里记录部署流程
首先我们需要将项目git clone 到我们的服务器上, 主角来了才能开场
环境及配置:
系统ubuntu20.04.1 LTS, 语言及版本python3.8
需要用到的工具及第三方库
supervisor, nginx, gunicorn, virtualenv
-
先安装virtualenv
pip install virtualenv
-
创建虚拟环境
如果是想使用系统默认的python版本进行创建, 则运行virtualenv 虚拟环境名称
如果是要创建指定Python版本的虚拟环境则需要了解到该版本的Python安装到了哪里, 由于我的服务器是ubuntu, /usr/bin/python3.8是Python的安装路径, 找到python的安装路径后, 则运行virtualenv -p python安装路径 虚拟环境名称
-
创建完毕后, 然后进入该虚拟环境
source 虚拟环境路径/虚拟环境名称/bin/activate
-
然后我们需要将项目的依赖, 也就是项目所需要的第三方库都安装好
如果项目中携带有requirements.txt文件, 则执行pip install -r requirements.txt
没有的话则执行pip install XXX
需要注意的是, 我在登录该服务器时使用的不是超级管理员的账户, 所以某些命令需要使用到sudo才能执行;在全局环境中使用pip安装第三方库会提示你没有权限安装, 需要在pip命令前面加上sudo; 然而在虚拟环境中, 不需要使用到sudo去执行pip命令, 如果用sudo去执行pip命令的话会将依赖包都安装到了全局环境, 而不是虚拟环境
-
.env文件配置
我们的项目某些环境配置不是写死的, settings.py文件需要用到.env文件来进行参数配置, 所以我们还需要配置一下.env文件. 这个情况下需要看大家自己的项目需要配置哪些参数, 我就不写出来了, .env文件的参数配置随自己的项目而定; 如果是需要用到.env文件但又忘记配置则可能会在运行项目时出现一些奇奇怪怪的错误 -
安装gunicorn
pip安装就行
安装完了之后, 执行以下命令检验是否运行成功gunicorn --env DJANGO_SETTINGS_MODULE=(settings文件所在目录的名称).settings -b:8000 (settings文件所在目录的名称).wsgi
如果没有看到报错那么也就是说运行成功了, ctrl+c将运行中的gunicorn停止 -
第三方库都安装完之后, 运行项目
python manage.py runserver
通常来说项目没问题, 依赖都安装好了之后就不会报错, 如果报错请检查是否都将依赖都安装完整了或者是否配置了.env文件(当然有些项目是不需要.env文件的就略过)
使用runserver命令运行成功了的话就说明目前项目运行状况是没有问题的, 接下来就得配置nginx还有supervisor了.
nginx配置
以往我们在测试机上配置项目的nginx文件的时候是配置在了**/etc/nginx/conf.d/目录下, 现在我们是配置在了/etc/nginx/sites-enabled/**目录下, 我记得我之前也在该机子上配置了另一个项目的nginx配置文件在conf.d文件夹下, 后来我找不到了, 还以为被吃了, 原来被同事换到sites-enabled文件夹下了(哈哈哈好尴尬哦)
然后我们开始配置nginx文件, 下面放出该项目的配置
server {
listen 80;
server_name http://127.0.0.1:8000; # 注意按照自己的项目配置好
client_body_in_single_buffer on;
client_max_body_size 100m;
client_header_buffer_size 50m;
large_client_header_buffers 4 20m;
access_log /var/log/nginx/projectname-access.log; # 这里是nginx输出日志的配置
error_log /var/log/nginx/projectname-error.log; # 这里是nginx输出错误日志的配置
# inventory management webapp 我们项目是前后端分离的, 这里是前端的配置
location /_nex/ {
alias /mnt/data/projectname/web-name/out/_next/;
}
# inventory management webapp 我们项目是前后端分离的, 这里是前端的配置
# 需要注意的是, 当所有的配置都完成后, 记得build一下前端, 不然有可能会出现无限重定向的问题导致500, 暂时不需要修改下面的last参数
location / {
alias /mnt/data/projectname/web-name/out/;
if (!-e $request_filename){
rewrite ^(.*)$ $1.html last;
}
}
location /api {
proxy_pass http://127.0.0.1:8000/api; # 注意按照自己的项目配置好
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
real_ip_recursive on;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
supervisor配置
我把项目的supervisor配置文件写到了**/etc/supervisor/conf.d/**下, 以下是该项目的supervisor配置
# 注意将projectname改为你的项目名称
[group:projectname]
programs:projectname_django, projectname_celery
[program:projectname_django]
autorestart=true
command=/mnt/data/projectname/projectname-venv/bin/gunicorn projectname.wsgi --reload --access-logfile '-' --error-logfile '-' -w 5 -k gthread -b 127.0.0.1:8000
directory=/mnt/data/projectname
process_name=%(program_name)s-%(process_num)01d
numprocs=1
numprocs_start=0
user = ubuntu
redirect_stderr=true
stdout_logfile_maxbytes = 100MB
stdout_logfile_backups = 20
# supervisor的运行日志配置
stdout_logfile=/mnt/data/projectname/logs-projectname/%(program_name)s-%(process_num)01d.log
# supervisor的错误日志配置
stderr_logfile=/mnt/data/projectname/logs-projectname/%(program_name)s-%(process_num)-error.log
# 如果项目中有使用到celery则需要配置上celery
[program:projectname_celery]
autorestart=true
command=/mnt/data/projectname/projectname-venv/bin/celery -A projectname worker -l info
directory=/mnt/data/projectname
process_name=%(program_name)s-%(process_num)01d
numprocs=1
numprocs_start=0
redirect_stderr=true
stdout_logfile=/mnt/data/projectname/logs-projectname/%(program_name)s-%(process_num)01d.log
我们可以将projectname_django里的command参数命令拿出来在系统中执行, 看看是否能够正常运行, 也就是/mnt/data/projectname/projectname-venv/bin/gunicorn projectname.wsgi --reload --access-logfile '-' --error-logfile '-' -w 5 -k gthread -b 127.0.0.1:8000
(注意到了吗, 我们已经将gunicorn的启动命令放到这里来了)
运行结果没报错的话就没什么大问题了, 要是不成功的话就按照提示修复一下吧, 单独将其提取出来运行是为了减少排错时间, 可以减少时间成本(废话)
项目启动
以上都完成了之后, 项目的配置就基本完成了, 然后我们就需要将项目启动
启动supervisor托管
项目的启动我们已经交给了supervisor托管了, 所以我们需要将supervisor启动就可以了, 当supervisor在管理着众多项目时, 我们不可能将supervisor都重启, 我们只需要将该项目的supervisor托管启动就行了sudo supervisorctl restart projectname:*
命令中的 ’ * ’ 号包括了我们在配置文件中的两个配置: projectname_django和 projectname_celery, 你也可以执行sudo supervisorctl restart projectname:projectname_django
sudo supervisorctl restart projectname:projectname_celery
重启nginx
每当我们更新了nginx配置的时候, 我们需要将nginx重启sudo /etc/init.d/nginx reload
然后再在浏览器按照你配置的域名去访问就能看到你的项目了
如果报错了, 就先看看nginx报错日志, 如果nginx报错日志没有输出, 那么就需要在supervisor的报错日志里面去查看
遇事不要慌~
不要慌, 问题不大; 问题很大, 慌也没用
参考文章
Nginx+Gunicorn+Supervisor 搭建 Django 项目环境
在 Linux 上部署 Django 应用,nginx+gunicorn+supervisor