Nginx请求定位&日志管理
一、请求定位
(一)资源访问
nginx默认的配置文件如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
1、添加location配置
location /lcl/nginx/demo {
root /aa/bb;
index myfile.text;
}
2、在真实目录中,需要在root属性指定的目录下存在location指定的url路径目录,所以需要在/aa/bb目录下创建/lcl/nginx/demo文件夹,并创建myfile.text文件,向文件内写入内容。
mkdir -p /aa/bb/lcl/nginx/demo
vi myfile.text
(二)路径匹配优先级
优先级的规则是:普通匹配 < 长路径匹配 <正则匹配 < 短路匹配 < 精确匹配
普通匹配:以下面配置文件为例,所有以/lcl开头的请求都可以命中,这就是普通匹配,例如使用:http://8.131.245.53/lcl/nginx/dem请求,返回400
location /lcl {
return 400;
}
长路径匹配:以下面配置文件为例,所有以/lcl/mginx开头的请求都可以命中,如果一个请求既能命中/lcl又能命中/lcl/nginx,那么路经长的优先级高,例如使用:http://8.131.245.53/lcl/nginx/dem请求,变为了402
location /lcl/nginx {
return 402;
}
正则匹配:~表示这里是正则表达式,默认匹配是区分大小写的,在长路径匹配和正则匹配中,仍然是正则匹配的优先级高于长路径匹配。例如使用:http://8.131.245.53/lcl/nginx/dem请求,变为了401;为了演示和后续几个的区别,使用http://8.131.245.53/mm/lcl/nginx/dem访问,返回401,但是匹配过程中,有大小写不一致,例如访问http://8.131.245.53/mm/Lcl/nginx/dem,则会返回404
location ~/lcl {
return 401;
}
如果不想区分大小写,可以在~后加*,如下配置所示,访问http://8.131.245.53/mm/Lcl/nginx/dem时,仍然返回403
location ~*/lcl {
return 403;
}
短路匹配:以^~开头的匹配路径称为短路匹配,表示只要匹配上,就不再匹配其他的了,即使正则匹配也不再匹配了。
location ^~/lcl {
return 405;
}
精确匹配:以等号开头的匹配,是优先级最高的匹配
location =/lcl/nginx/dem {
return 406;
}
(三)缓存配置
Nginx具有很强大的缓存功能,可以对请求的response进行缓存,起到类似CDN的作用,甚至有比CDN更强大的功能,同时,Nginx缓存还可以用来数据托底,即当后台web服务器挂掉后,nginx可以直接将缓存中的托底数据返回给用户,此功能就是Nginx实现的服务降级的体现。
Nginx缓存功能的配置由两部分组成,全局定义和局部定义,在http{}模块的全局部分中进行缓存全局定义,在server{}模块的各个location{}模块中根据业务需求进行缓存局部定义。
1、http{}模块的缓存全局定义
http {
include mime.types;
default_type application/octet-stream;
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=5g inactive=2h use_temp_path=off;
#proxy_temp_path proxy/cache;
proxy_cache_path用于指定Nginx缓存的存放路径及相关配置;proxy_temp_path用于指定nginx缓存的临时存放目录,若proxy_cache_path中的use_temp_path设置为off,则该属性可以不指定。
2、location{}模块的缓存局部定义
配置 | 描述 |
proxy_cache mycache | 指定用户存放缓存key内存区域名称,,其值为http{}模块中proxy_cache_path中的keys_zone的值 |
proxy_cache_key $host$request_uri$arg_age | 指定nginx生成的缓存的key的组成 |
proxy_cache_bypass $arg_age | 指定是否越过缓存 |
proxy_cache-methods GET HEAD | 指定客户端请求的哪些提交方法将被缓存,默认为GET与HEAD,但不缓存POST |
proxy_no_cache $aaa $bbb $ccc | 指定本次请求是否不做缓存,只要有一个不为0,就不对该请求结果做缓存 |
proxy_cache_purge $ddd $eee $fff | 指定是否清除缓存 |
proxy_cache_lock on | 指定是否采用互斥方式回源 |
proxy_cache_lock_timeout 5s | 指定再次生成回源互斥锁的时限 |
proxy_cache_valid 5s | 对指定的http状态码的响应数据进行缓存,并指定缓存时间,默认指定的状态码为200,301,302 |
proxy_cache_use_stale http_404 http_500 | 设置启用托底缓存的条件,而一旦这里指定了相应的状态码,则前面proxy_cache_valid中指定的相应状态码所生成的缓存就变为托底缓存 |
expires 3m | 为请求的静态资源开启浏览器端的缓存 |
3、Nginx变量
(1)自定义变量
由于Nginx配置文件是perl脚本,所以其是可以使用如下方式定义:
set $aaa "hello";
set $bbb 123;
location / {
root html;
index index.html index.htm;
}
(2)内置变量
Nginx中已经内置定义了很多变量,如下:
变量 | 说明 | 变量 | 说明 | 变量 | 说明 |
$args | 请求中的参数 | $binary_remote_addr | 远程地址的二进制表示 | $body_bytes_sent | 已发送的消息体字节数 |
$content_length | http请求信息里的“Content-Type” | $document_root | 针对当前请求的根路径设置值 | $document_uri | 与$uri相同 |
$host | 请求信息中的Host,如果请求中没有Host行,则等于设置的服务器名 | $http_cookie | cookie信息 | $http_referer | 来源地址 |
$http_user_agent | 客户端代理信息 | $http_via | 最后一个访问服务器的ip地址 | $http_x_forwarded_for | 相当于网络访问路径 |
$limit_rate | 对连接速率的限制 | $remote_addr | 客户端地址 | $remote_port | 客户端端口号 |
$remote_user | 客户端用户名,认证用 | $request | 用户请求信息 | $request_body | 用户请求主体 |
$request_body_file | 发往后端的本地文件名称 | $request_filename | 当前请求的文件路径名 | $request_method | 请求的方法,比如get、post等 |
$request_uri | 请求的uri,带参数 | $server_addr | 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取的地址(造成资源浪费) | $server_name | 请求到达的服务器名 |
$server_port | 请求到达的服务器端口号 | $uri | 请求的uri,可能和最初的值有不同,比如经过重定向之类的 |
二、Nginx日志管理及自动切割
对于开发、运维人员来说,日志非常重要,通过日志可以查看很多请求访问信息及异常信息,Nginx也提供了对日志的强大支持。
(一)日志管理规范
Nginx的日志分为两类,访问日志和错误日志,Nginx整个系统的默认日志在生成预编译文件makefile时就默认配置好了。当然,无论是访问日志还是错误日志,其默认路径与名称在配置文件中均可修改,在配置文件中不仅定义了日志文件的路径及名称,还定义了日志格式。
Nginx日志一般可以指定三个范围:http{}模块范围、server{}范围、location{}模块范围。
1、http{}模块范围
只要有请求通过http协议访问该Nginx,就会有日志信息写入到这里的日志文件。
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main buffer=64k;
error_log logs/myerror.log;
open_log_file_cache max=1000 inactive=10s min_uses=2 valid=60s;
log_format:
其中,log_format用于设置访问日志的格式,其后的main是为该格式的名称,可以任意,在后面的就是具体的格式,通过Nginx内置变量定义。内置变量描述如下:
$remote_addr:获取访问者的IP地址,若当前Nginx是反向代理服务器,则此变量获取到的就是客户端的IP地址;若当前Nginx是静态代理服务器,则此变量获取到的是反向代理服务器的地址。
$http_x_forwarded_for:获取客户端浏览器的IP,若当前Nginx是反向代理服务器,则此变量获取到的值为横杠(-);若当前Nginx是静态代理服务器,则此变量获取到的是客户端的IP地址。
$remote_user:获取访问者的用户名
$time_local:获取请求访问的时间与时区
$request:获取请求的相关信息,包含请求方式、请求的URI、访问协议。
$status:后端服务器向其返回的状态码,例如200
$body_bytes_sent:后端服务器向客户端发送的响应体内容字节数
$http_referer:获取当前请求是从哪个页面过来的,其值在这里显示为横杠(-)
$http_user_agent:用户所使用的代理,一般为浏览器
access_log:
该指令用于设置访问日志,后面跟的三个参数分别为:
第一个参数:日志的存放路径及文件名
第二个参数:日志格式名
第三个参数:日志文件所使用的缓存,不过,即使不指定buffer,其也会存在默认日志缓存。
error_log:
该指令用于指定错误日志的路径和文件名,需要注意以下几点:
其不能指定格式,因为其有默认格式。
可以使用自己指定的错误日志文件,不过,将来的访问异常日志就不会再写入到默认的logs/error.log文件中了,所以关于错误日志,一般使用默认即可。
错误日志级别由低到高有:debug、info、notice、warn、error、crit、alert、emerg,默认为error,级别越高,记录的信息越少,可以使用error_log logs/myerror.log info;设置日志级别。
错误日志默认是开启的,关闭错误日志的写法为 error_log /dev/null;
open_log_file_cache:
该指令用于打开日志文件读缓存,将日志信息读取到缓存中,以加快对日志的访问,该功能默认为off,即open_log_file_cache off;
2、server{}模块范围
只要有请求访问当前server,就会有日志信息写入到这里的日志文件。
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log logs/host.access.log main;
error_log logs/host.error.log;
3、location{}模块范围
只有当请求访问当前location,就会有日志信息写入到这里的日志文件。
location / {
root html;
index index.html index.htm;
access_log logs/location.access.log main;
error_log logs/location.error.log;
}
(二)默认的/favicon.ico请求
客户端对于服务端页面会自动提交一个/favicon.ico请求,若没有favicon.ico文件则会在日志文件中报出404.
从网上任意下载一个ico图标,将其重命名为favicon.ico,然后放到linux中的任意目录,然后再修改nginx的配置文件,在其中添加如下location{}模块,
(三)日志自动切割
日志切割的实现步骤:
(1)创建切割shell脚本文件
在Linux下创建一个实现日志切割的shell脚本文件,脚本文件的具体内容可以在网上查,例如,将该shell文件创建在nginx安装目录下的logs目录中,并命名为cut_nginx_log.sh
(2)为该文件添加可执行权限
(3)向crontab中添加一个定时任务
crontab是Linux中的一个定义任务文件,每一行都代表一项定义任务,每行由6个字段组成,前5段是时间设定段,第6段是任务段,具体格式如下:
minute(0-59) hour(0-23) day(1-31) month(1-12) week(0-6) commond
可以使用 crontab -e打开文件进行编辑
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-03-09 JDK8--02:为什么要使用lambda