【云原生| Docker】 部署 Django & mysql 项目]

![在这里插入图片描述](https://img-blog.csdnimg.cn/8005761f9a1c4525a95b118212679668.png)

>🤵♂️ 个人主页:  [@计算机魔术师](https://cpt-magician.blog.csdn.net/?type=blog)

👨💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

🌐 推荐一款找工作神器网站:<font size=4> [点击跳转牛客网登陆注册🎉🎉](https://www.nowcoder.com/link/pc_csdncpt_jsjmss_python) <font>|笔试题库|面试经验|实习招聘内推|

>>**该文章收录专栏**

> ✨[---【Django | 项目开发】从入门到上线 专栏---](https://blog.csdn.net/weixin_66526635/category_11905572.html)✨

书接上文 姊妹篇[【云原生| Docker】 部署 Django & mysql 项目](https://blog.csdn.net/weixin_66526635/article/details/126023879?spm=1001.2014.3001.5501)

@[toc]

# 一、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` (文件路径不可以出现中文)

![在这里插入图片描述](https://img-blog.csdnimg.cn/e34839df655b418c81f1cc0869dd8091.png)

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 负载均衡演示

配置文件

```

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 ](https://blog.csdn.net/weixin_66526635/article/details/126023879?spm=1001.2014.3001.5501)的基础上修改`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` 启动测试

![在这里插入图片描述](https://img-blog.csdnimg.cn/6cbe5bfe9910400ea9d7b6fa666f6757.png)

## 2.2 处理静态资源

但是在访问`simpleui`主题的`admin`后台时,静态资源出了问题

![在这里插入图片描述](https://img-blog.csdnimg.cn/c37b3e7b616046fcbba03e063fa00e38.png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/6b04058110224cafb0a80443cea2b8b5.png)

说明这里静态资源无法访问,考虑到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`

![在这里插入图片描述](https://img-blog.csdnimg.cn/afbe496dad0840dcb1975209754c9593.png)

成功解决, 如果要解决关于 `media`文件访问也是一样的方法(不过一般都是用分布式存贮)

并且`nginx`提供了阅读静态资源目录 ( 这是由于添加自动索引参数)

![在这里插入图片描述](https://img-blog.csdnimg.cn/95bb760c46344c938449a60881e23cd5.png)

实际在项目上线部署是不建议放这个参数的,一般使用于调试开发

![在这里插入图片描述](https://img-blog.csdnimg.cn/df801fd85d73422f9d890d27a4f44fda.png)

**注意!** 这里值得一提的是,如果已经配置了静态资源,但是中间不通过`nginx`所监听的80端口来分配访问到项目路由,而是直接以服务器的8000端口直接访问服务器,就会发现不论是`static`还是`media`都无法访问,就算在`urls.py`中配置了静态资源,且容易出关于静态资源的问题,所以建议通过nginx来处理![在这里插入图片描述](https://img-blog.csdnimg.cn/e6cf1f3a93d743ee9cd323654eb84948.png)

# 三、部署Gunicorn

## 3.1 快速熟悉

>[Gunicorn (‘Green Unicorn’)](https://gunicorn.org/) 是一个 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`启动服务后,![在这里插入图片描述](https://img-blog.csdnimg.cn/26b46973cbea4991b910e924b93671da.png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/aca0e5065fc1484ba6536c4028527b0b.png)

成功运行!

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容