3.Nginx高级配置
状态页
状态页用于输出 nginx 的基本状态信息
基于 ngx_http_stub_status_module 模块实现,编译安装时需要添加 –with-http_stub_status_module 编译参数
注意:状态页显示的是整个服务器的状态,而非单独某个虚拟机的状态
输出信息示例:
1 | Active connections: 2 |
- Active connections:当前处于活动状态的客户端连接数,reading + writing + waiting
- Reading:正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
- Writing:正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
- Waiting:正在等待客户端发出请求的空闲连接数,如果开启 keep-alive,这个值等于 active – (reading+writing)
- server accepts handled requests:三个值分别对应 accepts、handled、requests
- accepts:Nginx 自启动后已经接受的客户端请求的总数
- handled:Nginx 自启动后已经处理完成的客户端请求总数,通常等于 accepts,除非有因
worker_connections 限制等被拒绝的连接 - requests:Nginx 自启动后客户端发来的总的请求数
第三方模块
第三模块是对 nginx 的功能扩展,第三方模块需要在编译安装 Nginx 的时候使用参数–add-module=PATH 指定路径添加,nginx 支持第三方模块需要从源码重新编译支持
范例:支持开源的 echo 模块 https://github.com/openresty/echo-nginx-module
1 | [root@centos8 src]$ git clone https://github.com/openresty/echo-nginx-module.git |
变量使用
nginx 的变量可以在配置文件中引用,作为功能判断或者日志等场景使用
变量可以分为内置变量和自定义变量
内置变量是由 nginx 模块自带,通过变量可以获取到众多的与客户端访问相关的值
内置变量
http://nginx.org/en/docs/varindex.html
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#variables
常用内置变量:
$remote_addr
:客户端的公网 IP$proxy_add_x_forwarded_for
:X-Forwarded-For:简称 XFF,只有在通过 http 代理或者负载均衡服务器时才会添加该项
如果请求头中有 XFF,$proxy_add_x_forwarded_for 就是XXF头的值追加$remote_addr,所以,如果请求头中没有 XFF,$proxy_add_x_forwarded_for 就等于 $remote_addr
1
2# client1是真实的客户端ip,后面的是经过的代理或者负载均衡的ip,经过几个就会出现几个
X-Forwarded-For: client, proxy1, proxy21
2
3
4
5# 范例:
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 实现ip透传
proxy_pass http://36.10.10.118:9015;
}$args
:url 中的 get 参数例如 http://ljk.cn/main/index.do?id=1&partner=search,$args就是id=1&partner=search
$document_uri
:和$uri 相同,当前请求中不包含参数的 URI例如 http://ljk.cn/main/index.do?id=1&partner=search,$document_uri就是/main/index.do
$host
:请求的 host 名称$limit_rate
:limit_rate 项配置的网络速率,默认为 0$remote_port
:客户端请求 Nginx 服务器时随机打开的端口,这是每个客户端自己的端口$remote_user
:已经经过 Auth Basic Module 验证的用户名$request_body_file
:做反向代理时发给后端服务器的本地资源的名称$request_method
:请求资源的方式,GET/PUT/DELETE 等$request_filename
:当前请求的资源文件的磁盘路径,由 root 或 alias 指令与 URI 请求生成的文件绝对路径,如:/apps/nginx/html/main/index.html$request_uri
:包含请求参数的原始 URI,不包含主机名,相当于:$document_uri?$args,例如如:/main/index.do?id=20190221&partner=search$scheme
:请求的协议,例如:http、https、ftp 等$server_protocol
:保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0 等$server_addr
:保存了服务器的 IP 地址$server_name
:请求的服务器的主机名$server_port
:请求的服务器的端口号$http_<name>
:name 为任意请求报文首部字段,表示记录请求报文的首部字段,用下划线代替横线示例:echo $http_User_Agent
$http_user_agent
:客户端浏览器的详细信息$http_cookie
:客户端的 cookie 信息$cookie_<name>
:name 为任意请求报文首部字部 cookie 的 key 名
范例:
1 | location /main { |
自定义变量
语法: set variable value;
默认值: —
上下文: server, location, if
范例:
1 | set $name magedu; |
自定义访问日志
错误日志(error_log)一般只有一个,但是访问日志可以在不同的 server 中定义多个,access_log 指定日志的保存路径,log_format 指定日志的格式,格式中定义要保存的具体日志内容
访问日志由 ngx_http_log_module 模块实现
自定义访问日志的格式:
语法: log_format name [escape=default|json|none] string …;
默认值: log_format combined “…”;
上下文: http
支持三种转义方式:
- default:
”
、,
、\
以及小于 32 或大于 126 的字符被转义为\xXX
- json:所有 json 中不被允许的字符都进行转义,
”
被转义成\
,\
被转义成\\
,值小于 32 的字符转义成\n
、\r
、\t
、b
、f
或\u00XX
- none:禁止转义
combined 是内置的默认格式,以空格分割字符串形式记录日志
1 | log_format combined '$remote_addr - $remote_user [$time_local] ' |
自定义访问日志的路径以及其他配置:
语法: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
默认值: access_log logs/access.log combined;
上下文: http, server, location, if in location, limit_except
format:默认 combined
buffer=size:缓冲区大小,默认 64K
gzip=level:压缩等级,1-9,数值越大,压缩率最高,压缩最慢,默认为 1,可以使用zcat
解压缩
flush=time:缓冲区的数据写入磁盘的间隔时间,必须搭配 buffer=size 一起使用,时间到了,即使缓冲区还没满,也得写入磁盘
if=condition:其他条件
范例:
1 | access_log /path/to/log.gz combined gzip flush=5m; |
1 | map $status $loggable { |
自定义 json 格式日志
Nginx 的默认访问日志记录内容相对比较单一,默认的格式也不方便后期做日志统计分析,生产环境中通常将 nginx 日志转换为 json 日志,然后配合使用 ELK 做日志收集-统计-分析
1 | log_format access_json '{"@timestamp":"$time_iso8601",' |
json 格式的日志访问统计
1 | #!/usr/bin/env python3 |
Nginx 压缩功能
Nginx 支持对指定类型的文件进行压缩然后再传输给客户端,有助于降低出口带宽的利用率,降低企业的 IT 支出,不过会占用相应的 CPU 资源
依赖于模块 ngx_http_gzip_module
1 | #启用或禁用gzip压缩,默认关闭 |
范例:
1 | gzip on; |
https
https = http + ssl / tls
https 的实现过程可以参考前面的关于“安全和加密”部分的笔记
基于模块 ngx_http_ssl_module 实现,yum 安装默认开启,编译安装则需要指定编译参数 –with-http_ssl_module
1 | ssl on | off; # 开启ssl功能,这个参数1.15版本已经废除了,应该使用 listen ssl 替代 |
范例:实现 hsts https://www.cnblogs.com/sunsky303/p/8862600.html
1 | server { |
关于 favicon.ico
favicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的 favicon.ico 文件,但是当浏览器请求的 favicon.ico 文件不存在时,服务器会记录 404 日志,而且浏览器也会显示 404 报错
1 | location = /favicon.ico { |