ubuntu服务器部署uwsgi+Django项目详细步骤
本文使用的宝塔面板,部分操作宝塔操作更方便,但不是必须。
文章目录
0. 宝塔新建一个站点,同时建立数据库
1.安装Django,
导入包 xlrd xlwt attr redis environs attrs attr loguru retrying pyquery aiohttp……缺什么导什么
(这里用sudo导入,否则普通用户导入的包其他用户无法使用)
导入包发生错误或超时参考https://blog.csdn.net/xbean1028/article/details/104885299第四条
2.上传代码
Xftp或者宝塔都可以
3. Django 收集静态文件
python manage.py collectstatic
报错1:
ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
解决办法:https://blog.csdn.net/xbean1028/article/details/102762001
报错2:STATIC_ROOT,修改
STATIC_ROOT = os.path.join(BASE_DIR, "/static/")
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
4.数据库,数据库创建,添加管理员
python manage.py makemigrations
python manage.py migrate
#管理员
python manage.py createsuperuser
5.Django单独运行测试
python manage.py runserver
:XXXX设置端口
可以在本地访问服务器相应端口,注意以下问题
- 修改setting
DEBUG = True
ALLOWED_HOSTS = ['*']
- 服务器(如我的阿里云)和宝塔都放行相应端口
6.uwsgi安装与测试运行
-
通过pip3安装uwsgi (同样建议sudo安装)
-
编辑uwsgi.ini文件
[uwsgi] #使用nginx连接时使用 socket=127.0.0.1:8001 #直接做web服务器使用 python manage.py runserver ip:port #http= :8001 #项目目录 chdir=/www/wwwroot/test.xubean.top #项目中wsgi.py文件的目录,相对于项目目录 wsgi-file=WebWorm/wsgi.py #指定启动的工作进程数 processes=4 #指定工作进程中的线程数 threads=2 #指定在这些进程里有一个主进程 master=True #保存启动之后主进程的pid pidfile=uwsgi.pid module=WebWorm.wsgi:application #设置uwsgi后台运行,uwsgi.log保存日志信息 #daemonize=uwsgi.log #使用supervisor时把此行注释
-
在该文件目录下运行(此时Django是关闭的)
uwsgi --ini uwsgi.ini # 注意命令路径,例如我的目录/www/wwwroot/test.xubean.top$ uwsgi --ini uwsgi.ini
此时若正常,则本地可以访问端口
-
若显示找不到uwsgi命令,需要先查找位置
whereis uwsgi
# 运行命令时,使用 位置/uwsgi --ini uwsgi.ini
7.Neinx设置
location / {
include uwsgi_params;
#同uwsgi内容
uwsgi_pass 127.0.0.1:8001;
#链接超时时间
uwsgi_read_timeout 30;
}
8.supervisor 一定要用sudo启动
https://blog.csdn.net/gaifuxi9518/article/details/89952899
我没有用宝塔的supervisor,我用pip3安装,现在supervisor4已经支持Python3了,不需要虚拟环境
- 安装:
pip install supervisor
- 配置Supervisor
# 安装完成之后我们可以使用下面的命令来查看supervisor的一个默认配置模板:
echo_supervisord_conf
# 然而上面命令输出的结果仅是一个模板,我们需要使用下面的命令在/etc目录下生成配置文件:
echo_supervisord_conf > /etc/supervisord.conf
# 之后我们可以使用vim查看该文件的内容
vim /etc/supervisord.conf
-
修改配置文件
我们可以看到,该配置文件内容一大堆,但是我们目前仅需要知道并改文件末尾的这个部分就可以了,这是默认写法
;[include] ;files = relative/directory/*.ini
分号;后面的是注释内容,我们首先把它去掉,然后将files的值改为:
分号;后面的是注释内容,我们首先把它去掉,然后将files的值改为:
[include] files = /etc/supervisor/*.conf
include可以理解为包含,它的意思是将/etc/supervisor/目录下的,所有以.conf结尾的文件包含进来,/etc/下的supervisor/文件夹默认是不存在的,我们需要手动创建:
include可以理解为包含,它的意思是将/etc/supervisor/目录下的,所有以.conf结尾的文件包含进来,/etc/下的supervisor/文件夹默认是不存在的,我们需要手动创建:
cd /etc mkdir supervisor
以.conf结尾的文件文件也是默认不存的,也需要我们根据需求自己创建,一个conf文件代表的是一个程序,假如我需要supervisor管理uwsgi程序,那么就在/etc/supervisor/目录下创建一个uwsgi.conf文件,在里面写入配置信息,如果需要管理其他的xx程序,就重新创建一个xx.conf文件。
以.conf结尾的文件文件也是默认不存的,也需要我们根据需求自己创建,一个conf文件代表的是一个程序,假如我需要supervisor管理uwsgi程序,那么就在/etc/supervisor/目录下创建一个uwsgi.conf文件,在里面写入配置信息,如果需要管理其他的xx程序,就重新创建一个xx.conf文件。
好,现在我们就创建一个uwsgi.conf文件:
vim /etc/supervisor/uwsgi.conf
将下面内容复制到文件中
将下面内容复制到文件中
[program:uwsgi] command=/usr/local/bin/uwsgi --ini /home/mysite_uwsgi/mysite.ini user=root autorestart=true autostart=true startretries=3 redirect_stderr=true startsecs=5 stdout_logfile=/var/log/django/supervisor.log stopasgroup=true killasgroup=true priority=999
参数介绍:
command:需要托管给supervisor执行的命令,这里是uwsgi的启动命令,这里需要按自己的情况更改 user:执行命令的用户,这里填root,你可以填其他的,只要有权限即可 autorestart:uwsgi关闭后是否自动重启 autostart:是否随supervisor启动而启动 startretries:启动失败自动重试次数,默认是 3 redirect_stderr:把 stderr 重定向到 stdout,默认 false startsecs:启动 5 秒后没有异常退出,就当作已经正常启动了 stdout_logfile:日志文件存放目录 stopasgroup:是否干掉程序的所有进程(包括子进程) killasgroup:作用同上 priority:程序启动优先级,若有多个进程管理时使用,默认-1
-
启动Supervisor
4.1 修改uwsgi配置
之前我们在uwsgi的配置文件中设置了一个日志文件保存位置的参数:daemonize = /home/mysite_uwsgi/mysite.log
但是这个参数的配置与Supervisor的日志输出配置是有冲突的,需要注释掉它,因为在前面加个#:
#daemonize = /home/mysite_uwsgi/mysite.log
4.2 干掉uwsgi进程
在使用Supervisor启动uwsgi之前,我们需要先把uwsgi正在运行的进程都干掉,如果你之前没有运行uwsgi,这一步可以跳过:ps -aux | grep uwsgi |awk '{print $2}'|xargs kill -9
4.3 启动Supervisor
4.3查看运行状态
上一步执行成功之后,如果没有报错那么就是启动成功了,然后我们执行下面的命令查看uwsgi启动状态sudo supervisord -c /etc/supervisord.conf # 强烈建议sudo,因为没有sudo出现权限问题
4.3查看运行状态
上一步执行成功之后,如果没有报错那么就是启动成功了,然后我们执行下面的命令查看uwsgi启动状态supervisorctl status
如果显示:
uwsgi RUNNING pid 20986, uptime 0:31:33
那么代表的就是启动成功,可以看到这个结果有四列,uwsgi代表的是进程名称,RUNNING代表的进程启动状态,pid代表的是进程id,uptime代表的是进程运行时间。4.5 管理Supervisor
#查看所有进程的运行状态 supervisorctl status #查看某一进程的运行状态 supervisorctl status 进程名 #启动某一进程 supervisorctl start 进程名 #启动所有进程 supervisorctl start all #停止某一进程 supervisorctl stop 进程名 #停止所有进程 supervisorctl stop all #重启某一进程 supervisorctl restart 进程名 #重启所有进程 supervisorctl restart all #新增进程后,更新进程(不影响其他进程运行) supervisorctl update #新增进程后,重启所有进程 supervisorctl reload
4.6 常见问题
如果你遇到了下面的错误
ERROR (no such process)
那就是进程名称写错了。
其他问题详见https://blog.csdn.net/gaifuxi9518/article/details/89952899
9.proxy &运行 ,exit退出
因为我使用了爬虫伪装代理IP,需要后台运行ProxyPool
安装见https://blog.csdn.net/xbean1028/article/details/104885239
python3 run.py & #后台运行
& 表示在后台执行脚本,这样可以到达目的,但是,我们退出shell窗口的时候,必须用exit命令来退出,
否则,退出之后,该进程也会随着shell的消失而消失(退出、关闭)
10 定时爬取,宝塔定时任务
我使用到了定时爬虫,直接用的宝塔定时任务,方便快捷