云原生 | Docker部署 Django & Nginx & Gunicorn
Posted 计算机魔术师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生 | Docker部署 Django & Nginx & Gunicorn相关的知识,希望对你有一定的参考价值。
🤵♂️ 个人主页: @计算机魔术师
👨💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。
🌐 推荐一款找工作神器网站: 点击跳转牛客网登陆注册🎉🎉 |笔试题库|面试经验|实习招聘内推|
该文章收录专栏
✨—【Django | 项目开发】从入门到上线 专栏—✨
书接上文 姊妹篇【云原生| Docker】 部署 Django & mysql 项目
文章目录
一、nginx 快速使用
1.1 了解
反向代理器,网站服务器,负载均衡
-
知识点一:
正向代理 》 客户端
反向代理 》 服务器端 -
知识点二:
负载均衡 - 加权轮询 -
知识点三:
不建议用nginx做session共享(建议用Redis) -
知识点四:
动静分离
基本命令
nginx.exe
nginx -s stop # 立即停止
nginx -s quit # 安全退出
- 关键配置模块
-
- events配置域:网络连接相关配置(I/O模块)
-
- server配置域:相关服务节点配置
-
- location
-
- http配置域
upstream配置域:反向代理配置域
层次关系 ( 1.x 版本)
- http配置域
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.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" # 错误日志文件
启动服务命令
gunicorn -c gunicorn.conf.py 项目名称.wsgi:application
以上两种办法配置好之后docker-compose up
启动服务后,
成功运行!
下一篇文章我将带领大家从腾讯云服务器选型到部署 🎉🎉
云原生之使用docker部署qbittorrent
云原生之使用docker部署qbittorrent
一、qbittorrent介绍
qbittorrent是一个bt下载工具,且有提供远程使用的webui。
二、检查本地docker状态
[root@node ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2022-11-06 06:02:26 CST; 4 days ago
Docs: https://docs.docker.com
Main PID: 9869 (dockerd)
Tasks: 104
Memory: 1.1G
CGroup: /system.slice/docker.service
├─ 9869 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
├─ 45650 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3522 -container-ip 192.168.48.2 -container-port 3306
├─ 45656 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 3522 -container-ip 192.168.48.2 -container-port 3306
├─ 46338 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9300 -container-ip 172.17.0.2 -container-port 9000
├─ 46344 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9300 -container-ip 172.17.0.2 -container-port 9000
├─ 46357 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 443 -container-ip 172.17.0.2 -container-port 443
├─ 46363 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 443 -container-ip 172.17.0.2 -container-port 443
├─ 46376 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8011 -container-ip 172.17.0.2 -container-port 80
├─ 46382 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8011 -container-ip 172.17.0.2 -container-port 80
├─101732 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9200 -container-ip 192.168.32.3 -container-port 9100
├─101746 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9200 -container-ip 192.168.32.3 -container-port 9100
├─101760 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3010 -container-ip 192.168.32.4 -container-port 3000
├─101766 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 3010 -container-ip 192.168.32.4 -container-port 3000
├─102555 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9122 -container-ip 192.168.32.2 -container-port 9090
└─102561 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9122 -container-ip 192.168.32.2 -container-port 9090
Nov 07 17:12:26 node dockerd[9869]: time="2022-11-07T17:12:26.635724329+08:00" level=info msg="ignoring event" container=4fd3f498ff0be1...skDelete"
Nov 07 17:12:28 node dockerd[9869]: time="2022-11-07T17:12:28.508253025+08:00" level=info msg="ignoring event" container=4fd3f498ff0be1...skDelete"
Nov 07 17:12:31 node dockerd[9869]: time="2022-11-07T17:12:31.979456972+08:00" level=info msg="ignoring event" container=4fd3f498ff0be1...skDelete"
Nov 07 17:12:38 node dockerd[9869]: time="2022-11-07T17:12:38.726985355+08:00" level=info msg="ignoring event" container=4fd3f498ff0be1...skDelete"
Nov 07 17:12:51 node dockerd[9869]: time="2022-11-07T17:12:51.865626579+08:00" level=info msg="ignoring event" container=4fd3f498ff0be1...skDelete"
Nov 07 17:13:13 node dockerd[9869]: time="2022-11-07T17:13:13.437764628+08:00" level=info msg="ignoring event" container=5c2c7245e3d7c9...skDelete"
Nov 07 17:22:59 node dockerd[9869]: time="2022-11-07T17:22:59.706854426+08:00" level=info msg="ignoring event" container=9ee6365478b1b3...skDelete"
Nov 09 17:39:21 node dockerd[9869]: time="2022-11-09T17:39:21.635764314+08:00" level=info msg="ignoring event" container=3e1008e973becd...skDelete"
Nov 09 17:48:07 node dockerd[9869]: time="2022-11-09T17:48:07.633429323+08:00" level=info msg="Pull session cancelled"
Nov 09 17:48:08 node dockerd[9869]: time="2022-11-09T17:48:08.335184004+08:00" level=error msg="Not continuing with pull after error: c...canceled"
Hint: Some lines were ellipsized, use -l to show in full.
三、下载qbittorrent
[root@node qbit]# docker pull lscr.io/linuxserver/qbittorrent:latest
latest: Pulling from linuxserver/qbittorrent
7d92384de66c: Pull complete
b7321b7e83db: Pull complete
eac31e3f088f: Pull complete
4e9104623cf7: Pull complete
44234fc645c0: Pull complete
f8317de975f9: Pull complete
Digest: sha256:853efba67ab1a5d23f04d79551a06a17442defc9afec255ad097d81ac5bd9861
Status: Downloaded newer image for lscr.io/linuxserver/qbittorrent:latest
lscr.io/linuxserver/qbittorrent:latest
四、部署qbittorrent
1.创建数据目录
[root@node ~]# mkdir -p /data/qbit
[root@node ~]# cd /data/qbit/
[root@node qbit]#
2.创建qbittorrent容器
docker run -d \\
--name=qbittorrent \\
-e PUID=1000 \\
-e PGID=1000 \\
-e TZ=Asia/Shanghai \\
-e WEBUI_PORT=8080 \\
-p 8080:8080 \\
-p 6881:6881 \\
-p 6881:6881/udp \\
-v /data/qbit//config:/config \\
-v /data/qbit/downloads:/downloads \\
--restart unless-stopped \\
lscr.io/linuxserver/qbittorrent:latest
3.查看qbittorrent容器状态
[root@node qbit]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad4785e725ec lscr.io/linuxserver/qbittorrent:latest "/init" 3 seconds ago Up 2 seconds 0.0.0.0:6881->6881/tcp, :::6881->6881/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:6881->6881/udp, :::8080->8080/tcp, :::6881->6881/udp qbittorrent
五、访问qbittorrent
1.进入qbittorrent 登录页
admin/adminadmin
2.进入qbittorrent 首页
六、qbittorrent的基本配置
1.设置qbittorrent界面中文
设置中文
2.查看qbittorrent中文界面
以上是关于云原生 | Docker部署 Django & Nginx & Gunicorn的主要内容,如果未能解决你的问题,请参考以下文章
云原生之Docker容器安装以及入门Docker部署web应用&&云原生基石
云原生之Docker实战使用docker部署kodbox私有云
云原生之Docker实战使用Docker部署Cloudreve公有云文件系统