nginx工作机制 常用参数 匹配规则 转发细节 配置https 常用模块
- 2018-10-04 16:53:00
- admin
- 原创 2134
一、nginx工作机制
配置更新:
1、nginx –s reload给主进程发送SIGHUP信号;
2、主进程重新加载配置并fork一套新的工作进程,新工作进程开始处理新连接;
3、主进程发出信号,通知旧工作进程安静地退出;
二进制升级:
1、二进制升级与配置更新比较类似;
2、新的nginx主进程与原来的主进程并行,它们共享监听套接字,两个进程都活跃;
3、然后通知旧的主进程与其工作进程完美退出;
若干其它细节:
如果需要支持4层代理,编译时需要使用参数--with-stream或--with-stream=dynamic;
二、nginx常用参数
server_tokens,是否显示nginx版本号,默认显示;
max_fails,连续失败多少次认为server不可用,默认1次;
fail_timeout,max_fails次失败后,暂停的时间,默认10秒;
worker_processes number | auto,工作进程数目,默认1个进程,auto则配置为cpu核个数;
accept_mutex on | off,多个进程监听一个端口,操作系统新内核保证一次只唤醒一个进程,不会出现惊群,所以默认off值;
client_max_body_size,最大请求数据大小,默认1M,零表示不限制,太小会导致413错误,Request Entity Too Large;
backup,主备模式配置,不能同hash、ip_hash、random一起配置;
allow,允许IP地址访问;
deny,禁止IP地址访问;
nginx缓存设置:
1、proxy_request_buffering,是否缓存请求,默认开启,请求数据全部收到才会转发;
2、proxy_buffering,是否缓存返回,默认开启,一边接收rs数据,一边转发数据给client;
3、rs到nginx通常很快,nginx到client通常较慢,有读写缓存,所以可能导致回包延迟变大;
4、开启缓存返回,nginx转发数据给client,产生较多epoll_wait,是导致回包延迟变大的原因;
client到nginx默认长连接,nginx到server长连接需要配置:
1、proxy_http_version 1.1;
2、proxy_set_header Connection "";
3、keepalive 32; 工作进程空闲连接数不要设置太大,防止没有连接可以响应新的请求;
4、keepalive_timeout 60s; 默认60秒;
5、keepalive_requests 100; 默认100个请求后回收连接;
三、nginx匹配规则
域名匹配:
1、精准域名匹配;
2、头部通配最长匹配,比如*.example.com;
3、尾部通配最长匹配,比如, example.*;
4、按照配置顺序第一个匹配的正则表达式;
路径匹配:
1、匹配规则之前会先规范化URL,比如解释%XX、解释相对路径、合并正斜杠;
2、=精准匹配成功则终止,^~前缀匹配成功则终止,精准匹配优先级高于前缀匹配;
3、~正则匹配,~*忽略大小写正则匹配,优先级高于不带任何符号的前缀匹配;
四、nginx转发细节
变量说明:
1、$http_host,请求头host字段,包含端口,优先使用该变量;
2、$host,按顺序从请求行、请求头host字段、nginx配置的服务名获取,不包含端口;
3、$server_name,nginx配置的服务名;
4、$server_port,nginx配置的端口;
5、$scheme,请求模式,http或https;
转发设置:
proxy_set_header Host $http_host;
proxy_set_header Host-Port $server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Scheme $scheme;
转发消息的请求头host字段:
1、默认从proxy_pass指令的地址获取;
2、通过proxy_set_header来显示设置;
3、host值等于upstream名称时,nginx会修改302重定向地址;
4、host值不等于upstream名称时,nginx不修改302重定向地址;
五、nginx限流配置
1、limit_req用于限制单位时间请求量,每秒请求量或每分钟请求量,内部以毫秒跟踪请求量;
2、burst用于配置请求缓存,分为delay和nodelay两种执行模式,默认延迟执行;
3、delay=num,多少个请求之后开始延迟执行,默认是0,所有请求延迟执行;
4、延迟执行在将来时间执行请求,受限单位时间请求量,缓存用完立即可用;
5、立即执行在当前时间执行请求,当前未利用请求量导致缓存可用;
6、limit_rate用于限制单个连接返回速率,总速率受连接数影响;
7、limit_speed用于限制单个用户请求速率,总速率不受连接数影响;
限制单位时间请求量:
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_req_zone $server_name zone=perserver:10m rate=500r/s;
limit_req zone=perip burst=10 nodelay;
limit_req zone=perserver burst=500;
限制连接数量和返回速率:
limit_conn_zone $binary_remote_addr zone=perip:50m;
limit_conn_zone $server_name zone=perserver:50m;
limit_conn perip 200;
limit_conn perserver 1000;
limit_rate_after 5m;
limit_rate 2m;
限制总请求速率:
1、下载模块,nginx_limit_speed_module
2、设置内存,limit_speed_zone one $binary_remote_addr 10m;
3、限制大小,limit_speed one 10m;
六、nginx配置https
https常用配置项:
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!DH:!DHE:!RC4:!MD5:!NULL:!aNULL;
ssl_prefer_server_ciphers on;
ssl_certificate
ssl_certificate_key
ssl_password_file
ssl_client_certificate
ssl_ciphers,openssl编码的加密套件,解析套件:openssl ciphers -v 'HIGH:!aNULL:!MD5'
ssl_prefer_server_ciphers,优先选择服务端支持的加密套件,安全性更高;
ssl_password_file,存放私钥的密码,如果不指定,启动时需要输入私钥密码;
ssl安全检测:myssl.com,亚洲诚信服务,支持查询DNS;
ssl部署检测:myssl.cn
七、nginx打印日志
1、upstream_connect_time表示与后端服务建立连接花费时间;
2、upstream_header_time表示建立连接到返回第一个字节花费时间;
3、upstream_response_time表示建立连接到返回最后一个字节花费时间;
4、四层代理和七层代理使用不同模块,所以日志格式变量会有区别;
打印调试日志:
1、增加编译参数生成更多调试日志--with-debug,nginx -V可以查看编译参数,程序默认就有一些调试日志;
2、打印调试日志方法:error_log /path/to/log debug;
3、打印调试日志方法:debug_connection address;
打印请求日志:
log_format myproxy "$remote_addr"
"\t$time_local"
"\t$request"
"\t$status"
"\t$request_length"
"\t$bytes_sent"
"\t$request_time"
"\t$server_addr:$server_port"
"\t$upstream_addr"
"\t$upstream_bytes_sent"
"\t$upstream_bytes_received"
"\t$upstream_connect_time"
"\t$upstream_header_time"
"\t$upstream_response_time";
access_log logs/access.log myproxy;
八、nginx常用模块
ngx_http_core_module,核心配置模块;
ngx_http_upstream_module,配置负载均衡;
ngx_stream_proxy_module,支持4层反向代理;
ngx_http_proxy_module,支持7层反向代理;
ngx_http_ssl_module,支持https;
ngx_http_access_module,控制访问的IP地址;
ngx_http_dyups_module,动态更新upstream,阿里开源模块;