0


【云原生 | Docker】部署 Django & Nginx & Gunicorn

在这里插入图片描述

🤵‍♂️ 个人主页: @计算机魔术师
👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

🌐 推荐一款找工作神器网站: 点击跳转牛客网登陆注册🎉🎉 |笔试题库|面试经验|实习招聘内推|

该文章收录专栏
✨—【Django | 项目开发】从入门到上线 专栏—✨

书接上文 姊妹篇【云原生| Docker】 部署 Django & mysql 项目

文章目录

一、nginx 快速使用

1.1 了解

反向代理器,网站服务器,负载均衡

  1. 知识点一: 正向代理 》 客户端 反向代理 》 服务器端
  2. 知识点二: 负载均衡 - 加权轮询
  3. 知识点三: 不建议用nginx做session共享(建议用Redis)
  4. 知识点四: 动静分离

基本命令

nginx.exe
nginx -s stop # 立即停止
nginx -s quit # 安全退出
  • 关键配置模块
    • events配置域:网络连接相关配置(I/O模块)
    • server配置域:相关服务节点配置
    • location
    • http配置域 upstream配置域:反向代理配置域 层次关系 ( 1.x 版本)
events {
    ....
}
http {
    ...
    upstream {
        ...
    }
    server {
        ...
        location {
            ...
        }
    }
}

1.2 Windows安装启动

https://nginx.org/en/download.html

官方安装稳定版

在conf文件打开nginx.conf

看到

server

中监听端口是本地的80端口,也就是一旦访问便会被拦截
我们打开命令运行

nginx.exe

(文件路径不可以出现中文)

在这里插入图片描述

Linux安装启动
(可在网上找到详细文章,这里就不赘述了)
文章地址:

https://www.kuangstudy.com/bbs/1353634800149213186

1.3 关闭nginx

如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx

(1)输入nginx命令

 nginx -s stop

(快速停止nginx) 或

nginx -s quit

(完整有序的停止nginx)

(2)使用

taskkill taskkill /f /t /im nginx.exe
taskkill是用来终止进程的,
/f是强制终止 .
/t终止指定的进程和任何由此启动的子进程。
/im示指定的进程名称 .

1.4 负载均衡演示

配置文件

upstream magic{
    server 127.0.0.1:8080 weight=3;  # 权重
    server 127.0.0.1:8081 weight=1;
}
location / {
    proxy_pass http://magic; # 默认进入地址
}

在根路径会按照权重不同频率分配给服务器

配置文件大全:

https://blog.csdn.net/qq_46312987/article/details/118895520

二 、部署Nginx

修改nginx配置文件完成反向代理配置

2.1 配置nginx

1.27版本
events {
    worker_connections  1024;}

http {
    upstream Hogwarts {
        server Hogwarts:8000 weight=1;# 权重为1}
    server {
        listen 80;
        server_name localhost;
        client_max_body_size 50m;# 最大链接数

        location /static {# 这里用来显示目录 表示只要输入 www.xxx:8000/static# 就会跳转到这个static目录下  和我们直接把文件上方的路径贴到浏览器是一样的
        autoindex on;# 开启目录浏览alias /code/static;}# 同理static
           location /media {
        autoindex on;alias /code/media;}

        location / {
            proxy_pass http://Hogwarts;# 固定访问域名}}}
最新版本

(与旧版本中层级不同等)

upstream Hogwarts {
    ip_hash;# 共享session共享 ( 建议用redis,server 宕机在server后添加 down )
    server app:8000 weight=1;# 权重为1,设置为Hogwarts:8000 是因为docker内部主机地址不是127.0.0.1}

server {

    listen 80;
    server_name localhost;
    client_max_body_size 10m;# 最大文件上传限制
    charset utf-8;# 设置网页的默认编码格式

    location /static {# 这里用来显示目录 表示只要输入 www.res.cn:8034/static# 就会跳转到这个static目录下  和我们直接把文件上方的路径贴到浏览器是一样的
        autoindex on;# 开启目录浏览alias /code/static;}# 同理static
    location /media {
        autoindex on;alias /code/media;}

    location / {
        proxy_pass http://Hogwarts;# 固定访问域名}}

可以先在本地启动

nginx

测试,

在上文 姊妹篇 Docker 部署 Django & mysql 的基础上修改

docker-compose.yml

文件如下

version:"3"services:#  设置应用 容器app:restart: always
    build: .   # todo 根据当前项目 dockerfile生成,相当于 docker build -t="" .# bash shell窗口 -c命令行 默认迁移 和 运行              # todo 上传文件需要添加如下代码: python manage.py migrate && python manage.py collectstatic --no-inputcommand: bash -c "pip install -r requirements.txt  && python manage.py runserver 0.0.0.0:8000" # && python manage.py collectstatic --no-inputvolumes:- .:/code
    ports:-"8000:8000"depends_on:- db
    networks:- db_network
      - web_network
  # 设置数据库 容器db:image: mysql:8volumes:-"./mysql/data:/var/lib/mysql"# 设置timestamp 可为 null   #  设置字符集 (不是utf8会报错 #   collation 这是排序规则#      - "./mysql/conf/my.cnf:/etc/mysql/my.cnf"command:"mysqld --user=root --explicit_defaults_for_timestamp --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci"#      - -character-set-server=utf8mb4  # 设置默认字节#      - -collation-server=utf8mb4_general_ci #   设置排序#      - -explicit_defaults_for_timestamp=true # 设置可为 null#      --default-authentication-plugin=mysql_native_password # 使用 5.7 版本的密码验证ports:-"3307:3306"restart: always
    environment:- MYSQL_ROOT_PASSWORD=123456  # 一定要配置- MYSQL_DATABASE=django_recruitment
    networks:- db_network

  nginx:image: nginx:latest
    restart: always
    ports:-"80:80"volumes:- ./config/nginx:/etc/nginx/conf.d
    depends_on:- app
    networks:- web_network

# 设置网络networks:db_network:driver: bridge
  web_network:driver: bridge

主要修改部分是添加了

nginx

服务和

web_network

网络

docker-compose up

启动测试
在这里插入图片描述

2.2 处理静态资源

但是在访问

simpleui

主题的

admin

后台时,静态资源出了问题
在这里插入图片描述
在这里插入图片描述
说明这里静态资源无法访问,考虑到nginx的配置虽然对应到项目容器中静态资源地址,但是却无法访问,这是由于

nginx

容器与

app

容器之间中文件并不一样,我们需要添加一个

共享资源文件

解决方式 – 添加静态资源卷

version:"3"services:#  设置应用 容器app:
    代码省略
    volumes:- .:/code
      - static-volumes:/code/static
    ports:-"8000:8000"depends_on:- db
    networks:- db_network
      - web_network
  代码省略
  nginx:image: nginx:latest
    restart: always
    ports:-"80:80"volumes:- ./config/nginx:/etc/nginx/conf.d
      - static_volumes:/code/static  # 添加卷depends_on:- app
    networks:- web_network
代码省略

# 设置卷volumes:static_volumes:

主要修改部分时添加静态资源卷,我们再次

docker-compose up

在这里插入图片描述
成功解决, 如果要解决关于

media

文件访问也是一样的方法(不过一般都是用分布式存贮)

并且

nginx

提供了阅读静态资源目录 ( 这是由于添加自动索引参数)
在这里插入图片描述
实际在项目上线部署是不建议放这个参数的,一般使用于调试开发

在这里插入图片描述

注意! 这里值得一提的是,如果已经配置了静态资源,但是中间不通过

nginx

所监听的80端口来分配访问到项目路由,而是直接以服务器的8000端口直接访问服务器,就会发现不论是

static

还是

media

都无法访问,就算在

urls.py

中配置了静态资源,且容易出关于静态资源的问题,所以建议通过nginx来处理在这里插入图片描述

三、部署Gunicorn

3.1 快速熟悉

Gunicorn (‘Green Unicorn’) 是一个 UNIX 下的纯 Python WSGI 服务器。Gunicorn 服务器作为wsgi app的容器,能够与各种Web框架兼容(flask,django等),大幅度提高wsgi app的性能,而Django 自带的
WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式是单进程

WSGI 是一个规范(协议),定义了web server 和 web application通信的规范

它没有其它依赖,可以使用

pip

安装。

pip install gunicorn

把 Django 当作普通 WSGI 应用在 Gunicorn 中运行

官方文档:

安装 Gunicorn 之后,可用 gunicorn 命令启动 Gunicorn 服务进程。最简单的启动方式就是把包含了

WSGI

应用程序对象的

application

应用程序模块位置告诉

gunicorn

,就可以启动了。因此对于典型的 Django 项目,像这样来调用 gunicorn:

gunicorn myproject.wsgi

这样会创建一个进程,包含了一个监听在 127.0.0.1:8000 的线程。前提是你的项目在 Python path 中,要满足这个条件,最简单的方法是在 manage.py 文件所在的目录中运行这条命令。

3.2 运行命令

我们在

docker-compose.yml

文件中修改命令如下

command: bash -c "gunicorn  --timeout=30 --bind :8000 --workers=4 recruitment.wsgi:application"# &&  python manage.py runserver 0.0.0.0:8000

基本参数列表:

-c(--config)        指定一个配置文件(py文件)
-b (--bind)       与指定的socket进行绑定
-D (--defend)       以守护进程形式来运行Gunicorn进程
-w (--workers)       工作的进程数量,后面加数字;[gunicorn -w 2 untitled.wsgi -b 0.0.0.0:8000]
–threads  后面加数字,处理请求的最大线程数
-k        工作进程类型: sync(默认), eventlet, gevent, or tornado, gthread, gaiohttp.
–chdir    后面加路径,跳转到目录下执行
–reload   后面可加参数,默认参数false,开启为true,开启时当代码发生改变,会重新加载修改的代码,并启动程序,(热加载)
-proxy-protocol
–worker-connections
–access-logfile

如果使用的是多

settings

设置环境,则需要在项目

wsgi.py

修改默认配置路径

os.environ.setdefault('DJANGO_SETTINGS_MODULE','配置文件的相对于项目的路径')

3.3 配置运行文件

如果有更加复杂的配置需要,可以在项目目录下创建配置文件

gunicorn.conf.py

# gunicorn_config.pyimport multiprocessing

bind =':8000'# 绑定ip和端口号# chdir = ''  # 目录切换# backlog = 500              # 监听队列
timeout =60# 超时
worker_class ='gevent'# 使用gevent模式,还可以使用sync 模式,默认的是sync模式
workers = multiprocessing.cpu_count()*2+1# 进程数
threads =2# 指定每个进程开启的线程数
loglevel ='info'# 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format ='%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
accesslog ="/log/gunicorn_access.log"# 访问日志文件
errorlog ="/log/gunicorn_error.log"# 错误日志文件

启动服务命令

gunicorn -c gunicorn.conf.py 项目名称.wsgi:application

以上两种办法配置好之后

docker-compose up

启动服务后,在这里插入图片描述
在这里插入图片描述
成功运行!

下一篇文章我将带领大家从腾讯云服务器选型到部署 🎉🎉

标签: 云原生 docker django

本文转载自: https://blog.csdn.net/weixin_66526635/article/details/126328228
版权归原作者 计算机魔术师 所有, 如有侵权,请联系我们删除。

“【云原生 | Docker】部署 Django & Nginx & Gunicorn”的评论:

还没有评论