Nginx 代理 日志 重写
Nginx的四七层代理
- 四层是指传输层的tcp/udp
- NAT技术,网络地址转换,修改数据包里面的目标和源IP和端口
- 七层是指应用层,通常是http
- 需要读取http请求内容,然后根据具体内容(url,参数,cookie,请求头)然后转发到对应的服务器,转发过程:建立和目标机器的连接,然后转发请求,收到响应数据在转发给请求客户端的
Nginx四层代理例子
#四层代理
events {
worker_connections 1024;
}
stream {
server {
listen 80;
proxy_pass cluster; #监听80端口 直接转发给后端服务器
}
upstream appserver {
server 192.168.1.5:8080 weight=2;
server 192.168.1.6:8080 weight=3;
}
}
http {
....
}
Nginx七层代理例子
http {
upstream appserver {
server 192.168.1.5:8080 weight=2;
server 192.168.1.6:8080 weight=2;
}
server {
listen 80;
server_name localhost
location / { #匹配任意请求
proxy_pass http://appserver;
}
location ~ .(gif|jpg|jpeg)$ { #匹配url
proxy_pass http://appserver;
#也可以重写地址
#rewrite .(gif|jpg|jpeg)$ /logo.png;
}
}
}
Nginx的location语法
说明 | |
---|---|
location = {} | 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求 |
location ~ {} | 区分大小写匹配(可用正则) |
location ~* {} | 不区分大小写匹配(可用正则) |
location !~ {} | 区分大小写不匹配 |
location !~* {} | 不区分大小写不匹配 |
location ^~ {} | ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格) |
Rewrite全局变量
变量 | 说明 |
---|---|
$args | 这个变量等于请求行中的参数,同$query_string |
$content_length | 请求头中的Content-length字段 |
$content_type | 请求头中的Content-Type字段 |
$document_root | 当前请求在root指令中指定的值 |
$host | 请求主机头字段,否则为服务器名称 |
$http_user_agent | 客户端agent信息 |
$http_cookie | 客户端cookie信息 |
$limit_rate | 这个变量可以限制连接速率 |
$request_method | 客户端请求的动作,通常为GET或POST |
$remote_addr | 客户端的IP地址 |
$remote_port | 客户端的端口 |
$remote_user | 已经经过Auth Basic Module验证的用户名 |
$request_filename | 当前请求的文件路径,由root或alias指令与URI请求生成 |
$scheme | HTTP方法(如http,https) |
$server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1 |
$server_addr | 服务器地址,在完成一次系统调用后可以确定这个值 |
$server_name | 服务器名称 |
$server_port | 请求到达服务器的端口号 |
$request_uri | 包含请求参数的原始URI ,不包含主机名,如"/state/bar.php?arg=bbb". |
$uri | 不带请求参数的当前URI,$uri不包含主机名,如“/state/bar.html” |
$document_uri | 同$uri |
例子
#限制IP访问
if ($remote_addr = 192.168.1.5) {
return 403;
}
#限制浏览器访问
if ($http_user_agent ~ Firefox) {
rewrite ^(.*)$ /firefox/$1 break; #跳转到专门的目录下
}
Nginx信号控制
信号 | 说明 |
---|---|
TERM,INT | 快速停止(杀死进程) |
QUIT | 优雅的关闭进程,即等请求结束后再关闭 |
HUP | 改变配置文件,平滑的重读配置文件 |
USR1 | 重读日志,在日志按月/日分割时有用 |
USR2 | 平滑升级 |
WINCH | 优雅关闭旧的进程(配合USR2进行升级) |
Nginx日志格式
vim /usr/local/nginx/conf/nginx.conf
==================================
.....
access_log logs/access.log main; #main格式
.....
=======================================
-
main格式参数表
-
参数 说明 $remote_addr 客户端的ip地址(代理服务器,显示代理服务Ip) $remote_user 用于记录远程客户端的用户名称(一般为"-") $time_local 用于记录访问时间和时区 $request 用于记录请求的url以及请求方法 $status 响应状态码,如200、404 $body_bytes_sent 给客户端发送的文件主体内容字节数 $http_user_agent 用户所使用的代理(浏览器) $http_x_forwarded_for 可以记录客户端IP 通过代理服务器来记录客户端的Ip地址 $http_referer 可以记录用户是从哪个链接访问过来的 -
#查看日志 对面上面的变量 tail -f /usr/local/nginx/logs/access.log ====================================== 192.168.1.252 - - [10/Mar/2021:17:30:32 +0800] "GET / HTTP/1.1" 200 51 "-" "curl/7.29.0" 71.6.232.4 - - [10/Mar/2021:20:06:40 +0800] "GET / HTTP/1.1" 200 51 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" ==============================================
-
-
Nginx日志切割脚本
-
vim nginx_log.sh ========================= #!/bin/bash #目录变量 LOG_HOME="/usr/local/nginx/logs" #备份文件名称 LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".bak.access.log #重命名nginx的日志文件 mv ${LOG_HOME}/access.log ${LOG_HOME}/${LOG_PATH_BAK} #向nginx主进程发信号重新打开日志 kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` #nginx接到信号后会从配置文件冲读取日志文件名称,重新打开日志文件,并以工作进程的用户作为日志文件的所有者。 ====================================================================
-