nginx 反向代理
用户 (浏览器) 请求网站资源 -> 直接定位到 django 后台 (所有的请求压力, 都直接给了后台)
django 默认对并发性 很差, 并且处理网页的静态资源, 效率很差
10 万个并发请求 -> 后台应用
用户 > nginx(天然并发性很高, 并且处理静态资源 CSS,JS.jpg) , 静态资源, nginx 直接从磁盘上返回 >
- server{
- listen 80;
- server_name localhost.com;
- location / {
- root /opt/django_crm;
- index index.html;
- }
- }
我们在 / opt/django_crm 中 , 放入一个图片 crm2.PNG
这是一个静态资源
localhost.com/crm.PNG , 如果找不到资源直接返回 404
如果我发送了一个动态请求,(对数据库进行交互, 必须有编程语言的支撑)
localhost.com/login/ -> django 后台, django 这个编程语言框架, 就可以对 login 请求处理
?
实现 nginx 反向代理的功能:
实验环境准备, 2 台机器
用户: 浏览器发起请求, 得到请求
192.168.15.71 nginx 反向代理服务器 (房屋中介代理)
192.168.15.73 真实资源服务器 (有房源的房东)
分别在 2 台机器上, 安装 nginx
先配置真实资源服务器,
192.168.15.73 打开这个机器的页面是吃鸡的网游页面
配置反向代理服务器
修改 nginx.conf
如下
虚拟主机的加载, 自上而下的加载, 如果是访问的 ip 地址, 永远访问第一个
- # 我们这个 nginx 服务器, 不再是用作虚拟主机了
- # 而是直接转发别人的请求, 是一个代理身份
- server {
- listen 80;
- server_name s16chiji.com;
- location / {
- #root /opt/s16chiji;
- #index index.HTML;
- #当我的请求是 s16chiji.com 的时候, 这个 nginx 不做处理, 直接转发请求给另一台机器
- proxy_pass http://192.168.15.73;
- }
- #通过这个参数, 定义错误页面的文件 , 当状态码是 404 400 401 时, 返回 40x.HTML 页面
- error_page 404 401 400 403 /40x.HTML;
- }
nginx 脚本命令
nginx 直接输入是启动
nginx -s stop 停止
nginx -s reload 平滑重启, 重新读取配置文件
.nginx.conf.swp 这个文件, 是由于你在 VIM 编辑文件的时候, 异常退出, 或者有其他人也想获取这个文件句柄, VIM 防止文件内容错乱, 丢失, 自动生成一个 swp 缓存文件, 用于保护文件的
nginx 负载均衡
负载 均衡 , 字面意思, 压力平摊
如何配置 nginx, 支持负载均衡
环境准备, 准备 3 台机器
服务器 1 nginx 负载均衡器 192.168.15.71
服务器 2 web 应用资源 1 192.168.15.73
服务器 3 Web 应用资源 2 39.96.68.102
配置负载军器 ,192.168.15.71 机器
nginx.conf, 修改添加如下参数
这个参数, 应该写在 http{} 内部, 写在 server{} 以上
- upstream s16backup {
- server 192.168.15.75;
- server 192.168.15.118;
- }
第一个虚拟主机, 修改配置如下
- server {
- listen 80;
- server_name s16chiji.com;
- location / {
- #root /opt/s16chiji;
- #index index.HTML;
- #当我的请求是 s16chiji.com 的时候, 这个 nginx 不做处理, 直接转发请求给另一台机器
- #proxy_pass http://192.168.15.73;
- #这个参数, 转发给地址池
- proxy_pass http://s16backup;
- }
- #通过这个参数, 定义错误页面的文件 , 当状态码是
404 400 401 时, 返回 40x.HTML 页面
- error_page 404 401 400 403 /40x.HTML;
- }
分别启动负载均衡器的 nginx 服务, 以及两个资源服务器
nginx 负载均衡算法
默认是轮训方式, 你一次我一次
权重算法:
- upstream django {
- server 192.168.15.73 weight=2;
- server 192.168.15.118 weight=8;
- }
ip 哈希算法: ip 哈希和权重不得公用
- upstream django {
- server 192.168.15.73 ;
- server 192.168.15.118 ;
- ip_hash;
- }
nginx 部署 python 程序
在进行项目部署的时候, 如果报错
解决办法:
no application not found
就是因为你的 uwsgi 没找到 django 的 wsgi.py 应用文件
为什么要用 nginx uwsgi
因为用户只想访问 域名, 不带有任何端口
通过 nginx 反向代理, 用户直接访问 s16chiji.com , 但是 nginx 直接转发给了 django, 我们其实看到的页面是 django
uwsgi 是支持并发的 python Web 服务器, 让你的 django, 并发性更高, 但是 uwsgi 不支持静态文件的处理, 静态文件会丢失
用 nginx 处理静态文件, uwsgi 处理动态请求
项目部署实验步骤
- nginx
- uwsgi+django
uwsgi 部署:
创建新的虚拟环境, 且解决 crm 的环境依赖
在虚拟环境下安装 uwsgi
pip3 install uwsgi
学习 uwsgi 命令, 如何启动 python 应用
启动 python Web 文件
创建一个 test.py 写入如下代码
- def application(env, start_response):
- start_response('200 OK', [('Content-Type','text/html')])
- return [b"Hello World"] # python3
用 uwsgi 启动一个 python Web 文件
指定 8000 端口启动 http 服务
指定 wsgi 文件
uwsgi --http :8000 --wsgi-file test.py
用 uwsgi 启动 django 项目
uwsgi --http :9000 --module Alibab_crm.wsgi
uwsgi 加上热加载命令
uwsgi --http :8000 --module Alibab_crm.wsgi --py-autoreload=1
使用 uwsgi 配置文件去启动项目
手动创建 uwsgi.INI 配置文件
- (alicrm) [[email protected] Alibab_crm]# cat uwsgi.INI mysite_uwsgi.INI file
- # mysite_uwsgi.INI file
- [uwsgi]
- # Django-related settings
- # the base directory (full path)
- # 指定 django 的项目目录, 第一层
- chdir = /opt/django_crm
- # Django's wsgi file
- # 找到 django 的 wsgi 文件
- # 这里需要写项目的第二层目录 Alibab_crm
- module = django_crm.wsgi
- # the virtualenv (full path)
- # 填写虚拟环境的绝对路径
- home = /root/Envs/DjangoCRM
- # process-related settings
- # master
- master = true
- # maximum number of worker processes
- processes = 5
- # the socket (use the full path to be safe
- # 指定 socket 协议, 运行 django, 只能与 nginx 结合时使用
- # 指定 socket 协议, 运行 django, 只能与 nginx 结合时使用
- # 指定 socket 协议, 运行 django, 只能与 nginx 结合时使用
- socket = 0.0.0.0:8080
- # 如果你没用 nginx, 只想自己启动一个 http 界面, 用这个
- # http = 0.0.0.0:8000
- # ... with appropriate permissions - may be needed
- # chmod-socket = 664
- # clear environment on exit
- vacuum = true
通过配置文件启动 uwsgi
uwsgi --INI uwsgi.INI
收集 django crm 的静态文件
编辑 crm 的 settings.py 配置文件
写入如下代码
定义 django 的静态资源根目录, 便于用命令收集资源, 存放的地儿
- STATIC_ROOT="/opt/crm_static"
- STATIC_URL = '/static/'
- STATICFILES_DIRS = [
- os.path.join(BASE_DIR, 'static')
- ]
用命令收集静态文件
python3 manage.py collectstatic
配置 nginx, 反响代理 django 服务器, 且解析静态文件
proxy_pass 仅仅是请求转发的参数, 与 uwsgi 结合, 还有跟高级的协议参数
修改 nginx 配置文件如下
- server {
- listen 80;
- server_name s16chiji.com;
- location / {
- root /opt/s16chiji;
- index index.HTML;
- # 使用 uwsgi_pass 转发基于 uwsgi 协议的一个请求
- uwsgi_pass 192.168.15.71:8000;
- include /opt/nginx112/conf/uwsgi_params;
- }
- #配置一个 url 的入口, 告诉 django 静态文件在哪里去找
- #当请求 url 是 s16chiji.com/static / 的时候
- #就进行别名, nginx 去 / opt/crm_static 下寻找 JS 文件
- location /static {
- alias /opt/crm_static/;
- }
- #通过这个参数, 定义错误页面的文件 , 当状态码是 404 400 401 时, 返回 40x.HTML 页面
- error_page 404 401 400 403 /40x.HTML;
- error_page 500 502 503 504 /50x.HTML;
- }
此时 nginx 结合 uwsgi 已经完成
192.168.15.71
记住这里推出虚拟环境, 使用物理环境去运行
来源: http://www.bubuko.com/infodetail-3040897.html