5.4 虚拟主机的匹配规则
通过名字查找虚拟主机时,如果一个名字可以匹配多个指定的配置,比如同时匹配上通配符和正则表达式,按下面优先级,使用先匹配上的虚拟主机:
确定的名称;
最长的以星号起始的通配符名字,比如"*.example.com";
最长的以星号结束的通配符名字,比如"mail.*";
第一个匹配的正则表达式名字(按在配置文件中出现的顺序)。
当开始接入请求时,(1)nginx首先判断请求的套接字,即IP和端口号;(2)然后在listen套接字中选择一个能匹配名称的虚拟主机,如果没有选出能匹配的名称,则使用该套接字的默认虚拟主机。默认情况下,监听套接字的默认虚拟主机为该套接字主机组中的第一个虚拟主机,但可以通过listen指令的default_server属性手动指定。
例如下面定义了4个虚拟主机:前3个都监听在192.168.100.1:80上,第四个监听在192.168.100.2:80上。
server { listen 192.168.100.1:80; server_name example.org ; ... } server { listen 192.168.100.1:80 default_server; server_name example.net ; ... } server { listen 192.168.100.1:80; server_name example.com ; ... } server { listen 192.168.1.2:80; server_name example.com ; ... }(1).从192.168.100.1:80上请求,能匹配虚拟主机3,于是使用虚拟主机3的配置进行响应;
(2).从192.168.100.1:80上请求时,无法匹配任何虚拟主机,于是使用默认虚拟主机2的配置进行响应。如果将listen的属性default_server去掉,则使用虚拟主机1进行响应;
(3).从192.168.100.2:80上请求时,使用虚拟主机4进行响应;
(4).从192.168.100.2:80上请求时,由于无法匹配该套接字上的任何主机,于是使用默认虚拟主机响应,即虚拟主机4。
使用ngx_http_stub_status_module模块提供的功能可以获取nginx运行的状态信息。对应的指令只有一个,即stub_status。
例如,在某一个server下加上如下配置获取该server的状态信息。
server { listen 80; server_name ; location / { root /www/longshuai/; index index.html index.htm; } location /status { stub_status on; } }还可以明确指定访问该信息不记录日志,且提供访问控制,不让外界人随意获取信息。
location /status { stub_status on; access_log off; allow 192.168.100.0/24; deny all; }重载配置文件后,只需在浏览器中输入"主机名/status"即可获取信息。
Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106状态信息意义如下:
第一行active connections:291表示当前处于活动状态的客户端连接数,包括正处于等待状态的连接。
第四行reading数量为6,表示nginx正在读取请求首部的数量,即正在从socket recv buffer中读取数据的数量;writing数量为179表示nginx正在将响应数据写入socket send buffer以返回给客户端的连接数量;waiting数量为106表示等待空闲客户端发起请求的客户端数量,包括长连接状态的连接以及已接入但socket recv buffer还未产生可读事件的连接,其值为active-reading-writing。
第二行accepts的数量为16630948表示从服务启动开始到现在已经接收进来的总的客户端连接数;handled的数量为16630948表示从服务启动以来已经处理过的连接数,一般handled的值和accepts的值相等,除非作出了连接数限定;requests的数量为服务启动依赖总的客户端请求数。一个连接可以有多个请求,所以可以计算出平均每个连接发出多少个请求。
以下是第二行几个参数的官方原文: accepts:The total number of accepted client connections. handled:The total number of handled connections. Generally, the parameter value is the same as accepts unless some resource limits have been reached (for example, the worker_connections limit). requests:The total number of client requests.
6. 访问日志access_lognginx的访问日志相关功能由ngx_http_log_module模块提供,指令包括log_format、access_log和open_log_file_cache。
nginx的日志可以先缓冲到buffer中,一定时间后再写入到日志文件中。从buffer刷盘到本地日志文件中时,可以进行压缩。
nginx的worker进程的运行身份需要有日志创建的权限,即对日志所在目录有写权限。
可以在多种上下文中定义是否开启日志以及日志的格式。最常见的三个上下文是http,server,location。
open_log_file_cache指令存在的意义是为了缓存日志文件描述符。之所以提供这个指令,是因为nginx每次日志的写入(从缓存中刷盘到本地日志文件中)都会打开、关闭一次日志文件。对于日志写入极其频繁的机器可以使用该指令缓存日志文件描述符,使得在缓存有效期内都可以续写到旧日志文件中。
6.1 log_format指令log_format指定日志的格式,语法如下:log\_format name string...;。其中name指定日志格式名称,配置文件中name名称不能重复。
以下是默认提供的main格式。
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"';在main后面的是一堆变量,除了这些变量之外还有其他很多变量可用,但如非特殊需求,默认的main格式就已经够完美了。以下是变量的意义:
$remote_addr:客户端的地址。如果nginx提供的web服务在后端,如前面有代理服务器或负载均衡等设备时,该变量只能获取到前端的IP地址。此时要获取到真正客户端地址需要使用变量$http_x_forward_for,但要求前端服务器要开启x_forward_for设置。 $http_x_forward_for:如上所述。 $remote_user:远程客户端用户名称。 $time_local:记录访问时间和时区信息。 $request:记录用户访问时的url和http协议信息。如:"GET /favicon.ico HTTP/1.1"。 $status:记录客户端请求时返回的状态码,如成功的状态码为200,page not found的状态码为404。 $body_bytes_sent:记录服务器响应给客户端的主体大小。 $http_referer:记录此次请求是从哪个链接过来的,需要模块ngx_http_referer_module支持,默认已装,可以防止倒链问题。 $http_user_agent:记录客户端的浏览器信息。如使用什么浏览器发起的请求,是否是压力测试工具在测试等。例如,以下是默认格式的日志信息。
192.168.100.27 - - [23/Apr/2017:23:08:56 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3" 192.168.100.27 - - [23/Apr/2017:23:08:56 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3" 192.168.100.27 - - [23/Apr/2017:23:08:56 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3" 192.168.100.27 - - [23/Apr/2017:23:08:56 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3" 192.168.100.1 - - [23/Apr/2017:23:08:56 +0800] "GET /status HTTP/1.1" 200 109 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" 192.168.100.1 - - [23/Apr/2017:23:08:56 +0800] "GET /status HTTP/1.1" 200 109 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" 192.168.100.1 - - [23/Apr/2017:23:08:56 +0800] "GET /status HTTP/1.1" 200 109 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" 192.168.100.27 - - [23/Apr/2017:23:08:57 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3" 192.168.100.27 - - [23/Apr/2017:23:08:57 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3" 192.168.100.27 - - [23/Apr/2017:23:08:57 +0800] "GET /index.html HTTP/1.0" 200 17 "-" "ApacheBench/2.3" 6.2 access_log指令access_log主要用于定义使用什么格式的日志,日志存放路径。语法如下:
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off;path指定路径,path里可以使用变量。format指定日志格式,不写时或者配置文件中未配置access_log指令时,默认为combined。buffer=size指定日志缓冲区大小(默认64K),flush=time指定日志刷盘的时间,if=condition指定某些条件,gzip=level指定日志刷盘前先压缩的压缩级别(默认gzip=1)。
当指定了buffer或者gzip任意一个时,都会使用buffer先缓冲日志,然后再刷盘。
例如
access_log /spool/logs/nginx-access.log gzip buffer=32k; 6.3 日志文件的分割默认nginx不会自动分割日志,也不支持在配置文件中使用cronolog以及rotatelogs(apache支持,因为支持管道传递)。要实现nginx的日志分割,需要通过移动旧日志、生成新日志来实现。
mv old_log new_log # 然后 nginx -s reload # 或者 nginx -s reopen # 或者 kill -s USR1 master_pidpid可以通过pid文件获得。
kill -s USR1 $(cat /var/run/nginx/nginx.pid)要实现自动分割,需要使用脚本,并设置定时任务。
cat /usr/local/nginx/logs/cut_longhsuai.sh #!/bin/bash # cut the access log for basedir=/usr/local/nginx old_log_path=$basedir/logs/access.log log_save_path=$basedir/logs save_log_name=access_$(date -d "yesterday" +"%Y%m%d").log [ -f "$old_log_path" ] || exit 1 /bin/mv $old_log_path $log_save_path/$save_log_name $basedir/sbin/nginx -s reopen再添加定时任务计划。
chmod +x /usr/local/nginx/logs/cut_longshuai.sh crontab -e 00 00 * * * /bin/sh /usr/local/nginx/logs/cut_longshuai.sh &>/dev/null