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

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

一、nginx 快速使用

1.1 了解

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

  1. 知识点一: 正向代理 》 客户端 反向代理 》 服务器端

  2. 知识点二: 负载均衡 - 加权轮询

  3. 知识点三: 不建议用nginx做session共享(建议用Redis)

  4. 知识点四: 动静分离

基本命令

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

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

1.4 负载均衡演示

配置文件

ini 复制代码
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版本

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

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

bash 复制代码
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文件如下

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-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容器之间中文件并不一样,我们需要添加一个共享资源文件

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

yml 复制代码
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安装。

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

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

基本参数列表:

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

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

3.3 配置运行文件

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

python 复制代码
# 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"    # 错误日志文件

启动服务命令

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

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

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

相关推荐
devlei7 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
努力的小郑9 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
Victor35610 小时前
MongoDB(87)如何使用GridFS?
后端
Victor35610 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁10 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp10 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
宁瑶琴12 小时前
COBOL语言的云计算
开发语言·后端·golang
普通网友12 小时前
阿里云国际版服务器,真的是学生党的性价比之选吗?
后端·python·阿里云·flask·云计算
IT_陈寒13 小时前
Vue的这个响应式问题,坑了我整整两小时
前端·人工智能·后端
Soofjan13 小时前
Go 内存回收-GC 源码1-触发与阶段
后端