Nginx 实现动静资源分离和负载均衡

1、相关概念

静态资源
.html .jpg .css .js等,没有后台数据库,不含程序(如php、jsp、asp等)的网页

动态资源
需要访问数据库的资源都属于动态资源

静态请求
用户发起的请求只访问到前端资源,不访问数据库

动态请求
用户发起的请求访问后端资源,访问数据库,如用户注册、登录

动静分离
又叫前后端分离,通过中间件将前端代码和后端代码分开。通过nginx实现动静分离,即通过nginx反向代理、负载均衡配置规则实现让动态资源和静态资源及其他业务分别由不同的服务器解析,以解决网站性能、安全、用户体验等问题。

动静分离的好处
动静分离后,即使动态服务不可用,但静态资源不会受到影响。也可以减少不必要的请求消耗,同时能减少请求的延时。

2、动静分离实践

单台服务器实现动静分离:

location / {  root /code/wordpress;  index.php;}location ~* \.(png|jpg|mp4|)${  root /code/wordpress/images;  gzip on;  .....}location ~ \.php$ {  fastcgi_pass 127.0.0.1:9000;  .....}

多台服务器实现动静分离:
实践环境

主机名外网IP角色应用
lb0110.0.0.5负载均衡调度动静资源nginx
web0210.0.0.8静态服务器nginx
web0310.0.0.9动态服务器tomcat


2.1、根据URL地址不同实现代理转发

根据HTTP的URL进行转发,通常称为第七层的负载均衡,而LVS的负载均衡一般用于TCP等的转发,被称为第四层的负载均衡。

企业中,有时希望只用一个域名对外提供服务,不希望使用多个域名对应同一个产品业务,此时就需要在代理服务器上通过配置规则使得匹配不同规则的请求会交给不同的服务器池处理。这类业务有以下几种:

1、动静分离、多业务服务分离

2、不同客户端设备使用同一个域名访问同一个业务时(案例见下节)

负载均衡器(如lb01)上示例配置如下​​​​​​​

http{  ...  upstream static_pools {    server 10.0.0.7:80 weight=1;  upstream upload_pools {    server 10.0.0.8:80 weight=1;  upstream default_pools {    server 10.0.0.9:80 weight=1;    server {    listen 80;    server_name www.etiantian.org;       location / {      proxy _pass http://default pools;      include ...;      }            location /static/ {      proxy_pass http://static pools;      include proxy.conf;      }            location /upload/ {      proxy pass http: //upload pools;      include proxy.conf;      }

上面配置可实现:

当用户请求
http://www.etiantian.org/upload/x 地址的时候,代理会分配请求到上传服务器池 (upload_pools ) 处理数据;当用户请求 http://www.etiantian.org/static/x 地址的时候,代理会分配请求到静态服务器池(static_pools)请求数据;当用户请求 http://www.etiantian.org/x 地址的时候,即不包含上述指定的目录地址路径时,代理会分配请求到默认的动态服务器池请求数据(注意:上面的x表示任意路径)。

2.2、 根据文件扩展名不同实现代理转发

示例配置如下:​​​​​​​

location ~ .*.(jpg|jpeg|png|gif|bmp|css|js)$ {              proxy_pass http://static_pools;              include /etc/nginx/conf.d/proxy_params;      }      location ~ .*.(jsp|php|php3|php5) {              proxy_pass http://dynamic_pools;              include /etc/nginx/conf.d/proxy_params;      }

实践如下

a. 部署前端代码(静态资源)web02​​​​​​​

# web02[root@web02 /etc/nginx/conf.d]# vim static.confserver {      listen 80;      server_name pic.xxx.com;      root /code;      index index.html;      location ~* .*\.(jpg|png|gif)$ {              root /code/images;}}
# 创建站点目录mkdir -p /code/images# 部署前端代码echo '这个是静态资源页面' > /code/index.html[root@web02 /code]# echo '这个是静态资源页面' > /code/index.html[root@web02 /code]# lltotal 4drwxr-xr-x 2 root root  6 Oct 21 10:08 images-rw-r--r-- 1 root root 28 Oct 21 10:32 index.html# 放入图片[root@web02 /code/images]# lltotal 168-rw-r--r-- 1 root root 82354 Sep 16 14:58 1.jpg# 检查语法,重载nginxnginx -tsystemctl reload nginx# 域名解析、访问10.0.0.8   pic.xxx.com
b. 部署后端(动态资源)web03​​​​​​​

# web03# 安装部署tomcat并启动[root@web03 ~]# yum install -y tomcat[root@web03 ~]# systemctl start tomcat[root@web03 ~]# netstat -lntup |grep javatcp6       0      0 :::8009                 :::*                   LISTEN      7222/java          tcp6       0      0 :::8080                 :::*                   LISTEN      7222/java          tcp6       0      0 127.0.0.1:8005         :::*                   LISTEN      7222/java  
# 部署后端代码,需要在站点目录里面创建一个ROOT目录mkdir /usr/share/tomcat/webapps/ROOTecho 'tomcat test' > /usr/share/tomcat/webapps/ROOT/index.html[root@web03 /usr/share/tomcat/webapps/ROOT]# lltotal 4-rw-r--r-- 1 root root 12 Oct 21 11:04 index.html# 浏览器访问10.0.0.9:8080

[root@web03 /usr/share/tomcat/webapps/ROOT]# vim test.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><HTML>  <HEAD>      <TITLE>随机数JSP Page</TITLE>  </HEAD>  <BODY>      <%          Random rand = new Random();          out.println("<h1>超级牛逼随机数:<h1>");          out.println(rand.nextInt(99)+100);      %>  </BODY></HTML>[root@web03 /usr/share/tomcat/webapps/ROOT]# lltotal 8-rw-r--r-- 1 root root  12 Oct  3 14:55 index.html-rw-r--r-- 1 root root 361 Oct  3 14:59 test.jsp
# 浏览器访问10.0.0.9:8080/test.jsp
c. lb01负载均衡配置调度​​​​​​​
[root@lb01 /etc/nginx/conf.d]# vim proxy_ds.confupstream static_pools {      server 172.16.1.8:80;}upstream java_pools {      server 172.16.1.9:8080;}server {      listen 80;      server_name pic.xxx.com;          location ~* \.(jpg|png|gif)$ {              proxy_pass http://static_pools;              include /etc/nginx/conf.d/proxy_params;      }      location ~ \.jsp {              proxy_pass http://java_pools;              include /etc/nginx/conf.d/proxy_params;      }}# 检查语法,重启nginx[root@lb01 /app/nginx/sbin]# ./nginx -t[root@lb01 /app/nginx/sbin]# ./nginx -s reload# 本地域名解析10.0.0.5 pic.xxx.com#10.0.0.8 pic.xxx.com

通过负载均衡访问动态与静态资源:
动态资源:http://pic.xxx.com/test.jsp

静态资源:http://pic.xxx.com/1.jpg

d. 资源整合:实现在一个页面同时显示动态与静态资源​​​​​​​

# 整合:修改配置文件。在上面配置文件中加入location层:
[root@lb01 /etc/nginx/conf.d]# vim proxy_ds.confupstream static_pools {        server 172.16.1.8:80;}upstream java_pools {        server 172.16.1.9:8080;}server {        listen 80;        server_name pic.xxx.com;                    location / {            #//这里                root /code;                                            index index.html;        }                       location ~* \.(jpg|png|gif)$ {                proxy_pass http://static_pools;                include /etc/nginx/conf.d/proxy_params;        }        location ~ \.jsp {                proxy_pass http://java_pools;                include /etc/nginx/conf.d/proxy_params;        }}
# 创建站点目录,编写整合后的html文件[root@lb01 ~]# mkdir /code[root@web01 /code]# vim index.html<html lang="en"><head>        <meta charset="UTF-8" />        <title>测试ajax和跨域访问</title>        <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script></head><script type="text/javascript">$(document).ready(function(){        $.ajax({        type: "GET",        url: "http://pic.xxx.com/test.jsp",        success: function(data){                $("#get_data").html(data)        },        error: function() {                alert("失败了,回去检查你服务");        }        });});</script>        <body>                <h1>动静分离测试</h1>                <img src="http://pic.xxx.com/1.jpg">                <div id="get_data"></div>        </body></html># 检查语法,重载nginx[root@lb01 /app/nginx/sbin]# ./nginx -t[root@lb01 /app/nginx/sbin]# ./nginx -s reload
# 访问pic.xxx.com

可以尝试关掉静态或者动态服务,测试是否互不影响。​​​​​​​

systemctl stop nginxsystemctl stop tomcat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用pytorch实现卷积形式的ResNet

利用pytorch实现卷积形式的ResNet 1. 导入必需的库2. 定义残差块3. 构建 ResNet 网络4. 实例化网络和训练 要使用 PyTorch 实现卷积形式的 ResNet&#xff08;残差网络&#xff09;&#xff0c;你需要遵循几个主要步骤。首先&#xff0c;让我们概述 ResNet 的基本结构。ResNet …

让 OpenAI GPT4 出 10 道题测试其他开源大语言模型

让 OpenAI GPT4 出 10 道题测试其他开源大语言模型 1. 中文题目及答案2. 日文题目及答案3. 英文题目及答案 1. 中文题目及答案 数学题&#xff1a;一个矩形的长是10厘米&#xff0c;宽是5厘米&#xff0c;求它的面积。 答案&#xff1a;面积 长 x 宽 10厘米 x 5厘米 50平方厘…

金属款超声波风速风向传感器的创新与科技力量

在当今的科技世界中&#xff0c;WX-WQX2S 金属款超声波风速风向传感器以其独特的功能和可靠的性能&#xff0c;引领着气象科技领域的新潮流。这款传感器利用超声波技术&#xff0c;对风速和风向进行高精度测量&#xff0c;为气象学家和环境监测机构提供了强大的工具。 一、金属…

基于STM32单片机的智能家居系统设计(论文+源码)

1.系统设计 基于STM32单片机的智能家居系统设计与实现的具体任务&#xff1a; &#xff08;1&#xff09;可以实现风扇、窗帘、空调、灯光的开关控制&#xff1b; &#xff08;2&#xff09;具有语音识别功能&#xff0c;可以通过语音控制家电&#xff1b; &#xff08;3&a…

图面试专题

一、概念 和二叉树的区别&#xff1a;图可能有环 常见概念 顶点&#xff08;Vertex&#xff09;&#xff1a; 图中的节点或点。边&#xff08;Edge&#xff09;&#xff1a; 顶点之间的连接线&#xff0c;描述节点之间的关系。有向图&#xff08;Directed Graph&#xff09;&…

精密制造ERP系统包含哪些模块?精密制造ERP软件是做什么的

不同种类的精密制造成品有区别化的制造工序、工艺流转、品质标准、生产成本、营销策略等&#xff0c;而多工厂、多仓库、多车间、多部门协同问题却是不少精密制造企业遇到的管理难题。 有些产品结构较为复杂&#xff0c;制造工序繁多&#xff0c;关联业务多&#xff0c;传统的…

spring源码

一、doScan包扫描 流程图 包扫描 protected Set<BeanDefinitionHolder> doScan(String... basePackages) {Assert.notEmpty(basePackages, "At least one base package must be specified");Set<BeanDefinitionHolder> beanDefinitions new LinkedHash…

深度学习实现语义分割算法系统 - 机器视觉 计算机竞赛

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

Python+requests+unittest+excel搭建接口自动化测试框架

一、框架结构&#xff1a; 工程目录 代码&#xff1a;基于python2编写 二、Case文件设计 三、基础包 base 3.1 封装get/post请求&#xff08;runmethon.py&#xff09; import requests import json class RunMethod:def post_main(self,url,data,headerNone):res Noneif h…

电子学会C/C++编程等级考试2022年12月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:鸡兔同笼 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。 时间限制:1000 内存限制:65536输入 一行,一个正整数a (a < 327…

小航助学题库蓝桥杯题库c++选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;

16 暴力求解解最长的斐波那契子序列长度

如果序列x1、x2、x3,...xn满足以下条件&#xff0c;就说他是斐波那契式 n>3 对于所有i2<n,都有xixi1xi2 题目描述&#xff1a;给定一个严格递增的正整数组成的序列A&#xff0c;找到A中最长的斐波那契数列的子序列的长度&#xff0c;如果一个不存在则返回0&#xff1b; …

java中的方法引用和Stream流

知识模块&#xff1a; 一.方法引用a.方法概述b.方法引用格式 二.Stream流1.Stream流概述2.Stream流操作步骤一.方法引用a.方法概述/*方法引用概述&#xff1a;当我们使用已有类中的方法作为Lambda表达式对应的接口中的抽象方法实现我们可以用方法引用来简化Lambda表达式*/impor…

商业5.0:数字化时代的商业变革

随着数字化技术的迅速发展和应用&#xff0c;商业领域正在经历前所未有的变革。商业5.0&#xff0c;作为数字化时代的新概念&#xff0c;旨在探讨商业模式的创新和演变&#xff0c;从1.0到5.0&#xff0c;商业领域经历了从传统到数字化的转变。 一、商业1.0&#xff1a;传统商…

力扣 144.二叉树的前序遍历

目录 1.解题思路2.代码实现2.1获得节点数接口:2.2递归接口:2.3最终实现 1.解题思路 该题要利用前序遍历&#xff0c;将树的值存到数组中&#xff0c;所以在申请空间的时候&#xff0c;我们需要知道要申请多少空间&#xff0c;也就是要知道树到底有多少个结点&#xff0c;因此第…

MATLAB算法实战应用案例精讲-【图像处理】图像识别(补充篇)

目录 知识储备 图像处理中使用到的机器学习方法 监督与无监督学习 无监督机器学习

第十二章 git

Python基础、函数、模块、面向对象、网络和并发编程、数据库和缓存、 前端、django、Flask、tornado、api、git、爬虫、算法和数据结构、Linux、设计题、客观题、其他 第十二章 git 1. 你在公司如何做的协同开发&#xff1f; 在公司进行协同开发时&#xff0c;有效的协作和团…

小航助学题库蓝桥杯题库c++选拔赛(22年1月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;

PHP:js中怎么使用PHP变量,php变量为数组时的处理

方法一&#xff1a;使用内嵌 PHP 脚本标记 1、简单的拼接 使用内嵌的 PHP 脚本标记 <?php ?> 将 PHP 变量 $phpVariable 的值嵌入到 JavaScript 代码中。 <?php $phpVariable "Hello, World!"; ?><script> // 将 PHP 变量的值传递给 JavaS…

ArcGIS制作某村土地利用现状图

1. 根据坐落单位名称属性选择并提取作图数据 (1) 将“作图线状地物”、“作图图班”和“村庄”图层加入ARCGIS&#xff08;右键Layers-Add data&#xff09;&#xff0c;选择相应路径下的文件加载即可。 (2) 按属性来提取作图村庄的地类图班、线状地物和村界文件&#xff08;…