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