月份:2020年11月


Nginx tcp反向代理记录日志


对于Nginx访问日志,大家都很熟悉,但是对于tcp代理来说,到底能不能记录访问日志呢? 想了一下,貌似不能啊,因为毕竟访问日志里面记录的元素都是http协议的。

但是当我去搜索时,的确搜到了相关的文档,索性先试试看,测试后发现确实可以。

修改nginx配置文档/usr/local/nginx/conf/nginx.conf 设置日志格式

stream {
 log_format proxy '$remote_addr [$time_local] '
 '$protocol $status $bytes_sent $bytes_received '
 '$session_time "$upstream_addr" '
 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
 include ./conf.d/*.tcpstream;
}

修改具体的tcp配置文档

server{
 error_log /opt/log/device5001_error.log;
 access_log /opt/log/device5001_access.log proxy;
 listen 5001;
 proxy_pass device5001;
}

 

日志如下:

 

但是,需要提醒你的是:

nginx会等待session结束才会记录到日志文件;
session日志只是tcp层面的记录,包括session时间,发送接收字节数等等;
session内部发送日志(比如一个socket连接建立起来以后,多次发送心跳数据)需要在应用层面才能记录;

nginx代理过程中修改user_agent


关于User_agent是啥,就不多介绍了,简单说就是客户端的标识,比如chrome浏览器有chrome浏览器的标识,手机客户端也有手机客户端的标识。

有些特殊场景需要指定一个固定的user_agent,来模拟某个客户端。这时候,就可以借助Nginx的反向代理来实现。Nginx配置文件如下:

server {
    listen 8000;
    server_name localhost;
    access_log  log/access-8000.log;
    error_log  log/error-8000.log;

    location / {
        set $ua "lalallalalla x33xx33";
        proxy_pass   http://127.0.0.1:8081/;
        proxy_set_header User-Agent $ua;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

}

再来看看访问日志:

127.0.0.1 - - [19/Nov/2020:11:56:55 +0800] "GET /build/framework/js/7eaf6.chunk.js HTTP/1.0" 200 42870 "http://192.168.0.62:8000/" "lalallalalla x33xx33"
127.0.0.1 - - [19/Nov/2020:11:56:55 +0800] "GET /uusafe/gloab/rest/saas/all HTTP/1.0" 200 536 "http://192.168.0.62:8000/" "lalallalalla x33xx33"

已经将user_agent修改为了自定义的了。