写点什么

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

  • 2022 年 9 月 01 日
    广东
  • 本文字数:4603 字

    阅读完需:约 15 分钟


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


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


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


一、nginx 快速使用

1.1 了解

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


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

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

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

  4. 知识点四:动静分离


基本命令


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


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


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启动服务后,




成功运行!


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

发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2022.08.13 加入

还未添加个人简介

评论

发布
暂无评论
【云原生 | Docker】部署 Django & Nginx & Gunicorn_8月月更_计算机魔术师_InfoQ写作社区