服务器部署Django项目
前言
在前面的章节中我们使用开发工具pycharm开发项目。
正式发布的时候,我们需要将应用部署到服务器上。 python3 manager runserver 0.0.0.0:80只适用于Django的开发模式,只支持单用户访问,因此需要用到一个可以多用户并发访问的工具uWsgi。
同时我们使用Nginx实现Python的Django框架站点动静分离,即Http请求统一由Nginx进行分发,静态文件由Nginx处理,并返回给客户端;而动态的请求,则分发到uWsgi,由uWsgi再分发给Django进行处理。
1. 安装python3
1. 安装
yum install python3
2. 验证是否安装成功
python3
3. 注意
centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。
不要把Python3的安装目录覆盖Python2。
2. 安装包管理工具
pip是python中的一个包管理工具,主要用于Python包的查找、下载、安装、卸载。
yum -y install epel-release
yum -y install python-pip
3. 安装 uWSGI
1. 安装uwsgi
pip3 install uwsgi
uwsgi --version # 查看 uwsgi 版本
安装过程中如果失败,并且报如下错误“Exception: you need a C compiler to build uWSGI”:
则先执行如下命令,安装gcc:
yum install gcc
2. 测试 uWSGI是否正常:
新建 test.py 文件,内容如下:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
注意:python3返回字符串要用[b”….”]返回bytes 型列表,否则不会显示Hello World。
然后在终端运行:
uwsgi --http :8001 --wsgi-file test.py
新开一个命令窗口,用curl命令请求http://127.0.0.1:8001,返回如下说明uWSGI部署成功了:
启动uwsgi如果出现no internal routing support, rebuild with pcre support错误,则执行如下命令,安装依赖的prce:
pip uninstall uwsgi
yum install -y pcre pcre-devel pcre-static
pip install uwsgi
4. 安装mysql
1. 执行uname -a查看linux的版本,区分是64还是32位
2. 使用wget 下载mysql对应的版本(官方下载速度比较慢,建议直接上传或使用国内的镜像)
查看官方下载地址链接
https://dev.mysql.com/downloads/mysql/5.7.html#downloads
32位版本
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.23-linux-glibc2.12-i686.tar.gz
64位版本
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
国外的速度比较慢,可使用国内的镜像(如网易):
wget https://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz
3. 解压对应的文件
tar -zxvf mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz
4. 移动mysql 文件夹到 /usr/local/mysql 目录下
mv mysql-5.7.29-linux-glibc2.12-x86_64 /usr/local/mysql
5. 在mysql目录下创建data目录
mkdir /usr/local/mysql/data
6. 给文件夹赋权
chmod -R 755 /usr/local/mysql/
7. 初始化mysql(建在mysql用户下)
/usr/local/mysql/bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
如果服务器上没有mysql用户,可通过如下命令创建mysql用户:
8. 最后一行有密码,如下图记录下来 xyk?qfI=8I;H
9. 修改/etc/my.cnf文件
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
10. 复制启动服务到/etc/init.d/目录下
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
11. 启动mysql
service mysqld start
启动过程中如果报日志文件不可写Create writable for user ‘mysql’
则执行如下命令:
[root@localhost mysql]# cd /var/log/
[root@localhost log]# mkdir mariadb
[root@localhost log]# echo "">/var/log/mariadb/mariadb.log
[root@localhost log]# chown -R mysql:mysql /var/log/mariadb/mariadb.log
启动过程如果有遇到错误,可查看日志文件
[root@localhost /]# cat /var/log/mariadb/mariadb.log
12. 设置软连接
ln -s /usr/local/mysql/bin/mysql /usr/bin
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
13. 登录mysql,输入初始化对应的密码
mysql -uroot -p
修改root密码
alter user root@localhost identified by 'fZ123123';
如果忘记root密码,可以通过以下方式免密登录:
- 执行vi /etc/my.cnf
- 在[mysqld]后面任意一行添加“skip-grant-tables”用来跳过密码验证的过程,如下图所示:
- 重新启动mysql
service mysqld restart
- 登录mysql后修改密码
update mysql.user set authentication_string=password('fZ123123') where user='root';
- 密码修改后,再将“skip-grant-tables”删掉,再重启mysql,然后重新登录修改密码(即重新执行步骤13)。
14. 使用表mysql
use mysql;
15. 增加远程连接
update user set user.Host='%' where user.User='root';
16. 创建testdb数据库和test用户
create database crmdb default character set utf8 collate utf8_general_ci;--创建数据库
create user 'crm'@'%' identified by 'crm2020';--创建用户 %:匹配所有主机,该地方还可以设置成‘localhost’,代表只能本地访问,例如root账户默认为‘localhost‘
grant all on crmdb.* to crm;--用户授权数据库
*代表整个数据库
17. 刷新
flush privileges;
18. Mysql 设置开机启动
[root@localhost ~]# chkconfig --list #查看自动启动的服务列表
[root@localhost ~]# chkconfig mysqld on
5. 安装 Django
5.1. 安装
1. 安装Django
pip3 install django
2. 将前面课程中的HelloWord项目移到服务器上。目录结构如下:
3. 从原项目中出依赖包,并在服务器上安装
导出:
D:\test\HelloWorld>pip3 freeze > requirements.txt
安装:
[root@localhost HelloWorld]# pip3 install -r requirements.txt
4. 安装mysqlclient
[root@localhost HelloWorld]# ln -s /usr/local/mysql/bin/mysql_config /usr/local/bin/mysql_config
[root@localhost HelloWorld]# pip3 install mysqlclient
Mysqlclient安装了,但在下面的启动过程中如果还有报Did you install mysqlclient,则看下错误日志是不是有:ImportError: libmysqlclient.so.20: cannot open shared object file: No such file or directory
如果有这个问题,则先查找libmysqlclient.so.20所在位置,然后建立软连接:
[root@localhost usr]# find / -name libmysqlclient.so.20
/usr/local/mysql/lib/libmysqlclient.so.20
[root@localhost usr]# ln -s /usr/local/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20
5. 测试 django 是否正常,运行:
python3 manage.py runserver 0.0.0.0:8002
在浏览器内输入:http://192.168.159.100:8002/admin/,检查django是否运行正常。
6. 生成表模型
$ python manage.py migrate # 创建表结构
$ python manage.py makemigrations model # 让 Django 知道我们在我们的模型有一些变更
$ python manage.py migrate model # 创建表结构
7. 创建超级用户,命令如下所示:
python3 manage.py createsuperuser
8. 导出/导入数据:
- 导出:python manage.py dumpdata config > config_dump.json
- 导入:python manage.py loaddata blog_dump.json
5.2. 启动/重启
1. 后台启动:
nohup python3 manage.py runserver 0.0.0.0:8002 >djo.out 2>&1 &
2. 关闭:查找进程后再杀掉
[root@localhost HelloWorld]# netstat -tulpn | grep :8002
tcp 0 0 0.0.0.0:8002 0.0.0.0:* LISTEN 6636/python3
[root@localhost HelloWorld]# kill -9 6636
6. 安装 Nginx
安装命令如下(centos7安装完nginx配置文件在/etc/nginx目录下):
yum install nginx
7. uwsgi 配置
uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在/opt/HelloWorld/script/目录下新建uwsgi8002.ini,添加如下配置,这个.ini文件可以放在任何地方,启动的时候uwsgi --ini ***.ini
[uwsgi]
# Django项目根目录 (绝对路径)
chdir = /opt/HelloWorld/
# wsgi.py文件在项目中的位置
module = HelloWorld.wsgi
socket=0.0.0.0:8002
#vhost = true
#no-site = true
# 指定sock的文件路径
# sock文件是由uwsgi.ini文件启动之后自动生成
#socket=/opt/HelloWorld/script/uwsgi.sock
# 启用主进程
master = true
# 运行的进程数
processes = 5
pidfile=/opt/HelloWorld/script/uwsgi.pid
max-requests = 1000
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum = true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/opt/HelloWorld/script/uwsgi8002.log
设置完成后,在终端运行:
uwsgi --ini uwsgi8002.ini
8. Nginx 配置
找到nginx的安装目录(如:/etc/nginx),新建目录conf.d,并新建default.conf文件,文件内容如下:
server {
listen 80;
server_name 192.168.159.100;
location / {
#proxy_pass http://0.0.0.0:8002;
include uwsgi_params;
uwsgi_pass 0.0.0.0:8002; # 必须和uwsgi中的设置一致
uwsgi_param UWSGI_SCRIPT HelloWorld.wsgi; #入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录
uwsgi_param UWSGI_CHDIR /opt/HelloWorld; #项目根目录
index index.html index.htm;
client_max_body_size 35m;
}
location /static {
alias /opt/HelloWorld/static;
}
}
重新启动nginx后,在浏览器输入:http://192.168.159.100,你就可以看到首页了。
Nginx常用命令如下
service nginx restart #重启
systemctl status nginx.service #查看运行状态,启动过程中的异常可通过此命令查看
如果页面出现502错误,那么就看下nginx的错误日志。查找nginx的日志可通过find / -name nginx 命令查找,如下所示,ngnix的日志在如下目录下:
查看日志文件error.log,发现有如下错误:
connect() to 0.0.0.0:8002 failed (13: Permission denied)
该错误的原因可能是SeLinux导致的。查看SeLinux状态,如果是开启的,则关闭。
#查看SeLinux开启状态
/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态
#关闭
setsebool -P httpd_can_network_connect 1
启动后如果admin没有样式,则在setting.py中增加:
STATIC_ROOT = os.path.join(BASE_DIR, "static")
然后执行如下将样式收集到/opt/HelloWorld/static目录下
python3 manage.py collectstatic