Nginx 动静分离

2023-11-03

1、nginx 与 tomcat 处理静态资源区别:

tomcat静态资源请求量为每秒1000次,则nginx静态资源请求量为每秒6000次,tomcat每秒的吞吐量为0.6M,nginx的每秒吞吐量为3.6M,可以说,nginx处理静态资源的能力是tomcat处理能力的6倍

2、动静分离原理:

服务端接收来自客户端的请求中,有一部分是静态资源的请求,例如html,css,js和图片资源等等,有一部分是动态数据的请求。
因为tomcat处理静态资源的速度比较慢,所以我们可以考虑把所有静态资源独立开来,交给处理静态资源更快的服务器例如nginx处理,而把动态请求交给tomcat处理。
如下图所示,我们在机器上同时安装了nginx和tomcat,把所有的静态资源都放置在nginx的webroot目录下面,把动态请求的程序都放在tomcat的webroot目录下面,
当客户端访问服务端的时候,如果是静态资源的请求,就直接到nginx的webroot目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给tomcat进行处理,这样就实现了动静分离,提高了服务器处理请求的性能。

3、结构示意图:

4、 nginx 实例配置:

#Nginx.conf
user  caogen;
worker_processes  1; #因为我用的是虚拟机 只设置了1CPU

error_log  logs/nginx_error.log  error;
error_log  logs/nginx_info.log   info;

pid        logs/nginx.pid;
worker_rlimit_nofile 51200; #更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。

events {
    use epoll; #nginx工作模式,epoll是linux平台下的高效模式,配合nginx的异步非阻塞作用
    worker_connections  51200; #定义nginx每个进程的最大连接书为51200,一般网上都配置65535.
    accept_mutex on;    #设置网络连接的序列化,当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是惊群问题。更详细的解释http://huoding.com/2013/08/24/281
    multi_accept on;    #设置worker_poocess是否允许同时接受多个网络连接,默认一个worker一次只接受一个新连接,multi_accept设置为on后能接受多个,有利于性能提升
    }


    http {
        include       mime.types; #nginx通过服务端文件的后缀名来判断这个文件属于什么类型,再将该数据类型写入http头部的Content-Type字段中,发送给客户端。mime.types这个文件里面全是文件类型的定义。
        default_type  application/octet-stream; #当用户请求的文件后缀在mime.types这个文件没有定义,便使用默认的type为二进制流
        include /usr/local/nginx/conf/proxy.conf;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on; #开启高效文件传输模式
    tcp_nopush     on;  #启用之后,数据包会累积到一定大小才会发送,减小了额外开销,防止网络阻塞,提高网络效率
    tcp_nodelay  on;    #启用之后,尽快发送数据。
    #可以看到tcp_nopush是要等数据包累积到一定大小才发送,tcp_nodelay是要尽快发送,二者相互矛盾。实际上,它们可以一起用,最终的效果是先填满包,再尽快发送。

    keepalive_timeout  65;

    #gzip  on;
    include /usr/local/nginx/conf/gzip.conf;

    #开启负载均衡的服务器组
    upstream caogen_proxy{
        ip_hash; #每个请求按照ip的hash结果分配,同一个ip的访客固定访问一个后端服务器
        server 192.168.88.130:8081;
        server 192.168.1.130:8085;
    }

    #禁止通过Ip访问
    server{
    server_name _:
    return 404;
    }

    server {
        listen       80;
        server_name  localhost 127.0.0.1 192.168.88.130;
        charset utf-8;
        #access_log  logs/host.access.log  main;

    #动静分离  静态文件交给nginx处理  动态交给tomcat    
    #location ~ .*\.(gif|jpg|jpeg|png|js|css)$ {  
    #   root /usr/local/nginx/staticFiles/;
    #   expires 1h; #缓存一小时
    #}

    location ~ ^/(images|js|css)/ {
        root /usr/local/nginx/staticFiles/;
        expires 1h;
    }

        location / {
            #root   html;
            #index  index.html index.htm;
            #proxy_pass http://localhost:8081;
            proxy_pass http://caogen_proxy;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

代理配置说明:

# proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #获取真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #获取代理服务器的ip和客户的真实ip
client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 300;         #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 300;            #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 300;            #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 64k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers   32 32k;            #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 128k;      #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 128k;   #设定缓存文件夹大小,大于这个值,将从upstream服务器传

压缩配置说明:

gzip on;  #开启gzip  默认关闭
gzip_buffers 16 8k; #这是默认的设置
gzip_comp_level 1;  #gzip的压缩程度,级别为1到9.级别越高,压缩程序越高,时间越多
gzip_min_length 1k; #gzip压缩功能对大数据压缩效果明显,对小数据有时候会出现越压缩数据越大的情况,所以设置当字节数大于多少的时候才开启压缩,我设置为1kb,默认设置为20kb
gzip_types  text/plain application/x-javascript text/css application/xml application/javascript;    #压缩的常规文件类型
gzip_vary on; #告诉接受方数据经过gzip压缩
gzip_disable "MSIE[1-6]\."; #因为IE6对gzip不支持,所以在IE6及更旧的版本不使用gzip压缩

注意以上我注释掉的一段动静分离的配置:

#动静分离  静态文件交给nginx处理  动态交给tomcat    
#location ~ .*\.(gif|jpg|jpeg|png|js|css)$ {  
#   root /usr/local/nginx/staticFiles/;
#   expires 1h; #缓存一小时
#}

因为网站的图片分两种,一种图片上作为css而产生的,一种图片上用户动态上传的,作为css的图片上放在项目的images文件夹里,用户上传的图片放在一个文件服务器里面,注释的配置是所有gif,jpg……等类型为后缀的url都会被nginx处理,如果在/usr/local/nginx/staticFiles/文件夹里没有图片,nginx则会返回404。/usr/local/nginx/staticFiles/这个文件夹只存放了js,css和css的图片。所以用户上传的图片都无法查看。


调整后的动静分离配置:

 location ~ ^/(images|js|css)/ {
    root /usr/local/nginx/staticFiles/;
    expires 1h;
}

仅仅存储静态图片资源或者是css 样式文件中引入的静态图片资源

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx 动静分离 的相关文章

  • RabbitMQ之延迟队列

    RabbitMQ之延迟队列 1 延迟队列概念 2 延迟队列使用场景 3 RabbitMQ 中的 TTL 3 1 消息设置 TTL 3 2 队列设置 TTL 3 3 两者的区别 4 整合 SpringBoot 4 1 创建项目 4 2 添加依
  • 深入解析C/C++的优缺点以及就业方向

    众所周知C C Java Python都是主流的后端开发语言 并且不同的语言 具备不同的优缺点以及就业方向 解析来小编带你一起看看C C 的优缺点以及就业方向 深入解析C C 的优缺点以及就业方向 C语言是很多语言的鼻祖 所以学会C语言 非
  • Welcome to Level 3 (不容易啊...记下啦^_@)

    Welcome to Level 3 Hey clin003 Congratulations Don t forget to check your Mod X ranking and access the level 3 forum to
  • 结合入栈出栈浅谈前序遍历,中序遍历,后序遍历

    二叉树深度遍历 讨巧应付面试 以前其实也懂什么叫二叉树的前中后序遍历 反正面试的时候 给我一个二叉树 我是知道怎么写出他们的答案的 例如如下二叉树 前序遍历 A B D E C F G 中序遍历 D B E A F C G 后序遍历 D E
  • Infinite Fraction Path【HDU-6223】【BFS+剪枝】

    题目链接 训练赛的时候 想到的做法是倍增维护 因为每个点的后继是唯一的 然后又因为不会桶排 所以的复杂度是一定会TLE的 难受 听说桶排还是会被卡 大雾 然后下来补题的时候听了队友的意见 其实比赛的时候就应该多听听 也许就能想到这个bfs了
  • 某返利网站admin目录index.php文件混淆加密算法分析

    恢复内容开始 文件已经加密 可以在此下载 index php 文件内容打开大概如此 简单字符替换之后 发现字符串用base64 decode仍无法解码 找到一个解码网站 找源码 解码后的文件如下 下载地址 尾部仍然有大量未知编码内容 简单修

随机推荐

  • IP协议的服务类型(翻译RFC 1349)

    目录 1 简介 2 目标和理念 3 服务八位字节类型规范 4 TOS字段的规范 5 Internet协议中TOS字段的使用 5 1 Internet控制消息协议 ICMP 5 2传输协议 5 3应用协议 6 ICMP和TOS字段 6 1无法
  • 圆投影匹配算法描述及实现

    解决模板图和基准图之间存在任意角度旋转的景象匹配问题的关键是找到一个旋转不变量 圆投影匹配算法就是利用 圆 的各向同性和投影特征提出来的 传统的图像匹配算法 如归一化交叉互相关算法 主要利用像素点与像素点之间的相关性计算匹配图像与模板之间的
  • 数据结构day4

    https note youdao com s SwyFfOgRhttps note youdao com s SwyFfOgR 学生管理系统 头文件 ifndef STULIST H define STULIST H include
  • Qt布局的使用

    1 控件的sizePolicy设置了Fixed 再一点击设置布局 控件的大小又自动调整了 解决方法 设置布局后 再手动调整控件大小 2 在要布局的部件上 右键 gt Lay out 如果该部件不支持布局 则右键菜单中不会出现 Lay out
  • Hadoop学习——MapReduce的job机制和job链介绍

    前边写了MapReduce的介绍 以及四大组件 序列化机制和排序 这一篇记录一下MapReduce相关的job机制 对于在代码里 我们总要有一个Driver 比如下边 public static void main String args
  • ORA-01075,ORA-09925 Read-only file system问题一例

    OEL 5 7 ORACLE RAC 11 2 0 2 在运行过程中系统监控台出现journal commit I O error的信息 SQL gt oradebug Message from syslogd at Fri Oct 14
  • java 远程接口_java中如何正确的使用远程接口

    服务器必须包含一个扩展了UnicastRemoteObject的类 并实现远程接口 这个类也可以含有附加的方法 但客户只能使用远程接口中的方法 这是显然的 因为客户得到的只是指向接口的一个句柄 而非实现它的那个类 必须为远程对象明确定义构建
  • JVM 内存模型

    内存划分 java虚拟机按照运行时内存使用区域划分如图 区域 是否线程共享 是否会内存溢出 程序计数器 否 不会 java虚拟机栈 否 会 本地方法栈 否 会 堆 是 会 方法区 是 会 一 程序计数器 Program Counter Re
  • Qt中的 connect 函数

    1 connect 函数实现的是信号与槽的关联 注意 只有QO bject类及其派生的类才能使用信号和槽的机制 2 函数原型 static QMetaObject Connection connect const QObject sende
  • Qt中信号槽的连接方式

    Qt AutoConnection 如果信号发送者和接收者在同一线程 Qt DirectConnection被使用 否则Qt QueuedConnection被使用 Qt DirectConnection 信号发送 信号槽立刻执行 Qt Q
  • scheduler Unhealthy Get “http://127.0.0.1:10251/healthz“: dial tcp 127.0.0.1:10251: con

    解决方法 cd etc kubernetes manifest 然后将你的scheduler以及controll manager yaml中把port 0注释掉 containers command kube scheduler authe
  • gitlab如何创建用户并登录

    为了大家后期能方便创建用户和使用gitlab 先给大家设置为中文 设置为中文后保存然后刷新页面即可设置为中文 接下来教大家怎么创建git用户并进行登录 创建完用户后需要配置一次密码 配置完密码后退出用户测试进行新用户登录 这里用刚创建的新用
  • SpringBoot项目jar、war包启动解析

    一 jar包和war包的区别 1 1 war包 war包是Java Web应用程序的一种打包方式符合Servlet标准 它是Web Archive的缩写 主要用于存储Web应用程序相关的文件 包括Java类文件 JSP HTML CSS J
  • 动手实现Linux内核编译与安装

    Linux内核是一个用C语言写成的 符合POSIX标准的类Unix操作系统 内核是操作系统中最基本的一部分 提供了众多应用程序访问计算机硬件的机制 Linux内核的一大特点就是采用了整体式结构 有很多过程组成 每个过程都可以独立编译 其模块
  • C++ 好用的包管理工具--vcpkg

    背景 Windows 下开发 C C 程序 少不了编译开源的第三方库 使用这些库开发极大的方便了程序员 使得我们不必重复造轮子 由于开源库绝大部分都来源于 Linux 系统 将其移植到 Windows 的 VC 开发环境下编译比较复杂和麻烦
  • vite运行项目报错events.js:352 throw er; // Unhandled ‘error‘ event

    解决方法 运行命令 node node modules esbuild install js 启动项目 npm run dev
  • 图-文多模态,大模型,预训练

    参考老师的无敌课程 多模态任务是指需要同时处理两种或多种不同类型的数据 如图像 文本 音频等 的任务 例如 图像描述 image captioning 就是一种典型的多模态任务 它需要根据给定的图像生成相应的文本描述 多模态任务在人工智能领
  • 把url里的query参数转成对象格式

    const urlString http www xxx com name tom age 18 height 180 1 拿到 后的那部分 const queryString urlString split console log que
  • 详解10M/100M/1000M以太网接口物理层一致性测试

    以太网的起源与发展 1972年Metcalf与他在XeroxPARC的同事们 在研究如何将XeroxAltos工作站与其他XeroxAltos工作站 服务器以及激光打印机相互联网 他们成功地用一个网络实现了2 94Mb s的数据传输率的互联
  • Nginx 动静分离

    1 nginx 与 tomcat 处理静态资源区别 tomcat静态资源请求量为每秒1000次 则nginx静态资源请求量为每秒6000次 tomcat每秒的吞吐量为0 6M nginx的每秒吞吐量为3 6M 可以说 nginx处理静态资源