Nginx配置模块梳理
- 架构
- nginx.conf
- 邮箱服务
- 代理
- 负载均衡(策略):
- 容错
- 限流
- 日志
- 缓存
- f5+nginx问题
架构
每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多个 worker 进程。所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接
works抢占accept_mutex锁拿到请求连接
fd (ulimit -n查看最多打开fd打开数) nofile
ngx_accept_disabled(单进程的所有连接总数的八分之一-剩下的空闲连接数量)
ngx_accept_disabled 大于 0 时,不会去尝试获取 accept_mutex 锁,并且将 ngx_accept_disabled 减 1
free_connections
网络事件通过异步非阻塞
连接底层实现 select/poll/epoll/kqueue
nginx.conf
全局
事件设置
http server location
mail server location
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name www.linuxidc.com;
access_log logs/linuxidc.access.log main;
location / {
index index.html;
root /var/www/linuxidc.com/htdocs;
}
}
server {
listen 80;
server_name www.Androidj.com;
access_log logs/androidj.access.log main;
location / {
index index.html;
root /var/www/androidj.com/htdocs;
}
}
}
mail {
auth_http 127.0.0.1:80/auth.php;
pop3_capabilities "TOP" "USER";
imap_capabilities "IMAP4rev1" "UIDPLUS";
server {
listen 110;
protocol pop3;
proxy on;
}
server {
listen 25;
protocol smtp;
proxy on;
smtp_auth login plain;
xclient off;
}
}
邮箱服务
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了
IMAP 电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上
POP3 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件
SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地
mail {
server_name mail.myweb.name;
auth_http mail.postfix.cn:80/auth.php; #配置了HTTP认证地址
imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA;
pop3_auth plain apop cram-md5;
pop3_capabilities LAST TOP USER PIPELINING UIDL;
smtp_auth login plain cram-md5;
smtp_capabilities "SIZE 10485760" ENHANCESTATUSCODES 8BITMIME DSN;
xclient off;
server{
listen 25;
protocol smtp;
}
server{
listen 110;
protocol pop3;
proxy_pass_error_message on;
}
server {
listen 143;
protocol imap;
}
}
代理
正向代理 proxy_pass
resolver 114.114.114.114; 多了个解析
反向代理 proxy_pass
代理多个可以使用多次添加 proxy_pass 或者使用
proxy_pass http://tomcats;
upstream tomcats {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
负载均衡(策略):
轮询(默认)
加权轮询 weight
upstream tomcats {
server 127.0.0.1:9001 2;
server 127.0.0.1:9002 3;
}
IP哈希
upstream tomcats {
ip_hash;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
url哈希
upstream tomcats {
hash $request_uri;;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
响应时间短的优先分配
upstream tomcats {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
fair;
}
容错
server {
proxy_connect_timeout 5s; # 与被代理服务器建立连接的超时时间为5s
proxy_read_timeout 10s; # 获取被代理服务器的响应最大超时时间为10s
proxy_send_timeout 8; #代理服务器转发请求的超时时间为8s
# 当与被代理服务器通信出现指令值指定的情况时,认为被代理出错,并将请求转发给上游服务器组中的下一个可用服务器
proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
proxy_next_upstream_tries 3; # 转发请求最多3次
proxy_next_upstream_timeout 10s; # 总尝试超时时间为10s
location /http/ {
proxy_pass http://tomcats;
}
限流
漏桶算法
一个桶口在倒水,桶底在漏水的水桶。如果桶口倒水的速率大于桶底的漏水速率,桶里面的水将会溢出;同样,在请求处理方面,水代表来自客户端的请求,水桶代表根据”先进先出调度算法”(FIFO)等待被处理的请求队列,桶底漏出的水代表离开缓冲区被服务器处理的请求,桶口溢出的水代表被丢弃和不被处理的请求。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
Key:定义应用限制的请求特性。通过 Nginx 的内置变量**$binary_remote_addr**,可以获取到访问你的客户端IP地址,即其作用就是保存客户端IP地址的二进制形式。
Zone: 定义用于存储每个IP地址状态以及被限制请求URL访问频率的内存区域(也就是说它是用来存储我获取的这些IP地址)。通过 zone=keyword 标识区域的名字(自定义),以及冒号后面跟区域大小。
Rate:连接请求。速率不能超过每秒1个请求。
server {
location /login/ {
limit_req zone=mylimit;
proxy_pass http://my_upstream;
}
}
日志
Nginx中通过access_log和error_log指令配置访问日志和错误日志,
通过log_format自定义日志格式。如果日志文件路径中使用了变量,可以通过open_log_file_cache指令来设置缓存,提升性能。
作用域 http,server,location
access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m
path 指定日志的存放位置。
format 指定日志的格式。默认使用预定义的combined。
buffer 用来指定日志写入时的缓存大小。默认是64k。
gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。
if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。
error_log path(存放路径) level(日志等级) debug | info | notice | warn | error | crit
缓存
http:
proxy_cache_path 指定缓冲区的路径
levels 缓存目录级最高三层,每层1-2个字符表示,比如:1:1:2 三层
keys_zone 缓存块名称及内存块大小,比如:cache_item:500m表示声明一个名为cache_item大小为500m,超出大小后最早的被清除
max_size 缓存区硬盘的最大值,超出闲置数据将被清除
inactive 最长闲置时间,比如:10d ,表示一个数据被闲置10天则将被清除
proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
location:
proxy_cache 指定缓冲区,对应keys_zone中的设定的值
proxy_cache_key 通过参数拼装参数key如:$host$uri$is_args$args md5值为key
proxy_cache_valid 对不同的状态码设置缓存有效期
proxy_cache one;
proxy_cache_valid any 10m;
proxy_cache_key $host$uri$is_args$args;
f5+nginx问题
ip hash
f5 通过X-Forward-For设置真实ip地址