• 生产环境部署Django项目


    生产环境部署Django项目

    1、  部署架构

    IP地址

    安装服务

     

     

    172.16.1.251

    nginx

    uwsgi(sock方式)

    docker

    mysql5.7

    redis5

     

    Nginx 前端Web服务,接收到动态请求通过uwsgi模块将请求转发给uwsgi服务器,uwsgi服务器通过django处理完后返回给NginxNginx返回用户浏览器展示。

     

    既然uwsgi是一个可以独立部署的服务器,为什么还用Nginx代理?

              Nginx作为入口可配置安全策略,并且可以为uwsgi提供负载均衡。

              Nginx处理静态资源能力强

    2、将本地开发的项目打包

    2.1 导出依赖模块列表

     

    pip3 freeze > requirements.txt

     

    2.2 修改数据库为Mysql

     

    # vim devops/settings.py
    ##### 关闭debug模式和白名单
    DEBUG = False
    ALLOWED_HOSTS = ['172.16.1.251']
    # 白名单,只允许通过列表中的ip访问django项目,* 代表所有(不建议),默认是127.0.0.1
     
    ##### mysql配置
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test',
            'USER': 'root',
            'PASSWORD': '123456',
            'HOST': '172.16.1.251',
            'PORT': '3306',
        }
    }
     
    ##### redis
    CHANNEL_LAYERS = {
        'default': {
            'BACKEND': 'channels_redis.core.RedisChannelLayer',
            'CONFIG': {
                "hosts": [('172.16.1.251', 6379)],
            },
        },
    }

    3、服务器环境准备

    3.1 安装Python3

    # yum install zlib-devel libffi-devel mysql-devel -y
    # tar -zxvf Python-3.8.6.tgz
    # cd Python-3.8.6
    # ./configure 
    ##### ./configure --enable-optimizations 
    # make -j 4 && make install

    3.2 安装依赖模块列表

    # pip3 install -r /root/requirements.txt -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

     

    在安装过程中,twisted指定的版本比较新,在仓库里没有,需要单独安装:

     

    # yum install bzip2
    # tar -jvxf Twisted-20.3.0.tar.bz2
    # cd Twisted-20.3.0
    # python3 setup.py install

     

    可能会遇到错误:Can’t connect to HTTPS URL because the SSL module is not available

    大致意思是无法使用HTTPS,不能下载相关依赖包。

    可能原因:依赖系统openssl的版本低或者系统没有安装

     

    安装perl5

    # tar zxvf perl-5.28.0.tar.gz 
    # cd perl-5.28.0
    # ./Configure -des -Dprefix=/usr/local/perl5
    # make -j 4 && make install

     

    安装openssl

    # tar zxvf openssl-1.1.1i.tar.gz 
    # cd openssl-1.1.1i
    # ./config --prefix=/usr/local/openssl 
    # make -j 4 && make install
    # ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
    # ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

     

    重新编译python

    # cd Python-3.8.6
    # ./configure --with-openssl=/usr/local/openssl/
    ##### ./configure --enable-optimizations --with-openssl=/usr/local/openssl/
    # make -j 4 && make install

    3.3 安装数据库

    MySQL:

    # docker run -d --name db -p 3306:3306 -v /mysql/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --character-set-server=utf8
    # docker exec -it db bash
    # root@e2eff2d75dd2:/# mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "create database test;"
    # root@e2eff2d75dd2:/# exit

     

    Redis

    # docker run --name redis -d -p 6379:6379 redis:5

     

    启动开发环境,验证依赖模块:

    # mkdir -p /opt/k8s
    # cp -a /root/devops.zip /opt/k8s/
    # cd /opt/k8s/
    # unzip devops.zip && rm -f devops.zip
    # python3 manage.py runserver 0.0.0.0:8080 
     
    如果报缺少依赖包,需要再次执行如下命令:
    # pip3 install -r /root/requirements.txt -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

     

    测试问题,同步数据库:

    python3 manage.py migrate

    3.4 安装与配置uwsgi

    uWSGI是一个Web服务器,也是Python的一个模块,直接pip安装即可:

     

    # pip3 install uwsgi -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

     

    创建uwsgi配置文件,路径任意:

    # cd /opt/k8s
     
    # cat uwsgi.ini
    [uwsgi]
    # 项目目录
    chdir = /opt/k8s
     
    # 指定sock的文件路径,本地sock访问时使用
    socket = /opt/k8s/uwsgi.sock
     
    # 指定监听端口,http远程访问时使用
    # http = 0.0.0.0:8080
     
    # 静态资源,uwsgi访问方式时使用
    # static-map = /static=/opt/k8s/static
     
    # wsgi文件(django入口)
    wsgi-file=devops/wsgi.py
     
    # 进程个数
    processes = 4
     
    # 指定项目的应用
    # module = devops.wsgi
     
    # 进程pid
    pidfile = /opt/k8s/uwsgi.pid
     
    # 日志路径
    # daemonize = /opt/k8s/uwsgi.log
    # uwsgi服务以守护进程运行)会导致sytemctl启动时多次重启而导致启动失败,
    # 需要改为如下所配置。
    logto = /opt/k8s/uwsgi.log
     
    # 指定启动django项目的用户名和用户组
    uid = nginx
    gid = nginx

     

    uwsgi加入到systemd中进行管理:

    # cat /usr/lib/systemd/system/uwsgi.service
    [Unit]
    Description=uwsgi server
    After=network.target
     
    [Service]
    WorkingDirectory=/opt/k8s
    ExecStart=/usr/local/bin/uwsgi --ini /opt/k8s/uwsgi.ini
    ExecStop=/usr/local/bin/uwsgi --stop /opt/k8s/uwsgi.pid
    ExecReload=/usr/local/bin/uwsgi --reload /opt/k8s/uwsgi.pid
    Restart=on-failure
     
    [Install]
    WantedBy=multi-user.target
     
    # systemctl daemon-reload

    3.5 配置Nginx

    # yum install nginx -y
    # id nginx
    uid=997(nginx) gid=993(nginx) groups=993(nginx)
     
    # vim /etc/nginx/nginx.conf
    server {
            listen       80 default_server;
            server_name  _;
     
            location / {
               include     uwsgi_params;
               # 导入模块用于与uwsgi通信
               uwsgi_pass unix:/opt/k8s/uwsgi.sock;
               # uwsgi_pass http://172.16.1.251:8080;
            }
     
            # 静态文件目录
            location /static {
               alias /opt/k8s/static;
            }
       }
     
    # nginx -t

    3.6 赋权

    # chown -R nginx.nginx /opt/k8s/

    3.7 启动

    # systemctl restart uwsgi.service
    # systemctl enable uwsgi.service
     
    # systemctl restart nginx.service
    # systemctl enable nginx.service
     
    
     
    
     
    访问测试
    http://172.16.1.251

    3.8 uwsgi补充说明

    uwsgi类似于php-fpm,可以单独配置在一台服务器上,可以通过socket本地访问(性能高),也可以通过http的方式远程进行访问,既能处理动态请求也能处理静态请求。
     
    如下配置选项可以通过nginx代理服务进行本地访问:uwsgi_pass unix:/opt/k8s/uwsgi.sock;
    # 指定sock的文件路径,本地sock访问时使用
    socket = /opt/k8s/uwsgi.sock
     
    如下配置选项可以通过nginx代理服务进行http访问:uwsgi_pass http://172.16.1.251:8080;
    # 指定监听端口,http远程访问时使用
    http = 0.0.0.0:8080
     
    如下配置选项可以通过uwsgi http方式进行访问:http://172.16.1.251:8080/
    # 指定监听端口,http远程访问时使用
    http = 0.0.0.0:8080
    # 静态资源,uwsgi访问方式时使用
    static-map = /static=/opt/k8s/static
  • 相关阅读:
    关于深拷贝和浅拷贝的理解
    Oracle数据库入门
    单例模式入门
    oracle存储过程 (还没动手实践、剩余内容找时间在处理、游标还没接触)
    Oracle用户名及默认密码
    oracle数据库怎么创建数据库实例
    Java 强、弱、软、虚,你属于哪一种?
    内存溢出和内存泄漏的区别
    aop中execution 表达式
    JPA 中@Enumerated
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/14702910.html
Copyright © 2020-2023  润新知