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