🤵♂️ 个人主页: @计算机魔术师
👨💻 作者简介: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 版本)
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-inputcommand: bash -c "pip install -r requirements.txt && python manage.py runserver 0.0.0.0:8000" # && python manage.py collectstatic --no-inputvolumes:- .:/code
ports:-"8000:8000"depends_on:- db
networks:- db_network
- web_network
# 设置数据库 容器db:image: mysql:8volumes:-"./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
启动服务后,
成功运行!
下一篇文章我将带领大家从腾讯云服务器选型到部署 🎉🎉
版权归原作者 计算机魔术师 所有, 如有侵权,请联系我们删除。