Docker+nginx+uwsgi+Django/flask项目部署上线

一、前言

这篇文章主要讲解如何在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项目了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342