前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【云原生 | Docker】部署 Django & Nginx & Gunicorn

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

作者头像
计算机魔术师
发布2022-09-26 10:44:12
1.3K0
发布2022-09-26 10:44:12
举报
文章被收录于专栏:计算机魔术师计算机魔术师
在这里插入图片描述
在这里插入图片描述

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

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

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

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

文章目录

一、nginx 快速使用

1.1 了解

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

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

基本命令

代码语言:javascript
复制
nginx.exe
nginx -s stop # 立即停止
nginx -s quit # 安全退出
  • 关键配置模块
    • events配置域:网络连接相关配置(I/O模块)
    • server配置域:相关服务节点配置
    • location
    • http配置域 upstream配置域:反向代理配置域 层次关系 ( 1.x 版本)
代码语言:javascript
复制
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

代码语言:javascript
复制
taskkill是用来终止进程的,
/f是强制终止 .
/t终止指定的进程和任何由此启动的子进程。
/im示指定的进程名称 .

1.4 负载均衡演示

配置文件

代码语言:javascript
复制
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版本

代码语言:javascript
复制
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; # 固定访问域名
        }
    }
}

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

代码语言:javascript
复制
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文件如下

代码语言:javascript
复制
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-input
    command: bash -c "pip install -r requirements.txt  && python manage.py runserver 0.0.0.0:8000" # && python manage.py collectstatic --no-input
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
    networks:
      - db_network
      - web_network
  # 设置数据库 容器
  db:
    image: mysql:8
    volumes:
      - "./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容器之间中文件并不一样,我们需要添加一个共享资源文件

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

代码语言:javascript
复制
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安装。

代码语言:javascript
复制
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文件中修改命令如下

代码语言:javascript
复制
command: bash -c "gunicorn  --timeout=30 --bind :8000 --workers=4 recruitment.wsgi:application" # &&  python manage.py runserver 0.0.0.0:8000

基本参数列表:

代码语言:javascript
复制
-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修改默认配置路径

代码语言:javascript
复制
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '配置文件的相对于项目的路径')

3.3 配置运行文件

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

代码语言:javascript
复制
# gunicorn_config.py
import 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"    # 错误日志文件

启动服务命令

代码语言:javascript
复制
gunicorn -c gunicorn.conf.py 项目名称.wsgi:application

以上两种办法配置好之后docker-compose up启动服务后,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

成功运行!

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、nginx 快速使用
    • 1.1 了解
      • 1.2 Windows安装启动
        • 1.3 关闭nginx
          • 1.4 负载均衡演示
          • 二 、部署Nginx
            • 2.1 配置nginx
              • 2.2 处理静态资源
              • 三、部署Gunicorn
                • 3.1 快速熟悉
                  • 3.2 运行命令
                    • 3.3 配置运行文件
                    相关产品与服务
                    容器镜像服务
                    容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档