Django在CentOS下的部署

参考链接1 / 参考链接2
本教程的 目的 是提供一套非常稳定的部署方式,力求帮助您 100% 部署成功。

获取CentOS环境

没有测试环境?装个虚拟机?

VMWare虚拟机:下载
CentOS镜像:下载 / 更多参考
Linux发行版:下载

如何装虚拟机?这里就先不说了;如何在MacOS上安装虚拟机?有需要的时候再补全。

此处以 腾讯云轻量应用服务器 为例。(我在活动的时候买的,1核-内存2GB-系统盘60GB-3年-298RMB

另外我准备了 阿里云云数据库RDS版-MySQL8.0-1年-19.9RMB

都是贪便宜买的,后期续费是个大问题,太贵了。

获取Linux连接工具

准备好Linux连接工具

官方(最新):下载
百度网盘(写此文档时用的版本):链接,密码:u15u

连接CentOS服务器
alt ssh1

输入ip、登录名、密码等

alt ssh2

如果您的服务器位于国外,记得勾选 高级 里的 智能加速(加速海外服务器连接),最后点 确定
关于 密钥登录 的情况,我会在用到的时候补全。

alt ssh2

双击 快速连接 下的 测试 即可开始连接。

alt ssh2

可以 命令输入,可以 上传下载 文件,基本的需求就满足了。

获取Python环境

安装Python环境

参考链接
依次执行下面的命令(理论上,在Linux里面没有报错就是正确):

当前运行命令的路径:~/root(个人习惯)

  1. yum -y groupinstall "Development tools"
  2. yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
  3. yum install libffi-devel -y
  4. wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
  5. tar -zxvf Python-3.8.3.tgz
  6. mkdir /home/python38
  7. cd Python-3.8.3
  8. ./configure --prefix=/home/python38
  9. make && make install

一些说明:

4 步的下载链接,可以根据您的实际版本需要进行更换。

7 步的目录名 Python-3.8.3 是第 5 步解压后的文件夹名称。

此处第 8 步的 /home/python38 是第 6 步创建的目录的路径,如果您想安装到其它地方,可以根据您的实际情况替换。

配置软链接

配置软链接

方法一:(不推荐,因为过程不可控)
CentOS7 默认的 python 命令启动的是 python2 的环境,系统有些程序是依赖 python2 的,所以需要做如下配置。 让 python 命令默认指向 python3 的环境。

  1. rm -rf /usr/bin/python
  2. ln -s /home/python38/bin/python3 /usr/bin/python
  3. rm -rf /usr/bin/pip
  4. ln -s /home/python38/bin/pip3 /usr/bin/pip
  5. vi /usr/bin/yum 将第一行 【#! /usr/bin/python】 改为 【#! /usr/bin/python2】
  6. vi /usr/libexec/urlgrabber-ext-down 将第一行 【#! /usr/bin/python】 改为 【#! /usr/bin/python2】
  7. vi /usr/bin/yum-config-manager 将第一行 【#! /usr/bin/python】 改为 【#! /usr/bin/python2】

如何用 vi 编辑文本属于基本的Linux操作了,这里就不阐述了。

注意:如果您的 Python 安装路径和我的不一样, 替换 ln -s /home/python38/bin/python3 /usr/bin/python 中的 /home/python38/bin/python3 即可,其它的类同。

方法二:(推荐)
简单点,不用 python 命令,用 python3 命令启动 python3 环境也行,这样要修改的东西少一点。

  1. ln -s /home/python38/bin/python3.8 /usr/bin/python3
  2. ln -s /home/python38/bin/pip3.8 /usr/bin/pip3

下面的步骤将使用【配置软链接】 方法二 下的 python3pip3 命令进行。

安装uwsgi

安装uwsgi

  1. pip3 install uwsgi
  2. ln -s /home/python38/bin/uwsgi /usr/bin/uwsgi

安装虚拟环境

安装虚拟环境

  1. pip3 install virtualenv
  2. ln -s /home/python38/bin/virtualenv /usr/bin/virtualenv
  3. mkdir /home/venv 此处存放所有的虚拟环境
  4. mkdir /home/wwwroot 此处存放所有的 django 项目
  5. cd /home/venv
  6. virtualenv -p python3 venv1
  7. source venv1/bin/activate 激活虚拟环境
  8. pip install uwsgi

这里的第 8 步,之所以是 pip install uwsgi 是因为已经进入 python3 的虚拟环境了。也可以使用 pip3

退出虚拟环境:deactivate

接下来的步骤都在 虚拟环境中进行

上传Django项目

上传并配置Django项目

使用 FinalShell 上传到上一步创建的 /home/wwwroot 路径下,假设 Django 项目名为 Demo1, 则 manage.py 文件所在的路径为:/home/wwwroot/Demo1

  1. cd /home/wwwroot/Demo1
  2. python manage.py collectstatic 输入 yes (注意:也可以是 python3)
  3. vim Demo1.xml Demo1 为项目的名字,可根据您实际的项目名称命名xml
  4. uwsgi -x Demo1.xml # 每次重新上传项目或修改项目,最好重新执行此句,然后重启 nginx

还是那句话,不报错就是成功。

内容覆盖写入:第 3 步输入下面的内容并保存退出(Esc + :wq

<uwsgi>    
    <socket>127.0.0.1:8111</socket> <!-- 内部端口,自定义 --> 
    <chdir>/home/wwwroot/Demo1/</chdir> <!-- 项目路径 -->            
    <module>Demo1.wsgi</module>  <!-- Demo1为wsgi.py所在目录名--> 
    <processes>4</processes> <!-- 进程数 -->     
    <daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>

安装并配置nginx

安装并配置nginx

  1. cd ~
  2. wget http://nginx.org/download/nginx-1.13.7.tar.gz
  3. tar -zxvf nginx-1.13.7.tar.gz
  4. cd nginx-1.13.7
  5. ./configure
  6. make && make install # 默认安装在 /usr/local/nginx 中
  7. cd /usr/local/nginx/conf
  8. cp nginx.conf nginx.conf.bak # 备份
  9. mkdir vhost # 存放多个 Django 站点,一个站点一个 .conf 文件
  10. vim vhost/Demo1.conf
  11. vim nginx.conf
  12. /usr/local/nginx/sbin/nginx -t # 检查配置是否成功
  13. /usr/local/nginx/sbin/nginx # 启动

内容覆盖写入:第 10

server {
    listen 8112; # 对外开放的端口,假设公网ip为x.x.x.x,则外部可以用x.x.x.x:8112访问。
    server_name 127.0.0.1;
    charset utf-8;
    location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8111; # 内部交互端口,必须和 Demo1.xml 中配置的 socket 一致
            uwsgi_param UWSGI_SCRIPT Demo1.wsgi; # 必须和 Demo1.xml 中配置的 module 一致
            uwsgi_param UWSGI_CHDIR /home/wwwroot/Demo1/; # 必须和 Demo1.xml 中配置的 chdir 一致(注意最后的右斜线)
    }
    location /static/ {
            alias /home/wwwroot/Demo1/static/; # Django的静态文件路径(注意最后的右斜线)
    }
}

内容覆盖写入:第 11

#user  nobody;
worker_processes  1;
error_log  logs/error.log;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include /usr/local/nginx/conf/vhost/*.conf;

    # server {
    #     listen       8001;
    #     server_name  127.0.0.1;
    #     location / {
    #         root   universalparser;
    #         index  index.html index.htm;
    #     }

    #     error_page  404              /404.html;

    #     error_page   500 502 503 504  /50x.html;
    #     location = /50x.html {
    #         root   html;
    #     }
    # } # 此处可用于部署静态网站,有需要的可以解除注释

}

修改当前运行中Django网站的方法

修改当前运行中Django网站的方法

此处由@coshare提供并完善!感谢!

  1. cd /home/venv
  2. source venv1/bin/activate
  3. cd /home/wwwroot
  4. uwsgi --reload uwsgi.pid
  5. /usr/local/nginx/sbin/nginx -s reload

配置nginx开机自启

设置开机自启

  1. vim /etc/init.d/nginx
  2. chmod a+x /etc/init.d/nginx
  3. chkconfig --add /etc/init.d/nginx
  4. chkconfig nginx on

内容覆盖写入:第 1

nginx="/usr/local/nginx/sbin/nginx"
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

nginx快捷操作

方法一:请确保您已经配置了nginx开机自启功能。

nginx快捷操作

启动:service nginx start
停止:service nginx stop
重启:service nginx restart

方法二:不需要配置开机自启

nginx快捷操作2

启动:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
停止:pkill -9 nginx
重启:/usr/local/nginx/sbin/nginx -s reload
检查:/usr/local/nginx/sbin/nginx -t

关于SQLite版本过低的问题

方法一:Django降版本至2.1(Django2.2及以上会出现SQLite版本过低的问题)
方法二:更换其它数据库引擎,如MySQL、PostgreSQL等
方法三:升级SQLite

升级SQLite

  1. cd ~
  2. wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
  3. tar zxvf sqlite-autoconf-3290000.tar.gz
  4. cd sqlite-autoconf-3290000/
  5. ./configure --prefix=/usr/local
  6. make && make install
  7. mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
  8. ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
  9. echo "/usr/local/lib" > /etc/ld.so.conf.d/sqlite3.conf
  10. ldconfig
  11. sqlite3 -version