Ubuntu下部署Django项目
1.首先要进入本地环境把项目所需要的环境导出来
pip freeze >requirements.txt
2.安装python3.6.8版本
3.安装得到的requirements.txt 命令:pip3 install -r requirements.txt 全部安装
如果遇到HTTPConnectionPool(host=''xx.xx.xx.xx', port=xx): Max retries exceeded with url: (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000237EE44EF98>: Failed to establish a new connection: [WinError 10060]错误
处理方法:https://www.cnblogs.com/erhangboke/p/11663057.html
4.修改项目的settings文件
DEBUG = False(线上的项目一定要修改成False)
ALLOWED_HOSTS = ["*"]
5.在django的settings文件中,添加下面一行内容:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
7.配置路由(貌似不是必须)
url(r'^static/(?P<path>.*)',serve,{"document_root":settings.STATIC_ROOT}),
6.进入项目目录执行下面代码
收集admin后台的静态文件,如果不执行,将来访问linux的mysite的admin/xadmin将没有样式:
python manage.py collectstatic 会提示 是否继续这样做? yes
7.进入linux通过cd切换到项目的目录下 输入下列命令可以运行证明已经完成了大部分操作
python3 manage.py runserver 0.0.0.0:8000
本地访问xxx:8000/xxx地址可以访问成功,说明环境OK
8.完成了上一步发现当终止回话时,就不能在访问了,下面就是部署终止客户端会话亦可以访问
9、安装必备内容
9.1安装nginx
sudo apt-get update
apt-get install nginx(目录在/etc/nginx下)
链接到uwsgi的启动配置文件中
ln -s /etc/nginx/nginx.conf /etc/nginx/conf.d/
安装完成后,使用service nginx start命令启动后,本地访问10.205.1.203,显示welcome to nginx即安装成功
service nginx restart(start/status/stop/reload)
9.2安装SSH
apt-get install openssh-server
9.3安装 uwsgi
sudo apt-get install python3-setuptools
sudo apt-get install python3-dev
pip install uwsgi
10.在你的项目下/data/jenkins/mysite 创建一个uwsgi.ini的配置文件
[uwsgi]
#Django-related settings
#uwsgi这个服务监听的是9001端口,如果nginx想要向uwsgi转发请求,那么nginx必须使用9001端口发送请求。
socket = 127.0.0.1:9001
#项目绝对路径(手动设置)
chdir = /data/jenkins/mysite
#Django的wsgi文件相对路径(不要写绝对路径,写相对路径,自己设置)
wsgi-file =mysite/wsgi.py
#process-related settings
#master
master = True
#最大进程数
processes = 4
#线程数
threads = 2
#设置此参数,有一个主进程
master=True
#守护进程的方式运行,log日志存在此log文件里
deamonize=/var/log/uwsgi/mysite.log
disable-logging = true
#主进程id写入文件里
pidfile= /var/log/nginx/uwsgi.pid
#... with appropriate permissions - may be needed
#chmod-socket = 664
#退出时,清理环境
vacuum = True
reload-mercy = 10
max-requests = 5000
limit-as = 512
buffer-size = 30000
11. 输入下面命令,查看nginx默认配置文件的目录
nginx -t
默认文件目录为/etc/nginx/nginx.conf
然后cd到/etc/nginx/下
输入vim.nginx.conf
可以看出会加载/etc/nginx/conf.d文件夹下的任意.conf结尾的文件
cd到etc/nginx/conf.d文件夹,然后ls发现里面没有文件,所以需要自己新建文件dj_nginx.conf(文件名随便起,.conf结尾就可以)##
12.在dj_nginx.conf ##输入一下代码.一定要记得改路径
server {
listen 8000;
server_name 0.0.0.0;
access_log /var/log/nginx/mysite_access.log;
error_log /var/log/nginx/mysite_error.log;
charset utf-8;
keepalive_timeout 65;
client_max_body_size 75M;
root /data/jenkins/mysite; #修改路径
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9001;
uwsgi_read_timeout 300; //这个时间可以设置长一写,防止请求页面出现504超时问题
}
location /static/ {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /data/jenkins/mysite/static/;#修改路径
}
location /media/ {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /data/jenkins/mysite/media/;#修改路径
}
}
先用nginx -t查看是否有错,有错解决,没错重启service nginx restart/reload
10.205.123::8000/xxx
最好在项目下创建start.sh的文件,内容uwsgi -i uwsgi.ini
或者命令行执行也可以
如果遇到:uwsgi: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory错误
解决方法:https://www.cnblogs.com/erhangboke/p/11673156.html
netstat -apn | grep 8000/lsof -i :8000 查看8000端口是谁在使用
kill -9 pid号 强制关闭占用端口的程序(或者更换监听的端口)
来个更强大的命令:ps -ef|grep uwsgi|awk {'print $2'}|xargs kill -9
问题来了:
部署完成后发现执行了uwsgi -i uwsgi.ini命令后没有后台运行,停止了命令,项目仍然停止了
优化:
在项目中创建一个.sh.结尾的shell文件 start.sh
由于执行uwsgi -i uwsgi.ini会产生一些log内容,创建一个mysite.log文件,将产生的log打印到mysite.log(路径可以自己定)
shell代码:
#!/bin/bash
dir="/data/jenkins/workspace/RRD_mysite/logs/mysite.log"
if [ ! -d "$dir" ];then
touch $dir
echo "创建文件成功"
else
echo "文件已经存在"
fi
nohup uwsgi -i uwsgi.ini >$dir 2>&1 &
可以用jenkins配合部署:shell命令:
#!/bin/bash
BUILD_ID=DONTKILLME
echo "kill PID!"
ps -ef|grep uwsgi|awk {'print $2'}|xargs kill -9
sleep 2
cd $WORKSPACE
rm -rf report20*
rm -rf __pycache__
rm -rf logs/mysite.log
chmod +x start.sh
echo "start service!"
./start.sh