django服务器部署



部署

环境: CentOS 7.4、Nginx、mysql、python38


一、项目部署准备

购买腾讯云服务

镜像信息
    操作系统	CentOS 7.4 64位

二、 部署MySQL数据库 8.0

1. 检查mysql环境

1.1 查看是否有安装过mysql

rpm -qa | grep -i mysql

1.2 删除mysql

yum -y remove MySQL-*

1.3 把所有出现的目录统统删除

find / -name mysql

1.4 删除配置文件

rm -rf /etc/my.cnf

1.5 删除mysql的默认密码

rm -rf /root/.mysql_sercret

五步完成之后,这样mysql就全部删除干净了,若没安装过mysql可忽略以上步骤

2. 安装Mysql

2.1 配置Mysql 8.0安装源

sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

2.2 安装Mysql 8.0
sudo yum --enablerepo=mysql80-community install mysql-community-server

  • 提示下载插件选择:y

2.3 启动mysql服务

sudo service mysqld start

2.4 查看mysql服务运行状态

service mysqld status
检查是否在运行:sudo systemctl status mysqld

2.5 查看root临时密码

安装完mysql之后,会生成一个临时的密码让root用户登录

grep "A temporary password" /var/log/mysqld.log

3.更改临时密码

输入:mysql -uroot -p
在Enter password:后面输入临时密码
登录成功
输入:ALTER USER 'root'@'localhost' IDENTIFIED BY '稍稍复杂的密码';
会提示:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements(密码不符合当前策略)
方案1: 设置符合策略的密码(大小写字母+数据+符号)
方案2:密码策略改简单一点

4.配置远程访问 Navicat

输入:grant all on *.* to 'root'@'%';
flush privileges
Navicat 连接 Mysql8 [1251]错误:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '稍稍复杂的密码';

三、 安装python3环境(3.8)

1. 安装依赖包

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel

2. 安装wget

yum install wget

3. 下载源码包

wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
# 解压压缩包
    tar -zxvf Python-3.8.2.tgz  

    # 进入文件夹
    cd Python-3.8.2

    # 配置安装位置
    ./configure prefix=/usr/local/python3

    # 安装
    make && make install

4. 添加软连接

(默认安装了2.7)重命名旧的python软链

mv /usr/bin/python /usr/bin/python.bak
mv /usr/bin/pip /usr/bin/pip.bak

添加python3的软链接 和 添加 pip3 的软链接

ln -s /usr/local/python3/bin/python3.8 /usr/bin/python
ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip

切换python3委默认后yum出问题解决

vim /usr/libexec/urlgrabber-ext-down
    vi /usr/bin/yum
    首行的#! /usr/bin/python	
    都改为#! /usr/bin/python2.7
    firewall-cmd也需要手工设置一下
    # vim /usr/bin/firewall-cmd

    首行改为
    #!/usr/bin/python2.7 -Es

环境变量
出现问题参考:

export PYTHON_HOME=/usr/local/python3
    export PATH=$PYTHON_HOME/bin:$PATH

四、配置部署Django项目

  • 项目目录:/home/poetry/django_server/
  • ftp文件传输 安装 FileZilla Client 上传代码,后面考虑用git
  • 创建和进入python虚拟环境:
cd /home/poetry/
    python -m venv venv
    . venv/bin/activate
  • 添加 mysqlclient (这个单独安装)
yum install mysql-devel gcc-devel python-devel
    python -m pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple/
  • 添加其他依赖
  • 项目以来的其他python库 DependentLibraries.txt
//DependentLibraries.txt 
	django==3.0.8
	channels==2.4.0
	channels-redis==3.0.1
	django-cors-headers==3.4.0
	pymysql
	mysqlclient==2.0.1
	xpinyin
	requests
python -m pip install -r DependentLibraries.txt
  • 数据迁移
python manage.py makemigrations
    python manage.py migrate
  • 启动服务器: python manage.py runserver 0.0.0.0:8888 ,可以访问
  • 退出虚拟环境:deactivate

1. 继续安装uwsgi

python -m pip install uwsgi
    给uwsgi建立软链接: ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
    测试: uwsgi --http :8001 --wsgi-file test.py
    配置: uwsgi 文件 创建 /home/poetry/django_server/uwsgi/uwsgi.ini
    启动: uwsgi --ini /home/poetry/django_server/uwsgi/uwsgi.ini
    查看: ps -aux | grep uwsgi
  • uwsgi.ini
# uwsgi.ini file    path;/home/poetry/django_server/uwsgi/uwsgi.ini
    [uwsgi]
    #此处填写项目地址,我的Django项目地址是/home/poetry/django_server
    chdir = /home/poetry/django_server
    #虚拟环境的目录
    home = /home/poetry/venv 
    # 设置使用插件
    plugins = python
    # wsgi文件
    module = template_server.wsgi:application
    # process-related settings
    # master
    master = True
    # 进程数量
    processes = 4
    #最大请求
    max-requests = 5000
    #请求超时时间(单位秒)
    harakiri = 60
    #设置监听端口
    socket = 127.0.0.1:8889
    #使用用户组,使用root用户比较危险
    uid = 1000
    gid = 2000 
    #快捷启动重启目录
    pidfile = /home/poetry/django_server/uwsgi/master.pid
    #此处配置的为日志文件存放的地方
    daemonize = /home/poetry/django_server/uwsgi/my_uwsgi.log
    #服务器停止后进行回收log文件等操作
    vacuum = True
    #静态文件目录
    static-map = /static=/home/poetry/django_server/static

2. nginx安装

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

    yum install nginx

    准备工具:
    sudo yum install yum-utils
    创建nginx.repo文件
    sudo vim /etc/yum.repos.d/nginx.repo
  • 并添加以下内容
[nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key

    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
  • 编辑配置文件
    vim /etc/nginx/conf.d/myconf.conf
#Nginx反向代理服务器,主要功能就是将发送到指定端口的数据转发到相应的服务器中
    server {
    listen 80; # 监听80端口
    server_name 111.111.111.1; # 路径前面的url名称,也就是你在浏览器中输入访问这个服务器的网址,比如1.1.1.10
    access_log /var/log/nginx/access.log main; # Nginx日志配置
    charset utf-8; # Nginx编码
    client_max_body_size 75M;#最大上传大小

    error_page 404 /404.html; # 配置notfound错误页面
    error_page 500 502 503 504 /50x.html; # 配置50X错误页面

    # 指定项目路径uwsgi,此处配置的就是Nginx和uwsgi之间的代理
    location / {
        include /etc/nginx/uwsgi_params; # 导入Nginx的模块,这个模块是用来和uWSGI进行通讯的
        uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
        uwsgi_pass 127.0.0.1:8889; # 指定uwsgi的sock文件,此处填写要和uwsgi配置文件中的socket后面是一样的
    }

    location /media{
        alias /home/poetry/django_server/;
    }

    # 指定静态文件路径,此处指定你的CSS和JS的文件路径,也就是你Django项目中的静态文件夹的地址,配置不好,所有的CSS以及JS效果都看不到
    location /static{
        alias /home/poetry/django_server/static;
    }
    }

检测配置文件是否正确(正确打印如下)

nginx -t

出现打印:nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

启动nginx服务
service nginx restart
查看以运行服务
netstat -ntpl
重新加载uwsgi
uwsgi --reload /home/poetry/django_server/uwsgi/master.pid
ps -ef | grep uwsgi

3. django 静态文件 配置到 nginx 、 uwsgi:

  1. django setting.py 添加
STATIC_ROOT = os.path.join( BASE_DIR, '/static/' )
  1. uwsgi中添加配置
static-map = /static=/home/poetry/django_server/static
  1. (虚拟环境)收集项目静态文:
python manage.py collectstatic
  1. nginx 配置 vim /etc/nginx/conf.d/myconf.conf

指定静态文件路径,此处指定你的CSS和JS的文件路径,也就是你Django项目中的静态文件夹的地址,配置不好,所有的CSS以及JS效果都看不到

location /static{
    alias /home/poetry/django_server/static;
}


写在最后

应用程序常驻后台

方法一

nohup python3 manage.py runserver 0.0.0.0:9090 &
&可以不写,这样启动测试服务器后,就可以常驻后台运行了。

方法二 (建议)

配置uwsgi nginx 服务器

查看后台某个进程

ps -ef|grep “python”

杀死进程:

kill -9 进程号

ssl证书

server {
        listen  443;
        server_name 网站域名或者ip;

        ssl on;
        ssl_certificate cert/尾缀为pem的那个文件.pem;
        ssl_certificate_key cert/尾缀为可以的那个文件.key;
        ssl_session_timeout  5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        #密码加密方式
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
        ssl_prefer_server_ciphers  on;

        charset utf-8;
        client_max_body_size 75M;
		location /static/ {
                alias /项目的绝对路径/static_dist/;
        }

        location / {
                uwsgi_pass 自定义1;
                include uwsgi_params;
                uwsgi_read_timeout 30;
        }
    }
    #监控80端口,强制跳转到443端口
    server {
    listen 80;
    server_name 域名或ip;
    rewrite ^(.*)$  https://www.$server_name$1 permanent;
    }