🤵♂️ 个人主页: @计算机魔术师👨💻 作者简介:CSDN 内容合伙人,全栈领域优质创作者。
🌐 推荐一款找工作神器网站:<font size=4> 点击跳转牛客网登陆注册🎉🎉 <font>|笔试题库|面试经验|实习招聘内推|
书接上文 姊妹篇【云原生| Docker】 部署 Django & mysql 项目
一、nginx 快速使用
1.1 了解
反向代理器,网站服务器,负载均衡
知识点一:正向代理 》 客户端反向代理 》 服务器端
知识点二:负载均衡 - 加权轮询
知识点三:不建议用 nginx 做 session 共享(建议用 Redis)
知识点四:动静分离
基本命令
nginx.exe
nginx -s stop # 立即停止
nginx -s quit # 安全退出
复制代码
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
安装。
把 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
启动服务后,
成功运行!
下一篇文章我将带领大家从腾讯云服务器选型到部署 🎉🎉
评论