1、高级用法/配置:
(1)upstream用法:
#代理的后端服务器
upstream interface{
server 10.69.105.164:7070 max fails=3 fail timeout=30s;
server 10.69.105.165:7070 max fails=3 fail timeout=30s;
keepalive 256;
}
server{
listen 80;
server_name 10.69.105.43;
location /crm-service-Interface {
proxy_pass http://interface: #关联upstream
}
(2)防盗链
location /images {
root /data/nginx/html/pc;
index index.html;
valid_referers none blocked server_names *.example.com example.* www.example.org/galleries/ ~\.google\.;
if ($invalid_referer) {
return 403;
}
}
#定义防盗链:
location ^~ /images {
root /data/nginx;
index index.html;
valid_referers none blocked server_names *.a.com www.a.* api.online.test/v1/hostlist ~\.google\. ~\.baidu\.; #定义有效的referer
if ($invalid_referer) { #假如是使用其他的无效的referer访问:
return 403; #返回状态码403
}
}
(3)重定向
location / {
root /data/nginx/html/pc;
index index.html;
if ($scheme = http ){ #未加条件判断,会导致死循环
rewrite / https:a.com permanent; #永久重定向
#rewrite / https:a.com redirect; #临时重定向
}
2、负载均衡方式/调度算法:
参考文章:
https://www.php.cn/nginx/453114.html
https://www.jianshu.com/p/72d7c806e95e
(1)轮询;
默认模式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
适用场景:适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。
如何配置:把服务器列表加入到upstream模块中即可。
(2)ip_hash;
同一个IP客户端固定访问一个后端服务器,可以解决session问题
(3)url_hash;
相同的url固定转发到同一个后端服务器处理
(4)fair
响应时间短的后端服务器优先分配。本身不支持,必须加载Nginx的 upstream_fair模块
(5)weight
(6)least_conn
3、状态码排查思路(404/502/504/)
参考文章:
https://blog.youkuaiyun.com/yts1115084429/article/details/100877372
200:成功
301:永久重定向
302:临时重定向
400:(错误请求) 服务器不理解请求的语法。
401:(未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
402: 该状态码是为了将来可能的需求而预留的。
403:(禁止) 服务器拒绝请求。
404:(未找到) 服务器找不到请求的网页。
405:(方法禁用) 禁用请求中指定的方法。
406:(不接受) 无法使用请求的内容特性响应请求的网页。
407:(需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408:(请求超时) 服务器等候请求时发生超时。
409:(冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410:(已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411:(需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412:(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413:(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414:(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415:(不支持的媒体类型) 请求的格式不受请求页面的支持。
416:(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417:(未满足期望值) 服务器未满足"期望"请求标头字段的要求。
500:(服务器内部错误) 服务器遇到错误,无法完成请求。
501:(尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502:(错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503:(服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504:(网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505:(HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
4、优化
5、日志中变量
log_format access_json '{"timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",' '"uri":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
access_log /apps/nginx/logs/access_json.log access_json;
#重启Nginx并访问测试日志格式
{"timestamp":"2019-02-22T08:55:32+08:00",
"host":"192.168.7.102",
"clientip":"192.168.0.1",
"size":162,
"respo nsetime":0.000,
"upstreamtime":"-",
"upstreamhost":"-",
"http_host":"www.a.net",
"uri":"/favicon.ico",
"domain":"www.a.net",
"xff": "-",
"referer":"-",
"tcp_xff":"",
"http_user_agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0",
"status":"404"}
6、nginx配置的主要模块
全局、event、http、stream
http第三方模块:gzip、ssl、rewrite、referer、proxy、upstream、