• 关于 Nginx 的哪些事


    1、Nginx 主要功能

     

    Nginx主要功能:

    • 正向代理:需要在客户端配置代理服务器,进行指定网站访问。

    • 反向代理:反向代理是Nginx的常见功能之一。当客户端向服务器发送请求时,首先经过Nginx服务器,然后Nginx将请求转发给内部的Web服务器。这种代理方式使得外部网络无法直接访问内部的Web服务器,提高了安全性。

    • 负载均衡:它将网络流量分担到多个网络节点上,并行处理请求,从而提高网络系统的处理能力,减少前端用户等待响应的时间。

    • 动静分离:将动态网页和静态页面分开处理。通过动静分离,Nginx可以充分利用其高并发、高性能的特点,同时减轻后端服务器的负载,提高网站的访问速度和可维护性。

     

    2、Nginx 的常用命令

     

    2.1、启动Nginx

     

    # 首先进入 Nginx 目录 (一般在该目录,具体根据实际安装情况而定)
    cd /usr/local/nginx
    # 启动 Nginx
    ./sbin/nginx
    
    # 或者直接执行
    /usr/local/nginx/sbin/nginx
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

     

    2.2、停止 Nginx

     

    # 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
    cd /usr/local/nginx
    # 停止 Nginx
    ./sbin/nginx -s stop
    # 或者在 Nginx 目录执行
    ./sbin/nginx -s quit
    
    # 或者直接执行
    /usr/local/nginx/sbin/nginx -s stop
    # 或
    /usr/local/nginx/sbin/nginx -s quit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

     

    2.3、重新加载Nginx 配置

     

    # 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
    cd /usr/local/nginx
    # 重新加载Nginx 配置
    ./sbin/nginx -s reload
    
    • 1
    • 2
    • 3
    • 4

     

    2.4、检查Nginx配置文件

     

    # 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
    cd /usr/local/nginx
    # 检查Nginx配置文件是否正确
    ./sbin/nginx -t
    
    • 1
    • 2
    • 3
    • 4

     

    2.5、指定配置文件

     

    # 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
    cd /usr/local/nginx
    # 指定配置文件:在命令行中添加 -c 参数。例如:
    ./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    
    • 1
    • 2
    • 3
    • 4

     

    2.6、检查Nginx版本

     

    # 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
    cd /usr/local/nginx
    # 检查Nginx版本
    ./sbin/nginx -V
    # 或者在Nginx目录中执行
    ./sbin/nginx -v
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

     

    2.7、显示Nginx帮助信息

     

    # 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
    cd /usr/local/nginx
    # 显示Nginx帮助信息
    ./sbin/nginx -h
    
    • 1
    • 2
    • 3
    • 4

     

    3、Nginx 配置文件 nginx.conf

     

           Nginx 配置文件路径,一般在 /etc/nginx/nginx.conf/usr/local/nginx/conf/nginx.conf

     

    3.1、Nginx 配置文件(nginx.conf)组成部分

     

    • ① 全局块:从配置文件开始到events块之间的内容,主要设置一些影响nginx服务器整体运行的配置命令,如worker_processes、worker_processes值等。

    • ② events块:主要配置Nginx服务器与用户的网络连接,包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接等。

    • ③ http块:这是Nginx服务器配置中最频繁的部分,包括http全局块、server块等。http全局块配置指令包括文件引入、MIME-TYPE定义、日志定义、连接超时时间、单链接请求数上限等。

    此外,Nginx还支持对stream和server块的配置,stream块用于配置HTTP和SMTP代理服务器的代理设置,server块用于配置虚拟主机的设置。

     

    3.2、Nginx 配置文件(nginx.conf)示例

     

    # 指定Nginx服务器的用户
    user  nginx;  
    # 指定Nginx服务器的工作进程数。
    worker_processes  1;  
    # 指定错误日志存放路径  
    error_log  /var/log/nginx/error.log;  
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    # 指定Nginx进程的存放路径。
    pid        /var/run/nginx.pid;  
      
    events {  
        # 指定每个worker process的最大连接数
        worker_connections  1024;  
        # 指定Nginx服务器的工作进程数。
        # worker_processes 20;
        # 指定是否允许一个worker process同时接收多个网络连接。
        multi_accept on;  
    }  
      
    http {  
        include       /etc/nginx/mime.types;  
        default_type  application/octet-stream;  
        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  /var/log/nginx/access.log  main;  
      
        sendfile        on;  
        tcp_nopush     on;  
        tcp_nodelay    on;  
        keepalive_timeout  65;  
        types_hash_max_size 2048;  
        # gzip:开启gzip压缩,减少传输数据量。
        # gzip  on;
      
        # 该 server 配置了Nginx作为反向代理服务器,
        # 将所有以example.com为域名的HTTP请求转发到192.168.1.100:8080的目标服务器。
        server {  
            # listen:指定Nginx监听的端口号。例如,listen 80,表示Nginx将监听80端口。
            listen 80;  
            # server_name:指定服务器名称,可以是一个域名或多个域名。
            # 指定Nginx要代理的域名,表示Nginx将代理example.com域名的请求。
            server_name example.com;  
            
            # charset:设置字符集。
            # charset koi8-r;
            
            # access_log  logs/host.access.log  main;
            
            # 指定要代理的请求路径。例,location / { ... }表示Nginx将对所有请求进行代理
            # location /:匹配所有以该主机名开头的URL路径。
            location / {  
                # 指定代理的目标服务器。
                # 这里指Nginx将所有请求代理到192.168.1.100:8080的目标服务器。
                proxy_pass http://192.168.1.100:8080;  
                # index:指定默认页面,可以是index.html、index.htm或index.nginx-debian.html。
                # index  index.html index.htm;
                
                # try_files:用于尝试访问本地文件或定义的其他动作,如重定向、返回特定状态码等。
                # try_files $uri $uri/ /index.html;
            }  
            
            # error_page:指定错误页面,用于处理特定错误码的页面。
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
           
            # error_page:指定错误页面,用于处理特定错误码的页面。
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }  
        # 该server段落,配置了Nginx作为反向代理和HTTPS代理服务器。
        # 这里将所有以example.com为域名的HTTPS请求,转发到192.168.1.100:8080的目标服务器,     # 并使用SSL证书进行加密传输。
        server {  
            # listen:指定Nginx监听的端口号。
            listen 443 ssl;  
            # server_name:指定服务器名称,可以是一个域名或多个域名。
            # 指定Nginx要代理的域名,表示Nginx将代理example.com域名的请求。
            server_name example.com;  
            # ssl_certificate:指定SSL证书的路径。
            # 这里表示Nginx将使用位于/etc/nginx/ssl/nginx.crt的SSL证书。
            ssl_certificate /etc/nginx/ssl/nginx.crt;  
            ssl_certificate_key /etc/nginx/ssl/nginx.key;  
            
            # ssl_session_cache    shared:SSL:1m;
            # ssl_session_timeout  5m;
     
            # ssl_ciphers  HIGH:!aNULL:!MD5;
            # ssl_prefer_server_ciphers  on;
            
            # location 用于匹配特定URL,并定义相应的代理规则或静态文件路径。
            location / {  
                # proxy_pass:定义反向代理规则。
                proxy_pass http://192.168.1.100:8080;  
            }  
        }  
        
        
        # 
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        # index:指定默认页面,可以是index.html、index.htm或index.nginx-debian.html。
        #        index  index.html index.htm;
        #    }
        #}
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139

     

    4、反向代理

     

    4.1、简单示例

     

           在下面示例中,Nginx作为反向代理服务器,将所有以example.com为域名的HTTP请求转发到192.168.1.100:8080的目标服务器。同时,通过proxy_set_header指令设置了一些必要的请求头信息,以便目标服务器正确地处理请求。该示例仅适用于HTTP协议的代理配置。

     

    server {  
        listen 80;  
        server_name example.com;  
        # location /:匹配所有以该主机名开头的URL路径。
        location / {  
            proxy_pass http://192.168.1.100:8080;  
            proxy_set_header Host $host;  
            proxy_set_header X-Real-IP $remote_addr;  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

     

    注意:目标服务器,需要对外开放访问的端口

    # 以下是基于 CentOS7 版本的防火墙相关命令。
    
    # 查看防火墙状态
    firewall-cmd --state
    
    # 如果防火墙处于关闭状态,先启动它
    systemctl start firewalld.service
    
    # 防火墙开放8080 端口号
    firewall-cmd --add-port=8080/tcp --permanent
    
    # 重启防火墙以使更改生效
    systemctl restart firewalld.service
    
    # 重新加载防火墙配置
    firewall-cmd –reload
    
    # 查看已经开放的端口号
    firewall-cmd --list-all
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

     

    4.2、location 语法

     
            在NGINX中,location指令用于定义请求匹配的URL路径和相应的配置。它是在NGINX配置文件中的server块内使用的。下面是location指令的基本语法:
     

    location [=|~|~*|^~] /path {  
        # 配置指令  
    }
    
    # 说明:
    =   :表示完全匹配指定的路径。
    ~   :表示使用正则表达式匹配路径。
    ~*  :表示不区分大小写的正则表达式匹配路径。
    ^~  :表示前缀匹配路径,但不使用正则表达式。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

     
    location 匹配优先级:
    = 大于 ^~ 大于 ~ | ~* 大于 最长前缀匹配 大于 /

     

    4.2.1、精准匹配(=)

     

    精准匹配的符号标记为“=”,示例:

    # 如果请求URI和精准匹配的模式字符串/api完全相同,那么精准匹配通过.
    # 在所有的匹配类型中,精准匹配的优先级最高.
    location = /api {
        proxy_pass http://192.168.1.100:8080;  
    }
    
    # 假设 server_name example.com;  
    # 只匹配http://example.com/abc
    # http://example.com/api [匹配成功]
    # http://example.com/api/index [匹配失败]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

     

    4.2.2、普通匹配(^~)

     
    普通匹配的符号标记为“~”,普通匹配是前缀匹配,也是Nginx默认的匹配类型。类型符号“~”可以省略,如果location没有任何匹配类型,就为普通的前缀匹配。示例:

    # 普通匹配:如果请求路径URI头部,匹配到location的模式字符串,那么匹配成功。
    # 如果匹配到多个前缀,那么最长模式匹配优先
    # 匹配以"/api/"开头的所有请求
    location ^~ /api/ {
      proxy_pass http://192.168.1.100:8080;  
    }
    
    location ^~ /api/demo {
      proxy_pass http://192.168.1.101:8081;  
    }
    
    # 假设 server_name example.com;  
    #以 /api/ 开头的请求,都会匹配上
    #http://example.com/api/index.page  [匹配成功]
    #http://example.com/error/error.page [匹配失败]
    
    # 以上 http://example.com/api/demo/index.page 请求  [匹配成功] 
    # 且 http://example.com/api/demo/index.page 请求,优先匹配目标:http://192.168.1.101:8081
    
    
    location ^~ /api/ {
      proxy_pass http://192.168.1.100:8080;  
    }
    # 等同于
    location /api/ {
      proxy_pass http://192.168.1.100:8080;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

     

    4.2.3、正则匹配(~)

     

    正则匹配的类型,根据类型符号的不同,可以细分为以下4种 :

    • ~:标准正则匹配,区分字母大小写,进行正则表达式测试,若测试成功,则匹配成功。

    • ~*:标准正则匹配,不区分字母大小写,进行正则表达式测试,若测试成功,则匹配成功。

    • !~:反向正则匹配,区分字母大小写,进行正则表达式测试,若测试不成功,则匹配成功。

    • !~*:反向正则匹配,不区分字母大小写,进行正则表达式测试,若测试不成功,则匹配成功。

     

    # ~ :区分字母大小写
    location ~ /Api/ {
      proxy_pass http://192.168.1.100:8080;  
    }
    # 假设 server_name example.com; 
    #http://example.com/Api/ [匹配成功]
    #http://example.com/api/ [匹配失败]
    
    
    # ~* :不区分字母大小写
    location ~* /Api/ {
      proxy_pass http://192.168.1.100:8080;  
    }
    # 假设 server_name example.com; 
    # 则会忽略 uri 部分的大小写
    #http://example.com/Api/ [匹配成功]
    #http://example.com/api/ [匹配成功]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4.2.4、默认根路径匹配(/)

     
    根路径的路径规则就是使用单个“/”符号,示例:
     

    # 匹配所有以该主机名开头的URL路径。
    location  /  {
        proxy_pass http://192.168.1.100:8080; 
    }
    
    • 1
    • 2
    • 3
    • 4

    4.2.5、nginx内部跳转(@)

     

    location /index/ {
      error_page 404 @index_error;
    }
    location @index_error {
      .....
    }
    #以 /index/ 开头的请求,如果链接的状态为 404。则会匹配到 @index_error 这条规则上。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

     

    4.2.6、location URI结尾带不带 /

     

            在 Nginx 中,location指令用于匹配请求的 URL,并根据匹配的结果来配置相应的代理、重定向、静态文件服务等操作。在 location指令中,URL最后是否带有斜杠(/)会对匹配的结果产生一些区别。浏览器在发起请求的时候,默认加上了 / 。虽然很多浏览器在地址栏里也不会显示 /

    1. URL最后带有斜杠(/):
      • 当 URL 以斜杠结尾时,location指令会精确匹配该 URL。例如,如果配置了location /foo/,则只有请求的 URL 为 /foo/ 时才会匹配,但不匹配 /foo/foo123 等。
      • 如果请求的 URL 是 /foo/bar,则不会匹配 location /foo/,因为最后有一个额外的路径片段(bar)。
      • 如果需要匹配以foo结尾的所有 URL,包括/foo//foo/bar等,可以使用正则表达式,例如location ~ ^/foo/$
    2. URL最后没有斜杠(/):
      • 当 URL 不以斜杠结尾时,location指令会匹配以该 URL 为前缀的所有 URL。例如,如果配置了location /foo,则请求的 URL 为/foo/foobar/foo/bar等以/foo为前缀的 URL 都会匹配。
      • 如果请求的 URL 是/foo/bar,则会匹配location /foo,因为/foo是该 URL 的前缀。

     
            总结起来,是否在 location指令的 URL 最后加上斜杠,决定了是精确匹配还是前缀匹配。具体使用哪种方式取决于你的需求,如果需要精确匹配某个 URL,可以使用斜杠结尾;如果需要匹配某个前缀的所有 URL,则可以去掉斜杠。

     

    5、负载均衡

     

    5.1、简单示例

     

    # 使用 upstream 块定义了一个名为 backend 的后端服务器组。
    # 在该后端服务器组中,列出了三个后端服务器 
    # 192.168.1.100:8080、192.168.1.101:8081 和 192.168.1.102:8082
    upstream backend {  
        server 192.168.1.100:8080;  
        server 192.168.1.101:8081;  
        server 192.168.1.102:8082;  
    }  
      
    server {  
        listen 80;  
        server_name example.com;  
      
        location / {  
            proxy_pass http://backend;  
            # 在这里配置其他相关的反向代理设置  
        }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

     

    5.2、常用负载均衡策略

     
    以下是几种常见的策略:轮询、权重、IP哈希、最少连接。

     

    5.2.1、轮询

     
            轮询(Round Robin):每个请求按时间顺序逐一分配到不同的后端服务器。如果后端服务器down掉,Nginx会自动剔除该服务器。
     

    # 默认采用轮询策略,示例:
    upstream backserver {  
        server 192.168.0.14;  
        server 192.168.0.15;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

     

    5.2.2、权重轮询

     
            权重轮询(Weighted Round Robin):在轮询策略的基础上,指定每个后端服务器的轮询几率,权重值越高的服务器被选择的可能性就越大。
     

    # 使用示例:
    upstream backserver {  
        server 192.168.0.14 weight=2;  
        server 192.168.0.15 weight=1;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

     

    5.2.3、IP哈希

     
            IP哈希(IP Hash):指定负载均衡器按照基于客户端IP的分配方式。这个方法确保了相同的客户端的请求一直发送到相同的后端服务器,以保持会话一致性。
     

    # 使用示例:
    upstream backserver {  
        ip_hash;  
        server 192.168.0.14;  
        server 192.168.0.15;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

     

    5.2.4、最少连接

     
            最少连接(Least Connections):把请求转发给连接数最少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。使用最少连接策略可以更好地平衡负载。
     

    # 使用示例:
    upstream backserver {  
        least_conn;  
        server 192.168.0.14;  
        server 192.168.0.15;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

     

    6、动静分离

     

    Nginx 的动静分离,是指将动态请求和静态请求,分发到不同的后端处理。

    动态请求通常需要与数据库等进行交互,处理逻辑较为复杂。而静态请求,则是指只需要直接返回静态文件或资源的请求,处理速度较快。

    通过动静分离,可以将动态请求交给专门的动态服务器处理,而静态请求则可以由更高效的静态服务器处理,从而提高整体的处理性能和响应速度。

     

    server {  
        listen 80;  
        server_name example.com;  
      
        # 动态请求
        location /dynamic {  
           proxy_pass http://dynamic_server;
        }
      
        location /css {  
            # root指令用于指定静态文件的根目录
            root /path/to/css;  
        }  
      
        location /js {  
             # root指令用于指定静态文件的根目录
            root /path/to/js;  
        }  
        
        # 页面访问方式一:
        location /front {
             root /data;
             index index.html;
        }
        
        # 页面访问方式二:
        location /web {
             alias /data/front;
             index index.html;
        }
    
        # 图片访问方式一:
        location /static {
            root /data/front; 
        }
        
        # 图片访问方式二:
        location /photo {
            alias /data/front/static;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

     

    注意:aliasroot指令都是用于指定文件路径的,但它们的使用方式和效果有所不同。

    alias指令用于指定匹配的URL段对应的文件或目录的路径。当请求的URL匹配location块中配置的URL段时,NGINX会将其重定向到alias指令指定的路径下对应的文件或目录。这意味着请求的URL将会发生变化,从原来的URL变为新的URL。

    例如,下面的配置将请求的URL为/images/example.jpg重定向到/var/www/html/images/example.jpg

    location /images {  
        alias /var/www/html/images;  
    }
    
    • 1
    • 2
    • 3

     

    root指令则是指定最上层目录的定义,它不会改变请求的URL。当请求的URL匹配location块中配置的URL段时,NGINX会在指定的目录下查找对应的文件。

    例如,下面的配置将请求的URL为/images/example.jpg映射到/var/www/html/images/example.jpg

    location /images {  
        root /var/www/html;  
    }
    
    • 1
    • 2
    • 3

     

    7、Nginx 限流

     

    nginx可以通过以下方式实现限流:基于IP限流、基于URL限流、基于时间限流。
     

    7.1、基于IP限流

     
            基于IP的限流,可以有效地控制每个IP地址的请求频率和请求数,有助于防止恶意攻击和保护服务器的性能。

            需要注意的是,限流区域的配置和限流指令的应用,需要根据实际需求进行调整和优化。
     
    示例配置:

    # 创建限流区域one,限制每个IP的请求频率为1次/秒
    # $binary_remote_addr 是用于存储限流信息的共享内存名称,使用了10MB的共享内存
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  
    # 创建限流区域two,限制每个IP的请求频率为2次/秒
    limit_req_zone $binary_remote_addr zone=two:10m rate=2r/s;  
      
    server {  
        location / {  
            # 使用limit_req指令,指定使用one限流区域
            # 设置burst参数为1,表示允许每个IP在突发情况下最多多发送一个请求。
            limit_req zone=one burst=1;  
            ...  
        }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

     

    • 限流算法:

      • nginx的限流算法使用了漏桶算法。

      • 当请求到达时,会先检查对应的限流桶中的请求数量是否已经达到限制速率。

      • 如果未达到限制速率,则允许请求通过,并在限流桶中增加一个请求。

      • 如果达到限制速率,则需要检查是否允许突发请求。

        • 如果允许突发请求,则允许请求通过,并在限流桶中增加一个请求,同时记录突发请求数;

        • 如果不允许突发请求,则直接拒绝请求。

     

    7.2、基于URL限流

     
            基于URL的限流,可以有效地控制每个URL的请求频率和请求数,有助于保护服务器的性能和防止滥用。

            基于URL的限流方式,适用于限制某些频繁访问的URL,或者限制对某些重要接口的请求频率,以保护服务器资源或者控制某些URL的使用。

            需要注意的是,限流区域的配置和限流指令的应用,需要根据实际需求进行调整和优化。

    示例配置:

    # 实现基于URL的限流,要先配置限流区域 limit_req_zone,限流区域是一个存储URL和相关统计信息的缓存区。
    # $uri 用于存储限流信息的共享内存名称,这里创建了一个名为one的限流区域,使用了10MB的共享内存。
    # rate 是每个URL的请求限制速率,这里限制了每个URL的请求频率为1次/秒。
    limit_req_zone $uri zone=one:10m rate=1r/s;
    
    location /api/ {  
        # 针对/api/路径进行限流,limit_req指令来指定使用限流区域为one
        # burst参数为10,表示允许每个URL在突发情况下最多多发送10个请求。
        limit_req zone=one burst=10;  
        ...  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

     

    • 限流算法:
      • nginx的限流算法使用了漏桶算法。
      • 当请求到达时,会先检查对应的限流桶中的请求数量,是否已经达到限制速率。
      • 如果未达到限制速率,则允许请求通过,并在限流桶中增加一个请求。
      • 如果达到限制速率,则需要检查是否允许突发请求。
        • 如果允许突发请求,则允许请求通过,并在限流桶中增加一个请求,同时记录突发请求数;
        • 如果不允许突发请求,则直接拒绝请求。

     
     
     
     
     
     
     
     
    .

  • 相关阅读:
    智慧能源方案:TSINGSEE青犀AI算法中台在能源行业的应用
    队列(JAVA)
    软件测试工作的目的和原则是什么?
    DCloud之APP离线SDK升级步骤(3.5.3升至最新版3.6.7.81556_20221018)
    机器学习【逻辑回归算法】
    PyTorch相关笔记(不断补充)
    零代码使用air32做USB转串口
    C语言学习笔记(十七)
    【笔试题】位运算
    9.14-广读最新研究方向论文核心思路汇总
  • 原文地址:https://blog.csdn.net/weixin_41922349/article/details/132706506