没长正的技术专栏 勤动手、多思考

Nginx

2013-05-04

阅读:

2021-10-29 14:18:00 +0000

Nginx

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

下载地址

1. 核心功能

2021-10-29_nginx核心功能项

来源

2. 基本用法

3. 高级用法

3.1 负载均衡

要开始使用 NGINX Plus 或 NGINX Open Source 将 HTTP 流量负载均衡到一组服务器,首先需要使用upstream指令定义组。该指令放置在http上下文中。

=> NGINX 开源支持四种负载均衡方法,NGINX Plus 增加了两种方法:

3.1.1 循环(轮询)

请求在服务器之间均匀分布,并考虑服务器权重。默认情况下使用此方法(没有启用它的指令)

upstream backend {
   # no load balancing method is specified for Round Robin
   server backend1.example.com;
   server backend2.example.com;
}
3.1.2 最少连接

请求被发送到活动连接数最少的服务器,再次考虑服务器权重

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}
3.1.3 IP Hash

请求发送到的服务器由客户端 IP 地址确定。在这种情况下,要么使用 IPv4 地址的前三个八位字节,要么使用整个 IPv6 地址来计算哈希值。该方法保证来自同一地址的请求到达同一服务器,除非它不可用。

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}
如果其中一台服务器需要暂时从负载平衡轮换中移除,则可以使用[down](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#down)参数对其进行标记,以保留客户端 IP 地址的当前散列。由该服务器处理的请求会自动发送到组中的下一个服务器
upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
}
3.1.4 通用哈希

请求发送到的服务器由用户定义的键确定,该键可以是文本字符串、变量或组合。例如,密钥可以是成对的源 IP 地址和端口,或 URI。

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

该指令的可选参数一致hash启用ketama一致性哈希负载平衡。请求根据用户定义的散列键值均匀分布在所有上游服务器上。如果将上游服务器添加到上游组或从上游组中删除,则仅重新映射少数键,从而在负载平衡缓存服务器或其他累积状态的应用程序的情况下最大限度地减少缓存未命中。

3.1.5 最少的时间(NGINX PLUS)

对于每个请求,NGINX加选择具有最低平均延迟和最低数量的活动连接在那里最低的平均等待时间是基于以下哪些计算的服务器的参数least_time指令包括:

  • header – 从服务器接收第一个字节的时间
  • last_byte – 从服务器接收完整响应的时间
  • last_byte inflight – 从服务器接收完整响应的时间,考虑到不完整的请求
upstream backend {
    least_time header;
    server backend1.example.com;
    server backend2.example.com;
}
3.1.6 随机

每个请求都将传递到随机选择的服务器。如果two指定了该参数,首先NGINX会考虑服务器权重随机选择两台服务器,然后使用指定的方法选择其中一台服务器:

  • least_conn – 最少的活动连接数
  • least_time=header(NGINX Plus) – 从服务器接收响应头的最少平均时间 ( $upstream_header_time)
  • least_time=last_byte(NGINX Plus) – 从服务器收到完整响应的最短平均时间 ( $upstream_response_time)

随机负载平衡方法应被用于在多个负载平衡器传递请求到相同组的后端分布式环境。对于负载均衡器可以查看所有请求的环境,请使用其他负载均衡方法,例如循环、最少连接和最少时间。

3.2 Nginx内容缓存

3.2.1 将NGINX和NGINX PLUS 配置为WEB服务器

虚拟服务器由上下文中的server指令定义http

server {
    listen  80;

    server_name  blog.meizhangzheng.com;

    root   /htdocs/blog/dist;

    # 异常处理
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }    
    
    # alias指定的路径是location的别名,不管location的值怎么写,资源的 真实路径都是 alias 指定的路径
     location /api/ {
        alias   /app/af;
    }
    
    # 可指定多个别名
     location /appApi/ {
        alias   /app/app;
    }
}
# /htdocs/blog/dist :服务目录(域名指向的目录)
3.2.2 提供静态内容
3.2.3 反向代理

将 NGINX 配置为 HTTP 和其他协议的反向代理,支持修改请求标头和微调响应缓冲。

请求传递给 HTTP 代理服务器,可以在location 中指定proxy_pass指令

server {
    listen  80;

    server_name  blog.meizhangzheng.com;

    root   /htdocs/blog/dist;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
    # 反向代理
    location ~ /* {
        proxy_pass   http://blog.meizhangzheng.com:10001;
    }
}

# https 配置
server {
    listen 443;

    ssl on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_certificate /root/ssl/meizhangzheng/blog/ssl.pem;
    ssl_certificate_key /root/ssl/meizhangzheng.com/blog/ssl.key;

    server_name  blog.meizhangzheng.com;

    root   /htdocs/blog/dist;

    location ~ /* {
        proxy_pass   http://blog.meizhangzheng.com:10001;
    }
}
3.2.4 压缩和解压
3.2.5 使用Nginx做uWSGI and Django网关

3.3 网络服务

3.4 安全控制

3.5 监控

3.6 高可用性

3.7 动态模块

Lua :可用于限流

local locks = require "resty.lock"

local function acquire()
    local lock =locks:new("locks")
    local elapsed, err =lock:lock("limit_key") --互斥锁
    local limit_counter =ngx.shared.limit_counter --计数器

    local key = "ip:" ..os.time()
    local limit = 5 --限流大小
    local current =limit_counter:get(key)

    if current ~= nil and current + 1> limit then --如果超出限流大小
       lock:unlock()
       return 0
    end
    if current == nil then
       limit_counter:set(key, 1, 1) --第一次需要设置过期时间,设置key的值为1,过期时间为1秒
    else
        limit_counter:incr(key, 1) --第二次开始加1即可
    end
    lock:unlock()
    return 1
end
ngx.print(acquire())

nginx 配置

http {
    ……
    lua_shared_dict locks 10m;
    lua_shared_dict limit_counter 10m;

}

限流:计数器、漏桶、令牌桶 三大算法的原理与实战(史上最全)

分布式限流之Nginx+Lua实现

用Nginx+Lua(OpenResty)开发高性能Web应用

3.8 邮件代理

参考

OpenResty最佳实践

分布式限流之Nginx+Lua实现


欢迎拍砖,多多交流,转载请注明出处:[没长正的技术专栏](http://blog.meizhangzheng.com) 如涉及侵权问题,请发送邮件到xsj34567@163.com,如情况属实本人将会尽快删除。


上一篇 常用Shell命令

下一篇 Python

Comments

Content