Django应用部署实战:从开发到生产,全程解析

部署架构图
Django应用部署实战:从开发到生产,全程解析_第1张图片

版本说明
Centos 7.4
Python 3.6.4
Django 2.0.2
Channels 2.0.0
MySql 5.7
uWSGI
Nginx 1.12.2

部署前
1、更新系统环境
yum install epel-release
2、安装所有的开发工具包
yum groupinstall -y “Development tools”

一、安装python 3.6.4
1、下载
cd /usr/local/src
wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz

2、安装python依赖包
yum install zlib-devel 不安装编译会报错
yum install libffi-devel -y 新版本python3.7
yum install openssl-devel pip下载使用https协议的包时需要
安装sqlite
cd /usr/local/src
wget https://www.sqlite.org/2018/sqlite-autoconf-3250300.tar.gz
tar zxvf sqlite-autoconf-3250300.tar.gz
cd sqlite-autoconf-3250300
./configure
make && make install

3、解压
tar zxvf Python-3.6.4.tgz
cd Python-3.6.4

4、编译安装
./configure --prefix=/usr/local/python3.6.4
make && make install

5、链接python和pip
ln -s /usr/local/python3.6.4/bin/python3 /usr/bin/python3
ln -snf /usr/bin/python3 /usr/bin/python
ln -s /usr/local/python3.6.4/bin/pip3 /usr/bin/pip
查看朴python版本
python -V
查看pip版本
pip --version

6、yum配置文件依赖python,Python升级后就要修改配置文件
vim /usr/bin/yum
vim /usr/libexec/urlgrabber-ext-down
修改第一行#!/usr/bin/python 为 #!/usr/bin/python2
测试修改是否成功
yum -h
升级系统 yum update

7、检查其他需要修改的命令
sed -i “s#/usr/bin/python#/usr/bin/python2#g” grep /usr/bin/python -rl /usr/bin/*

grep -ai /usr/bin/python /usr/bin/*
列出文件列表后逐个修改(按照yum修改方法)

二、安装django2.0.2
1、安装
pip install django==2.0.2

2、安装成功后测试
链接
ln -s /usr/local/python3.6.4/bin/django-admin /usr/bin/django-admin

三、安装数据库
0、卸载mariadb(安装mysql前要卸载mariadb)
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.37-1.el7_0.x86_64

1、安装sqlite3(注意要在编译python之前安装)
yum install sqlite
yum install sqlite-devel

2、源码安装MySQL5.6.39(安装后问题较多)
1)下载
cd /usr/local/src
wget http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz

2)解压
tar zxvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
cd /usr/local/
修改目录名
mv mysql-5.6.39-linux-glibc2.12-x86_64 mysql

3)创建mysql用户
创建系统用户组,组id为300
groupadd -r -g 300 mysql
创建mysql用户,组id 为300,用户id为300
useradd -g 300 -r -u 300 mysql
修改mysql目录用户和用户组
chown -R mysql:mysql mysql

4)初始化
cd /usr/local/mysql
scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
问题
解决yum -y install autoconf

5)设置开机启动
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
chkconfig mysqld on

6)配置文件(如果服务器性能低,配置文件里内存大小就要修改)
cp support-files/my-default.cnf …/my.cnf

7)加入PATH路径(环境变量)
vim /etc/profile
PATH=$PATH:/usr/local/mysql/bin
export PATH
保存退出
source /etc/profile
开启服务systemctl start mysqld.service

8)输入mysql进入(超级终端不需要密码),给root用户设置密码
GRANT ALL PRIVILEGES ON . TO ‘root’@‘localhost’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
测试
mysql -uroot -p (回车后输入密码)

3、yum 安装MySQL
1)配置yum源
在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/
2)下载
cd /usr/local/src
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
3)安装
yum localinstall mysql57-community-release-el7-8.noarch.rpm
4)检查是否安装成功
yum repolist enabled | grep “mysql.-community.
看到上图所示表示安装成功。

5)可以修改vim /etc/yum.repos.d/mysql-community.repo源,改变默认安装的mysql版本。比如要安装5.6版本,将5.7源的enabled=1改成enabled=0。然后再将5.6源的enabled=0改成enabled=1即可。改完之后的效果如下所示:
6)安装mysql
yum install mysql-community-server
7)启动MySQL服务
systemctl start mysqld
查看MySQL的启动状态
systemctl status mysqld
mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
Active: active (running) since 五 2016-06-24 04:37:37 CST; 35min ago
Main PID: 2888 (mysqld)
CGroup: /system.slice/mysqld.service
└─2888 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
6月 24 04:37:36 localhost.localdomain systemd[1]: Starting MySQL Server…6月 24 04:37:37 localhost.localdomain systemd[1]: Started MySQL Server.
8)开机启动
ystemctl enable mysqldshell> systemctl daemon-reload
9)修改root本地登录密码
mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码,然后登录mysql进行修改:
grep ‘temporary password’ /var/log/mysqld.log
mysql -uroot -p
ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘MyNewPass4!’;
或者set password for ‘root’@‘localhost’=password(‘MyNewPass4!’);
注意:mysql5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements错误,如下图所示:
10)通过msyql环境变量可以查看密码策略的相关信息:
show variables like ‘%password%’;
validate_password_policy:密码策略,默认为MEDIUM策略
validate_password_dictionary_file:密码策略文件,策略为STRONG才需要
validate_password_length:密码最少长度
validate_password_mixed_case_count:大小写字符长度,至少1个
validate_password_number_count :数字至少1个
validate_password_special_char_count:特殊字符至少1个
上述参数是默认策略MEDIUM的密码检查规则。
共有以下几种密码策略:
策略 检查规则
0 or LOWLength
1 or MEDIUM Length; numeric, lowercase/uppercase, and special characters
2 or STRONG Length; numeric, lowercase/uppercase, and special characters; dictionary file
MySQL官网密码策略详细说明:http://dev.mysql.com/doc/refman/5.7/en/validate-password-options-variables.html#sysvar_validate_password_policy
11)修改密码策略
在/etc/my.cnf文件添加validate_password_policy配置,指定密码策略

#选择0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件
validate_password_policy=0
如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:
validate_password = off
重新启动mysql服务使配置生效:
systemctl restart mysqld
12)添加远程登录用户
默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接,或者添加一个允许远程连接的帐户,为了安全起见,我添加一个新的帐户:
GRANT ALL PRIVILEGES ON . TO ‘yangxin’@‘%’ IDENTIFIED BY ‘Yangxin0917!’ WITH GRANT OPTION;
13)配置默认编码为utf8
修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置,如下所示:
[mysqld]character_set_server=utf8init_connect=‘SET NAMES utf8’
重新启动mysql服务,查看数据库默认编码如下所示:
默认配置文件路径:
配置文件:/etc/my.cnf
日志文件:/var/log//var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid

[plain] view plain copy
1.mysql>use mysql;
2.mysql>update user set password=password(‘root’) where user=‘root’ and host=‘localhost’;
3.mysql>flush privileges;
设置远程主机登录,注意下面的your username 和 your password改成你需要设置的用户和密码
[plain] view plain copy
1.mysql>GRANT ALL PRIVILEGES ON . TO ‘your username’@‘%’ IDENTIFIED BY ‘your password’ WITH
2.GRANT OPTION;

14)出现下面情况:
1,linux libaio.so.1: cannot open shared object file: No such file or directory
缺少安装包libaio和libaio-devel.
命令行
yum install libaio*。自动安装这两个包
2,ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

1、先查看 /etc/rc.d/init.d/mysqld status 看看m y s q l 是否已经启动.
另外看看是不是权限问题.

2、确定你的mysql.sock是不是在那个位置,
mysql -u 你的mysql用户名 -p -S /var/lib/mysql/mysql.sock

3、试试:service mysqld start

4、如果是权限问题,则先改变权限 #chown -R mysql:mysql /var/lib/mysql
alter user ‘root’@‘localhost’ identified by ‘1stDianpiao&&&’;

四、安装pyMySQL 和 mysqlclient
pip install PyMySQL
pip install mysqlclient

五、创建django项目
django-admin startproject mysite
创建app
cd mysite
django-admin startapp app

修改配置
vim mysite/init.py 添加下面代码(否则python3和mysql之间连接会报错)
import pymysql
pymysql.install_as_MySQLdb()

vim mysite/settings.py

在项目中创建media和collection_static目录
mkdir media; mkdir collection_static
执行python manage.py collectstatic命令时,STATIC_ROOT目录存放整个项目的静态文件(注意STATICFILES_DIRS也要配置,如果不配置就不会收集自定义的静态文件,执行完后要把该目录的属主属组都给nginx用户,即chown -R nginx:nginx collection_static)

进入mysql中创建数据库
create database mysite character set utf8;

然后执行
python manage.py makemigrations 为这些修改创建迁移文件,给应用生成迁移脚本
python manage.py migrate 同步修改过的数据库
启动项目
python manage.py runserver
打开浏览器测试

六、安装uwsgi

  1. 安装pip install uwsgi
  2. 链接ln -s /usr/local/python3.6.4/bin/uwsgi /usr/bin/uwsgi
  3. 启动服务 uwsgi --http :80 --chdir /root/mysite/ -w mysite.wsgi(mysite.wsgi前缀必须和项目名相同)
  4. 查看启动进程lsof :80 查看占用80端口的进程,可以用kill -9 PID杀掉进程
  5. 打开浏览器输入本机IP就能访问
  6. uwsgi 配置文件
    mkdir -p /etc/uwsgi/
    vim /etc/uwsgi/mysite.ini
[uwsgi]
chdir = /root/mysite                                       #项目目录
socket = /run/mysite.sock                              #socekt文件,要和nginx配置的相同
wsgi-file = /root/mysite/mysite/wsgi.py       #django项目中wsgi文件
module = mysite.wsgi:applcation                 
master = true                                                  #允许主线程存在
processes = 2                                                  #开启进程的数量
threads = 4                                                      #开启线程的数量
daemonize = /var/log/mysite/uwsgi.log       #日志文件
vacuum = true                                                 #当服务器退出的时候自动清理环境

保存退出

创建日志目录
mkdir -p /var/log/mysite

七、源码安装nginx(或直接用yum安装)
uwsgi处理动态请求,nginx处理静态请求
1、下载
cd /usr/local/src
wget http://nginx.org/download/nginx-1.16.0.tar.gz

2、安装依赖包
yum -y install zlib zlib-devel openssl openssl-devel pcre-devel
zlib:Nginx提供gzip模块,需要zlib库支持。
openssl:Nginx提供SSL功能
pcre:支持地址重写rewrite功能
安装编译工具
yum -y install gcc gcc-c++ autoconf automake

3、创建用户
groupadd -r -g 500 nginx
useradd -g 500 -r -u 500 nginx

4、解压安装
tar zxvf nginx-1.13.8.tar.gz
cd nginx-1.13.8
./configure –help 查看配置信息
生成配置文件
./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf --error-log-path=/usr/local/nginx/log/error.log --pid-path=/usr/local/nginx/nginx.pid --lock-path=/usr/local/nginx/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module
make && make install
给目录授权
chown -R nginx:nginx nginx/
测试 /usr/local/nginx/sbin/nginx 如果没报错就说明服务已经启动
链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

5、修改配置文件
vim /usr/local/nginx/nginx.conf
在http模块中加入include /usr/local/nginx/conf.d/*.conf;(一定要加在server前面,否则nginx会按默认配置显示)

创建配置文件目录
mkdir -p /usr/local/nginx/conf.d/
cd /usr/local/nginx/conf.d/

vim mysite.conf
添加下面内容

upstream mysite{
	server unix:///run/mysite.sock;  #socket文件要uwsgi配置相同
}
server {
	listen 80;
	server_name 127.0.0.1;
	charset UTF-8;
	error_log /var/log/mysite/nginx_error.log;
	access_log /var/log/mysite/nginx_access.log;
	
	client_max_body_size 75M;
	location /media {
		alias /root/mysite/media;
	}
	location /static {
		alias /root/mysite/collection_static;
	}
	location / {
		uwsgi_pass mysite;
		include /usr/local/nginx/uwsgi_params;
	}
}

保存退出

给项目目录修改属主属组(包含)
chown -R nginx:nginx /root/mysite
创建日志目录
mkdir -p /var/log/mysite
测试配置文件正确性
nginx -t
nginx: the configuration file /usr/local/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/nginx.conf test is successful 说明成功

启动服务
nginx
打开浏览器访问测试
关闭服务
nginx -s stop
修改配置后重新读配置文件
nginx -s reload

配置完成后启动服务
uwsgi --init /etc/uwsgi/mysite.ini
nginx -s reload

八、配置iptables(centos7以前版本)
1、开启ssh端口(如果是远程配置,一定要先配置运行ssh访问)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

2、开启80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

3、允许ping
iptables -A INPUT -p icmp -j ACCEPT
#如果OUTPUT设置成DROP需要添加 iptables -A OUTPUT -p icmp -j ACCEPT

4、最后配置拒绝所有进入
iptables -P INPUT DROP 拒绝所有进
iptables -P OUTPUT ACCEPT 开放所有出
iptables -P FORWARD DROP 拒绝所有转发

5、查看详细信息
iptables -L -n

6、查找所有规则
iptables -L INPUT --line-numbers

7、删除一条规则
iptables -D INPUT 11 (注意,这个11是行号,是iptables -L INPUT --line-numbers 所打印出来的行号)
8、重启
service iptables restart

九、配置firewall
1、查看版本firewall-cmd --version
报错
解决
vim /usr/bin/firewall-cmd
vim /usr/bin/firewall-offline-cmd
vim /usr/sbin/firewalld

修改第一行#!/usr/bin/python -Es 为 #!/usr/bin/python2 -Es 保存退出
2、启动服务
systemctl start firewalld.service
systemctl status firewalld.service #查看状态

3、查询
SSH协议是否被允许(yes/no)
firewall-cmd --zone=public --query-service=ssh

查询开启那些端口
firewall-cmd --zone=public --list-ports
查看区域所有信息
firewall-cmd --zone=public --list-all

4、添加规则
添加http协议
firewall-cmd --permanent --zone=public --add-service=http
添加https协议
firewall-cmd --permanent --zone=public --add-service=https
添加ssh协议
firewall-cmd --permanent --zone=public --add-service=ssh
添加8080端口
firewall-cmd --permanent --zone=public --add-port=8080/tcp

firewall-cmd --reload

5、删除规则
删除http协议
firewall-cmd --permanent --zone=public --remove-service=http
每次添加删除规则后要重新加载
firewall-cmd --reload

6、重启服务
systemctl restart firewalld

十、安装redis
1、下载
cd /usr/local/src
wget http://download.redis.io/releases/redis-4.0.8.tar.gz

2、编译安装
cd redis-4.0.8
make && make install

3、配置
mkdir -p /etc/redis
cp /usr/local/src/redis-4.0.8/redis.conf /etc/redis

#redis以守护进程的方式运行
#no表示不以守护进程的方式运行(会占用一个终端)
vim /etc/redis/redis.conf
daemonize yes

4、启动服务
/usr/local/bin/redis-server /etc/redis/redis.conf
查看启动
ps -aux | grep redis

5、客户端
redis-cli
set name diaopiao
get name
“dianpiao”
6、开机自启动
#开机启动要配置在 rc.local 中,而 /etc/profile 文件,要有用户登录了,才会被执行。
echo “/usr/local/bin/redis-server /etc/redis/redis.conf &” >> /etc/rc.local

十一、Django配置redis
1、安装redis
pip install redis
pip install django-redis

2、修改django配置
vim /root/mysite/mysite/settings.py
增加下面配置

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': '127.0.0.1:6379',
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        },
    },
}

十二、安装django Channels
1、安装
pip install -U Channels2.0.0
pip install channels-redis
2.0.2
2、在django配置文件中添加
vim /root/mysite/mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',  # 添加插件
]

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgi_redis.RedisChannelLayer",
        "CONFIG": {
            "hosts": [os.environ.get('REDIS_URL', 'redis://localhost:6379')],
        },
        "ROUTING": "chat.routing.channel_routing",
    },
}

补充
1)问题
ERRORS:
blog.Article.portal: (fields.E210) Cannot use ImageField because Pillow is not installed.
HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command “pip install Pillow”.

提示要安装Pillow,经查Pillow是python的一个图像处理库,下面进行安装
安装装Pillow
pip install --use-wheel Pillow #安装最新的Pillow
安装完成,再次运行发现问题解决。

2)uwsgi问题
需要不停的更新uwsgi --ini /etc/uwsgi/mysite.ini
uwsgi基本操作
启动uwsgi
uwsgi -x xxxx.xml #xml配置文件uwsgi -i xxxx.ini #ini配置文件
重启uwsgi
首选要找到uwsgi的主进程号,如果使用了pidfile记录进程号,则可以简单的找到master pid,如果未使用pidfile选项,则到日志中查看日志
spawned uWSGI master process (pid: 7486) #主进程号
spawned uWSGI worker 1 (pid: 7487, cores: 10)
spawned uWSGI worker 2 (pid: 7488, cores: 10)
然后使用-HUP或-TERM
kill -HUP pid #友好重启,不会丢失会话kill -TERM pid #强制重启,可能丢失会话
结束uwsgi
同重启uwsgi,需要先得到uwsgi的主进程号,然后使用
kill -INT pid
使用killall
在没使用pidfile参数记录uwsgi主进程号的情况下,如果服务器上只有一个uwsgi实例,可以使用killall命令控制uwsgi
killall -HUP uwsgi #所有的uwsgi实例都重启
killall -INT uwsgi #关闭所有uwsgi实例

3)最后修改django配置文件
使用DEBUG = False,进入settings.py
将DEBUG = True 改为 DEBUG = False
在下面这句里添加’‘后保存
ALLOWED_HOSTS = [’
']
为模板添加路径
给settings.py里添加如下代码,并修改’DIR’后面的值
TEMPLATE_PATH = os.path.join(BASE_DIR, ‘templates’)
最终我们的网站结构应该是这样的

1、创建不了数据表migrate
设置git
1、在家目录下输入ls -a 查看有没有.ssh目录
2、如果没有输入下面命令,然后默认回车。就会生产.ssh目录
3、进去.ssh,生成一对密钥id_rsa是私钥,id_rsa.pub是公钥,打开公钥讲里面的字符复制
4、打开git网页,ssh公钥配置,标题自定义,讲复制的公钥粘贴进去,确定

5、完了之后克隆,第一次需要确认,后面都不需要密码直接更新

你可能感兴趣的:(Django,Linux,django,python,linux)