服务器部署Django项目

前言

在前面的章节中我们使用开发工具pycharm开发项目。
正式发布的时候,我们需要将应用部署到服务器上。 python3 manager runserver 0.0.0.0:80只适用于Django的开发模式,只支持单用户访问,因此需要用到一个可以多用户并发访问的工具uWsgi。
同时我们使用Nginx实现Python的Django框架站点动静分离,即Http请求统一由Nginx进行分发,静态文件由Nginx处理,并返回给客户端;而动态的请求,则分发到uWsgi,由uWsgi再分发给Django进行处理。
django部署工作原理

1. 安装python3

1. 安装

yum install python3

2. 验证是否安装成功

python3

验证python是否安装成功

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”:
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

运行uwsgi

新开一个命令窗口,用curl命令请求http://127.0.0.1:8001,返回如下说明uWSGI部署成功了:
验证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密码,可以通过以下方式免密登录:

  1. 执行vi /etc/my.cnf
  2. 在[mysqld]后面任意一行添加“skip-grant-tables”用来跳过密码验证的过程,如下图所示:
    在这里插入图片描述
  3. 重新启动mysql
service mysqld restart
  1. 登录mysql后修改密码
update mysql.user set authentication_string=password('fZ123123') where user='root';
  1. 密码修改后,再将“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

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值