Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
1. 核心功能
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;
}
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(OpenResty)开发高性能Web应用