Nginx常见问题

基于端口的虚拟机:

使用端口来区分,浏览器使用域名或ip地址:端口号 访问。

注意:~ 代表自己输入的英文字母。

16、location正则案例

1 #优先级1,精确匹配,根路径
 2 location =/ {
 3  return 400;
 4 }
 5 #优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
 6 location ^~ /av {
 7  root /data/av/;
 8 }
 9 #优先级3,区分大小写的正则匹配,匹配/media*****路径
10 location ~ /media {
11  alias /data/static/;
12 }
13 #优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里 location ~* .*\.(jpg|gif|png|js|css)$ {
14  root /data/av/;
15 }
16 #优先7,通用匹配
17 location / {
18  return 403;
19 }

View Code

17、Nginx怎么做限流?

Nginx限流就是限制用户请求速度,防止服务器受不了,限流算法有以下3种方法:

    1. 正常限制访问频率(正常流量)。
    1. 突发限制访问频率(突发流量)。
    1. 限制并发连接数。

Nginx的限流都是基于漏桶流算法。

正常限制访问频率(正常流量)

  • 限制一个用户发送的请求,设置Nginx多久接收一个请求。
  • Nginx中使用ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率。
1 #定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
2 #绑定限流维度
3 server{
4  location/seckill.html{
5   limit_req zone=zone;
6   proxy_pass http://lj_seckill;
7   }
8 }

View Code

1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。

突发限制访问频率(突发流量)

  • 限制一个用户发送的请求,设置Nginx多久接收一个。
  • 上面的配置一定程度可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量,这时候应该如何进一步处理呢?Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数。我们可以将之前的例子添加burst参数以及nodelay参数。
1 #定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
2 #绑定限流维度
3 server{
4  location/seckill.html{
5   limit_req zone=zone burst=5 nodelay;
6   proxy_pass http://lj_seckill;
7   }
8 }

View Code

这里多了一个 burst=5 nodelay; 多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话Nginx就漏掉不接受你的请求。

限制并发连接数

Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。一个简单的例子如下:

1 http {
 2  limit_conn_zone $binary_remote_addr zone=myip:10m;
 3  limit_conn_zone $server_name zone=myServerName:10m;
 4 }
 5 server {
 6  location / {
 7   limit_conn myip 10;
 8   limit_conn myServerName 100;
 9   rewrite / http://www.lijie.net permanent;
10  }
11 }

View Code

上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。刚才有提到过Nginx是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。

18、漏桶流算法和令牌桶算法?

漏桶算法

漏桶算法是网络世界中流量整形或速率限制时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。也就是我们刚才所讲的情况。漏桶算法提供的机制实际上就是刚才的案例:突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。

令牌桶算法

令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶。

19、为什么要做动静分离

  • Nginx是当下最热的Web容器,网站优化的重要点在于静态化网站,网站静态化的关键点则是是动静分离,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们则根据静态资源的特点将其做缓存操作。
  • 让静态的资源只走静态资源服务器,动态的走动态的服务器。
  • Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
  • 对于静态资源比如图片,js,css等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器tomcat。若用户请求的动态文件,比如servlet、jsp则转发给Tomcat服务器处理,从而实现动静分离。这也是反向代理服务器的一个重要的作用。

20、Nginx怎么做动静分离?

只需要指定路径对应的目录。location/可以使用正则表达式匹配。并指定对应的硬盘中的目录。如下:

1 location /image/ {
2  root /usr/local/static/;
3  autoindex on;
4 }

View Code

21、Nginx负载均衡算法的实现以及策略?

为了避免服务器崩溃,大家会通过负载均衡的方式来分担服务器压力。将对台服务器组成一个集群,当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。Nginx负载均衡实现的策略有以下五种:

轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。

1 upstream backserver {
2  server 192.168.0.12;
3  server 192.168.0.13;
4 }

View Code

权重weight

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

1 upstream backserver {
2  server 192.168.0.12 weight=2;
3  server 192.168.0.13 weight=8;
4 }

View Code

权重越高,在被访问的概率越大,如上例,分别是20%、80%。

ip_hash(IP绑定)

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器, 并且可以有效解决动态网页存在的session共享问题。

fair(第三方插件)

  • 必须安装upstream_fair模块。
  • 对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。

哪个服务器的响应速度快,就将请求分配到那个服务器上。

url_hash(第三方插件)

Original: https://www.cnblogs.com/taojietaoge/p/15271585.html
Author: 涛姐涛哥
Title: Nginx常见问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611987/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 1_Layui

    官网:https://www.layui.com/ 在官网首页, 可以很方便的下载Layui Layui是一款经典模块化前端UI框架, 我们只需要定义简单的HTML,CSS,JS即…

    数据库 2023年6月11日
    093
  • iperf3的使用

    工具/原料 windows系统,iperf 32位和64位; 客户端和服务端的bat文件 方法/步骤 进入文件夹下面,运行”服务端iperf.bat”文件 …

    数据库 2023年6月9日
    075
  • CentOS 7 RabbitMQ 单机部署

    RabbitMQ版本:3.8.5 安装Erlang RabbitMQ的集群基于Erlang的分布式特性实现,所以需要先安装Erlang。 下载yum源配置脚本: curl -#LO…

    数据库 2023年6月9日
    095
  • 版本控制gitlab

    版本控制gitlab 版本控制gitlab 什么是版本控制gitlab gitlab部署 什么是版本控制gitlab GitLab 是一个用于仓库管理系统的开源项目,使用Git作为…

    数据库 2023年6月14日
    088
  • 容器化 | 一文搞定镜像构建方式选型

    作者:安树博 青云科技 PaaS 中间件开发工程师从事 PaaS 中间件服务(Redis/Memcached 等)开发工作,热衷对 NoSQL 数据库领域内技术的学习与研究 官方镜…

    数据库 2023年5月24日
    078
  • Dubbo源码(三)-服务导出(生产者)

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 在了解了Dubbo SPI后,我们来了解下Dubbo服务导出的过程。 Dub…

    数据库 2023年6月11日
    090
  • Java基础十—JavaIO

    CPU指令与内核态、用户态 在操作系统中,CPU负责执行指令,这些指令有些来自应用程序,有些是来自底层系统。有些指令是非常危险的,如清除内存,网络连接等等,如果错误调用的话有可能导…

    数据库 2023年6月6日
    0117
  • innobackupex备份源码解析

    目前MySQL的物理备份大多数采用xtrabackupex进行,其备份过程如下图所示,这里通过解析 xtrabackup 的源码来详细看看其是如何进行备份的,xtrabackup …

    数据库 2023年6月9日
    0105
  • NO.5 MySQL-笔记

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    数据库 2023年5月24日
    086
  • 11、lombok日志记录

    一、添加依赖: org.projectlombok lombok 1.16.18 true 二、改YML: #声明日志配置文件 #日志级别依次为【从高到低】:FATAL > …

    数据库 2023年6月6日
    097
  • MySQL 中如何归档数据

    归档,在 MySQL 中,是一个相对高频的操作。 它通常涉及以下两个操作: [En] It usually involves the following two actions: …

    数据库 2023年5月24日
    090
  • mysql基础语法_曾佳豪

    一、构建数据库、表和数据类型 [En] I. Building databases, tables and data types 1.建库 create database if n…

    数据库 2023年5月24日
    091
  • Java学习-第一部分-第二阶段-第八节:IO流

    IO流 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) IO流体系图 文件 什么是文件 文件.对我们并不陌生,文…

    数据库 2023年6月11日
    093
  • Hibernate 学习笔记

    hibernate(持久化) Hibernate 是数据访问层(Dao层),就是把数据存入到数据库中,称为持久化。Hibernate 对 JDBC 进行了封装,针对数据访问层提出面…

    数据库 2023年6月11日
    073
  • 设计模式六大原则(简单总结)

    一、单一职责原则 通俗来说即一个类只负责一项职责(实现类要职责单一),可以降低类的复杂度,提高系统的可读性、可维护性,降低类修改时对其他功能的影响 二、里氏替换原则 即子类继承父类…

    数据库 2023年6月6日
    064
  • break&continue&return

    作用 1. 跳出整个循环体,进入循环下面的语句 2. 在多层嵌套循环中,break跳出内层循环 3. 可以使用带标签的break语句,跳出外层循环 编码 //break终止循环 p…

    数据库 2023年6月14日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球