centos7部署django项目
最近闲着就来部署自己的项目了,
1.首先先准备一个干净的centos系统了,这里我的版本是centos7,系统安装我就跳过了,修改一下字体颜色,纯白的命令行看起来不是很友好
cd #直接任意目录下cd 回到根目录, vi .bashrc #在最下面添加 PS1="\[\e[37;40m\][\[\e[32;1m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\[\e[32;1m\]\$ \[\e[0m\]" ,颜色是根据个人喜好调的
2.准备Python3环境(我这里版本是3.6.8)
下载tar包地址https://www.python.org/downloads/release/python-368/
上传到linux服务器下安装tar -zxvf Python-3.6.8.tgz #解压 cd Python-3.6.8 # 进入解压后的目录 yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make #防止在新环境下安装pip时候缺少依赖而报错,所以先准备好 ./configure --prefix=/usr/local/python3 #编译环境 make && make install #执行安装
成功安装后看到
建立软连接
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3
查看版本
3.导出项目运行需要的包,我是用的pycharm,在pycharm的控制台输入 pip freeze > requirements.txt ,要是怕导出出错,那就执行pip list > requirements.txt,导出所有的包(建议删除报错的包,不行在导出全部包)
直接pip安装相关包 pip3 install -r requirements.txt ,换成豆瓣源安装 pip3 install -r requirements.txt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 或者命令永久更换源:pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/,也可以手动修改。依赖安装如果报出Can't connect to HTTPS URL because the SSL module is not available,可以去这个博客看看
vi /root/.config/pip/pip.conf添加以下
[global] index-url = https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com
安装libvirt模块,我这里是项目需要(kvm),不需要跳过此步骤 下载安装包 https://pypi.org/project/libvirt-python/6.8.0/#files yum install -y libvirt-devel tar -zxvf libvirt-python-6.8.0.tar.gz #解压 cd libvirt-python-6.8.0 python3 setup.py install #安装
安装Cx_oracle客户端,不需要跳过此步骤 下载地址 https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
下载tar包,下载地址 https://pypi.org/project/cx-Oracle/5.3/#files
tar -zxvf cx_Oracle-5.3.tar.gz
vi /etc/profile #修改环境变量
export ORACLE_HOME=/opt/pro/instantclient_11_2 #注意/opt/pro/是解压的客户端安装包的路径
export LD_LIBRARY_PATH=/opt/pro/instantclient_11_2:$LD_LIBRARY_PATH
source /etc/profile #生效环境变量
进入到解压的客户端路径,创建连接 cd instantclient_11_2/
ln -s libclntsh.so.11.1 libclntsh.so
在进入到cx_Oracle-5.3.tar.gz解压的路径执行
python3 setup.py install
安装wkhtmltopdf
yum install libXrender libXext fontconfig -y
wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz # 下载安装包
tar vxf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz #解压
cp wkhtmltox/bin/wk* /usr/local/bin/
ln -fs /usr/local/bin/wkhtmltopdf /usr/bin
wkhtmltopdf http://www.baidu.com ./test.pdf #测试
4.安装mysql数据库5.6
yum -y install wget
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz #下载编译好的mysql5.6二进制安装包,有网的情况下可以直接wget,没网就先去下好二进制包
tar -zxvf mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz #解压
mv mysql-5.6.33-linux-glibc2.5-x86_64 /usr/local/mysql #将解压后的安装包移动并重命名为mysql
groupadd mysql #添加mysql用户
useradd -g mysql mysql #添加属组
cd /usr/local/mysql
chown -R mysql:mysql ./ #给mysql文件夹权限
yum install -y libaio*
yum install -y perl perl-devel
yum install -y perl-Module-Install #安装前准备
./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data #安装
#修改配置文件
cd /usr/local/mysql/support-files
cp my-default.cnf /etc/my.cnf
vi /etc/my.cnf
#添加以下内容
[mysql]
default-character-set=utf8
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
symbolic-links=0
character-set-server=utf8
default-storage-engine=INNODB
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#保存瑞出
cp mysql.server /etc/init.d/mysql
chkconfig mysql on #开启自启动
#添加环境变量
vi /etc/profile
在最下面添加一行
export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile #设置生效
ln -fs /usr/local/mysql/bin/mysql /usr/bin #建立软连接
service mysql start
#设置数据库登录密码
mysql -uroot -p 直接回车进入
update mysql.user set password=password('password') where User="root"; #修改root的密码为password
flush privileges; #提交并更新
#允许外部ip连接数据库
use mysql;
grant all privileges on *.* to root@"%" identified by "password"; #授权
flush privileges;
退出重启
service mysql restart #重启
mysqldump -uroot -ppassword db_name > db_name.sql #导出库名为db_name的数据库文件
create database db_name charset=utf8; #在需要导入的新数据库创建相同库名的数据库
use db_name;
source db_name.sql; #在新库导入db_bame.sql文件,等待数据导入成功
5.安装redis 3.2.1
#安装依赖 yum -y install gcc automake autoconf libtool make
#下载依赖安装包 wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
# 解压到/usr/local
tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/ cd /usr/local/tcl8.6.1/unix/ ./configure make && make install
#下载redis的tar包
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar -zxvf redis-4.0.1.tar.gz #解压
cd redis-4.0.1
make MALLOC=libc
make PREFIX=/usr/local/redis install #安装
make test #测试安装
回到解压目录复制参数文件到/usr/local/redis/
cp redis.conf /usr/local/redis
cd /usr/local/redis #进入对应的安装目录
vi redis.conf
修改三处
bind 127.0.01 注释掉
daemonize no 修改为 daemonize yes
requirepass 设置密码(可以缺省)
设置开机自启
cp /opt/redis-4.0.1/utils/redis_init_script /etc/init.d/redis #拷贝解压目录的启动脚本
vi /etc/init.d/resid 修改一下内容
#chkconfig: 2345 90 10
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
CONF="/usr/local/redis/redis.conf"
chmod 755 /etc/init.d/redis
/etc/init.d/redis start #启动 service redis start 关闭 service redis stop
查看进程 ps -ef |grep -i redis
启动redis测试
/usr/local/redis/bin/redis-cli
6.安装nginx
#安装依赖 yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-devel
#下载nginx wget -c https://nginx.org/download/nginx-1.10.3.tar.gz
#创建nginx用户 useradd nginx -s /sbin/nologin -M
#解压 tar -zxvf nginx-1.10.3.tar.gz
#生成编译文件 cd nginx-1.10.3 ./configure make make install
#进入nginx程序目录 cd /usr/local/nginx #监测语法 /usr/local/nginx/sbin/nginx -t
#启动nginx cd /usr/local/nginx/sbin ./nginx
./nginx -s stop 关闭
./nginx -s reload 重启
#监测端口:netstat -lntup|grep 80 #监测进程:ps -ef | grep nginx #访问nginx
添加到system命令中
vi /etc/init.d/nginx
#!/bin/sh
# nginx - this script starts and stops the nginx daemin
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
chmod 755 /etc/init.d/nginx
chkconfig --add nginx
关闭原先启动的nginx
cd /usr/local/nginx/sbin
./nginx -s stop
systemctl start nginx.service #启动nginx
systemctl status nginx.service #nginx启动状态
7.配置uwsgi
#安装uWSGI pip3 install uWSGI==2.0.19.1 #软连接 ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi #创建启动脚本目录 mkdir -p /opt/pro/script/ #创建uwsgi初始化文件,添加以下内容 vi /opt/pro/script/uwsgi.ini [uwsgi] http-socket = ip:端口 # 改成你自己服务器ip # 项目目录 chdir=/opt/pro/你的项目名称 # 启动uwsgi的用户名和用户组 uid=root gid=root # 指定项目的application module=项目的app名称.wsgi # 指定sock的文件路径 socket=/opt/pro/script/uwsgi.sock # 启用主进程 master=true # 进程个数 workers=5 pidfile=/opt/pro/script/uwsgi.pid # 自动移除unix Socket和pid文件当服务停止的时候 vacuum=true # 序列化接受的内容,如果可能的话 thunder-lock=true # 启用线程 enable-threads=true # 设置自中断时间 harakiri=1800 # 设置缓冲 post-buffering=1024 # 设置日志目录 daemonize=/opt/pro/script/uwsgi.log 启动跟关闭 cd /opt/pro/script uwsgi --ini uwsgi.ini #启动 uwsgi --stop uwsgi.pid #关闭
ps -ef | grep uwsgi #查看进程
8.配置项目的nginx参数,格式配置出错项目会无法访问,先备份参数文件在修改 vi /usr/local/nginx/conf/nginx.conf
user root; worker_processes 1; error_log /usr/local/nginx/logs/error.log warn; pid /usr/local/nginx/logs/nginx.pid; events { worker_connections 1024; } http { include /usr/local/nginx/conf/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /usr/local/nginx/logs/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name 192.168.x.x; access_log /usr/local/nginx/logs/access.log main; charset utf-8; gzip on; gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # 指定项目路径uwsgi location / { include uwsgi_params; uwsgi_pass unix:/opt/pro/script/uwsgi.sock; uwsgi_send_timeout 1800; uwsgi_connect_timeout 1800; uwsgi_read_timeout 1800; } # 指定静态文件路径 location /static/ { alias 你的项目的静态文件目录的绝对路径; index index.html index.htm; } } }
9.收集静态文件
在项目目录下执行:python3 manage.py collectstatic
修改setting文件
先启动nginx在启动uwsgi访问项目,如果为正常反问去查看nginx的错误日志信息 cat /usr/local/nginx/logs/error.log
10.安装supervisor启动celery后台进程
pip3 install supervisor #建立软连接 ln -s /usr/local/python3/bin/echo_supervisord_conf /usr/bin/echo_supervisord_conf ln -s /usr/local/python3/bin/supervisorctl /usr/bin/supervisorctl ln -s /usr/local/python3/bin/supervisord /usr/bin/supervisord #生成配置文件 cd /usr/local/python3/bin/ echo_supervisord_conf > /etc/supervisord.conf
#修改配置文件 vi /etc/supervisord.conf [program:celery.worker] command=python3 manage.py celery -A 你的项目app名字 worker -l info # 开启worker的命令 directory=你的项目地址 numprocs=1 stdout_logfile=/opt/pro/script/log/celerylog.log stderr_logfile=/opt/pro/script/log/celerylog.log autostart=true autorestart=true startsecs=10 stopwaitsecs=600 priority=16 [program:celery.beat] command=python3 manage.py celery -A 你的项目app名字 beat -l info # 开启beat的命令 directory=你的项目地址 numprocs=1 stdout_logfile=/opt/pro/script/log/beat.log # beat日志文件 stderr_logfile=/opt/pro/script/log/beat.log autostart=true autorestart=true startsecs=10 stopwaitsecs = 600 priority=17 [program:celery.flower] command=python3 manage.py celery -A 你的项目app名字 flower -l info # 开启flower的命令 directory=你的项目地址 numprocs=1 stdout_logfile=/opt/pro/script/log/flower.log # flower日志文件 stderr_logfile=/opt/pro/script/log/flower.log autostart=true autorestart=true startsecs=10 stopwaitsecs = 600 priority=18
#创建日志文件
mkdir -p /opt/pro/script/log/
touch /opt/pro/script/log/beat.log
touch /opt/pro/script/log/celerylog.log
touch /opt/pro/script/log/flower.log
#启动 supervisord -c /etc/supervisord.conf
#查看进程 ps -ef | grep supervisord #查看celery进程 ps -ef | grep celery