美文网首页
Docker+nginx+uwsgi+Django/flask项

Docker+nginx+uwsgi+Django/flask项

作者: 王文强Python | 来源:发表于2023-06-01 14:56 被阅读0次

    一、前言

    这篇文章主要讲解如何在Liniux上采用多进程多线程方式部署django项目并打包成docker镜像,首先讲一下两个部件的作用:1、nginx的作用是监听80端口然后将请求转交给8000(自定义)端口,2、uwsgi的作用是启动django项目并开启多进程,uwsgi的作用跟开发环境中的 python manage.py runserver 8000(单进程) 作用是一样的。

    所以要在生产上部署我们只需要安装一个nginx并按照config 文件配置一下 nginx 和 uwsgi 配置文件就可以了。我用的是Ubuntu系统,contos 上安装命令用yum,contos底层包太旧而且马上就不再更新了所以建议大家还是早点换Ubuntu。

    前面大标题 二 到 六 讲的是如何手动在Ubuntu上部署,大标题七、八 讲的是如何打包成Docker镜像,让项目在容器中跑起来

    flask 的部署跟Django一模一样 只需要修改 uwsgi.ini 中一两个参数就可以了

    二、依赖环境

    1、python3.11.+
    2、nginx1.18.0
    3、uwsgi2.0.20
    4、配置 pip.conf 豆瓣元
    5、安装python第三方库:requirements.txt
    

    三、软件安装

    1、nginx
    apt-get update
    apt-get install nginx
    
    2、配置pip源
    mkdir ~/.pip
    vim ~/.pip/pip.conf
    
    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    [install]
    trusted-host = mirrors.tuna.tsinghua.edu.cn
    
    3、Ubuntu 自带python3.10.6版本
    4、安装python第三方库
    cd  /root/projectpy/
    python3 -m venv myenv
    source /root/projectpy/myenv/bin/activate
    pip3 install --upgrade pip
    pip3 install -r requirements.txt
    pip3 install uwsgi
    

    四、配置文件

    1、uwsgi

    /root/projectpy/Django根目录/uwsgi.ini

    [uwsgi]
    chdir=/root/projectpy/Django根目录
    module=项目名称.wsgi:application
    socket=0.0.0.0:8000
    pidfile=%(chdir)/uwsgi/uwsgi.pid
    stats=%(chdir)/uwsgi/uwsgi.status
    touch-reload = %(chdir)/uwsgi/uwsgi.pid
    touch-chain-reload=%(chdir)/项目名称/settings.py
    uid=root
    gid=root
    master=true
    enable-threads=true
    thunder-lock=true
    processes = 8  # 进程数
    threads = 80  # 线程数
    auto-procname = true  # 自动给进程命名
    procname-frefix-spaced = xc-mms
    vacuum=true
    disable-logging=true
    reload-mercy=1
    worker-reload-mercy=1
    py-autoreload = 1
    lazy-apps = true
    
    2、nginx

    /etc/nginx/nginx.conf

    user root;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 4096;
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80;
            listen       [::]:80;
            server_name  localhost;
            charset     utf-8;
            client_max_body_size 75M;
            root /root/projectpy/Django根目录;
    
            location / {
               include uwsgi_params;
               uwsgi_pass 0.0.0.0:8000;
               uwsgi_read_timeout 1000;
               }
    
          location /static/ {
               expires 30d;
               autoindex on;
               add_header Cache-Control private;
               root /root/projectpy/Django根目录/;
               }
    
            error_page 404 /404.html;
            location = /404.html {
            }
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
            }
            add_header X-Frame-Options SAMEORIGIN;
            add_header 'Referrer-Policy' 'same-origin' always;
            add_header X-Download-Options "noopen" always;
            add_header X-Permitted-Cross-Domain-Policies  "master-only" always;
           # add_header X-XSS-Protection "1; mode=block";
           # add_header X-Content-Type-Options nosniff;      
           # add_header Content-Security-Policy "default-src 'self'  ";
        }
    }
    

    五、运维管理

    1、uwsgi
    1、启动命令:
    source /root/projectpy/myenv/bin/activate
    cd /root/projectpy/Django根目录
    mkdir uwsgi
    uwsgi  --ini  uwsgi.ini  &
    
    2、维护期间其他命令:
    重启服务:uwsgi --reload uwsgi/uwsgi.pid
    停止服务:uwsgi --stop uwsgi/uwsgi.pid 
    查看进程状况:uwsgi --connect-and-read uwsgi/uwsgi.status
    
    3、进程管理:
    ps -ef|grep uwsgi
    pkill -f uwsgi -9
    killall -9 uwsgi
    
    2、nginx
    启动:systemctl start nginx
    设置开机启动:systemctl enable nginx
    
    其他命令:
    systemctl start nginx
    systemctl stop nginx
    systemctl restart nginx
    
    查看运行状态:systemctl status nginx.service
    查看端口:netstat -nap | grep 80
    

    六、处理statice静态文件

    1、本地开发环境中setting.py 是这样配置
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,"static")
    ]
    #STATIC_ROOT = os.path.join(BASE_DIR,'/static/')
    
    2、生产环境中setting.py 需要这样配置
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,"/static/")
    ]
    STATIC_ROOT = os.path.join(BASE_DIR,'/static/')
    
    另外Django4以前的版本还需要执行如下命令:
    
    cd   Django根目录
    sudo chmod 777  static
    python manage.py collectstatic
    

    七、编写Dockerfile文件

    1、Dockerfile

    FROM python:3.11.3
    LABEL org="username" authors="pasword" release-date="2023-5-31"
    #设置python环境参数
    ENV PYTHONUNBUFFERED 1
    #给基础镜像换国内源
    RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    #安装nginx uwsgi必要的依赖
    RUN apt-get update -y && apt-get install nginx build-essential python-dev -y
    #copy新的nginx配置文件到默认位置
    COPY nginx.conf /etc/nginx/nginx.conf
    #给pip换源
    COPY pip.conf /root/.pip/pip.conf
    #建项目工作目录
    RUN mkdir -p /root/projectpy/Django根目录/
    WORKDIR /root/projectpy/Django根目录/
    RUN mkdir uwsgi
    #安装python的依赖
    COPY ["requirements.txt","uwsgi.ini","./"]
    RUN pip3 install --upgrade pip
    RUN pip3 install -r requirements.txt
    #把项目copy过去
    COPY . .
    #给runserver.sh加运行权限
    RUN chmod 777 ./runserver.sh
    #暴露8000端口
    EXPOSE 8000 80
    #执行前台应用
    CMD [ "/bin/sh","runserver.sh" ]
    

    2、runserver.sh

    #!/bin/bash
    nginx -g "daemon on;" && uwsgi --ini uwsgi.ini
    #/bin/bash
    

    3、其他文件:

    下面4个文件名的内容上面已经有了,这里就不再重复写
    
    pip.conf  
    uwsgi.ini  
    nginx.conf 
    requirements.txt
    

    八、在Doaker容器中运行

    1、先将自己的Django项目代码 以及上方的六个文件上传到/root/projectpy/目录下面
    2、默认你的liniux上已经安装了Docker(几条命令很简单就安装好了)
    3、打Docker镜像

    生成镜像:docker build -t venuspy:1.0  .
    查看镜像:docker images
    运行镜像:docker run -d -p 80:80 --name=venuspy venuspy:1.0
    查看容器:docker ps -l
    进入容器:docker exce -it   容器ID号
    

    4、现在从外网应该就能访问你的django项目了

    相关文章

      网友评论

          本文标题:Docker+nginx+uwsgi+Django/flask项

          本文链接:https://www.haomeiwen.com/subject/keiuedtx.html