Nginx配置模块梳理

  • 架构
  • nginx.conf
  • 邮箱服务
  • 代理
  • 负载均衡(策略):
  • 容错
  • 限流
  • 日志
  • 缓存
  • f5+nginx问题


架构

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地址