nginx-------------(四) 变量 日志分割 自定义图标 证书

一、高级配置

1 .1网页的状态页

基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module,否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态

参考上一篇文章

#配置示例:这样能更安全
location /nginx_status {
   #stub_status;
   auth_basic           "auth login";
   auth_basic_user_file /apps/nginx/conf/.htpasswd;
   allow 192.168.0.0/16;
   allow 127.0.0.1;
   deny all;
 }

1.2 Nginx 第三方模块

ehco 模块

开源的echo模块 GitHub - openresty/echo-nginx-module: An Nginx module for bringing the power of "echo", "sleep", "time" and more to Nginx's config file

① 修改子配置文件

[root@zzzcentos1 conf.d]#vim pc.conf 
server{
   listen 80;
   server_name www.lucky.com;
   root /data/;
   location /ip {
   echo "welcome,your ip addr: ";
   echo $remote_addr;
}
}

② 依赖nginx编译echo模块

[root@zzzcentos1 conf.d]#cd /opt/
[root@zzzcentos1 opt]#unzip echo-nginx-module-master.zip
[root@zzzcentos1 opt]#cd nginx-1.18.0/
[root@zzzcentos1 nginx-1.18.0]#systemctl stop nginx
[root@zzzcentos1 nginx-1.18.0]#./configure --help | grep add
[root@zzzcentos1 nginx-1.18.0]#nginx -V
[root@zzzcentos1 nginx-1.18.0]#./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/opt/echo-nginx-module-master
[root@zzzcentos1 nginx-1.18.0]#make && make install

③ 添加echo模块后检查语法不会报错

[root@zzzcentos1 conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@zzzcentos1 conf.d]#nginx -s reload
nginx: [error] invalid PID number "" in "/apps/nginx/logs/nginx.pid"
[root@zzzcentos1 conf.d]#systemctl start nginx
[root@zzzcentos1 conf.d]#nginx -s reload

④ 访问页面

结合看下

1.3变量

官方文档    http://nginx.org/en/docs/varindex.html

1.3.1常用内置变量

$remote_addr; 
#存放了客户端的地址,注意是客户端的公网IP




$proxy_add_x_forwarded_for
#此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addrthe “X-Forwarded-For” client request header field with the $remote_addr variable appended to it, separated by a comma. If the “X-Forwarded-For” field is not present in the client request header, the $proxy_add_x_forwarded_for variable is equal to the $remote_addr variable.
客户机    代理1     代理2     nginx服务器
$proxy_add_x_forwarded_for: 在代理1 上存的是  客户机的ip
$proxy_add_x_forwarded_for: 在代理2 上存的是  客户机的ip,代理1的ip            用逗号隔开
$proxy_add_x_forwarded_for: nginx  上存的是  客户机的ip,代理1的ip,代理2的ip



$args; 
#变量中存放了URL中的参数,例如:http://www.kgc.org/main/index.do?id=20190221&partner=search
#返回结果为: id=20190221&partner=search    存放的就是这个

select   *  from table  where id=20190221


$document_root; 
#保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html



$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比
如:http://www.kgc.org/main/index.do?id=20190221&partner=search会被定义为/main/index.do 
#返回结果为:/main/index.do


$host; 
#存放了请求的host名称


limit_rate 10240;
echo $limit_rate;
#如果nginx服务器使用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;   https:// www.baidu.com/main/index.do?id=20190221&partner=search 
#包含请求参数的原始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;  443  https 
#请求的服务器的端口号

$http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段
arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores 
#用下划线代替横线
#示例: echo $http_User_Agent;  

$http_user_agent; 
#客户端浏览器的详细信息

$http_cookie; 
#客户端的cookie信息


$cookie_<name>
#name为任意请求报文首部字部cookie的key名

$http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有
横线需要替换为下划线
arbitrary request header field; the last part of a variable name is the field 
name converted to lower case with dashes replaced by underscores #用下划线代替横线
#示例: 
echo $http_user_agent; 
echo $http_host;


$sent_http_<name>
#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题
echo $sent_http_server;



$arg_<name>
#此变量存放了URL中的指定参数,name为请求url中指定的参数
#对比 变量  $arg  是全部, 如果 要id   如下
echo $arg_id;

实验:变量
server{
   listen 80;
   server_name www.lucky.com;
   root /data/;
   location /ip {
   echo "welcome,your ip addr: ";
   echo $remote_addr;
}
 location /main {
        index index.html;
        default_type text/html;
        echo "hello world,main-->";
        echo $remote_addr;
        echo $args;
        echo $arg_user;
        echo $document_root;
        echo $document_uri;
        echo $host;
        echo $http_user_agent;
        echo $http_cookie;
        echo $request_filename;
        echo $scheme;
        echo $scheme://$host$document_uri?$args;
        }
}

① 修改配置文件

②测试验证:

实验结束:

补充下   正向代理  反向代理

正向代理:代理的是客户端
反向代理:代理的是服务端

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

总结

$proxy_add_x_forwarded_for  实现ip 透传,记录每一个地址


#此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addrthe “X-Forwarded-For” client request header field with the $remote_addr variable appended to it, separated by a comma. If the “X-Forwarded-For” field is not present in the client request header, the $proxy_add_x_forwarded_for variable is equal to the $remote_addr variable.
客户机    代理1     代理2     nginx服务器
$proxy_add_x_forwarded_for: 在代理1 上存的是  客户机的ip
$proxy_add_x_forwarded_for: 在代理2 上存的是  客户机的ip,代理1的ip            用逗号隔开
$proxy_add_x_forwarded_for: nginx  上存的是  客户机的ip,代理1的ip,代理2的ip

$http_user_agent;  客户端浏览器的详细信息
$server_addr;   服务器的IP地址
$scheme; 请求的协议    例如:http,https,ftp等
$http_cookie; 客户端的缓存信息   缓存:cookie和session

$server_protocol; 你使用的协议的版本

$document_root;指明了主站点目录的位置

#保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html 

1.3.2 自定义变量

假如需要自定义变量名称和值,使用指令set $variable value;

语法格式:

Syntax: set $variable value;
Default: —
Context: server, location, if    #可以放置的位置

代码:

location /test {
        set $name  kgc;
        echo $name;
        set $my_port $server_port;
        echo $my_port;
        }

1.3.3自定义图标

favicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是当浏览器请求的favicon.ico文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错

【自定义小图标】
wget www.baidu.com/favicon.ico
放到主目录就可以了

不生效可以重新打开浏览器

实验:定义百度图标 

实验前:

查看主目录:

下载图标 

[root@zzzcentos1 ~]#cd /apps/nginx/conf.d/
[root@zzzcentos1 conf.d]#wget www.baidu.com/favicon.ico
[root@zzzcentos1 conf.d]#cp favicon.ico /data/

检测

实验:定义京东图标
[root@zzzcentos1 data]#wget www.jd.com/favicon.ico

先下载图标,把favicon.ico复制到主目录下,就可以了

1.4 自定义访问日志

如果访问出错---404,可以去看日志信息cat /apps/nginx/logs/error.log

①日志的格式 可自由指定

访问日志是记录客户端即用户的具体请求内容信息,而在全局配置模块中的error_log是记录nginx服务器运行时的日志保存路径和记录日志的level,因此两者是不同的,而且Nginx的错误日志一般只有一个,但是访问日志可以在不同server中定义多个,定义一个日志需要使用access_log指定日志的保存路径,使用log_format指定日志的格式,格式中定义要保存的具体日志内容

Syntax: access_log path [format [buffer=size] [gzip[=level]] (flush=time] [if=condition]];access_log off;
Defau1t:
access_log 1ogs/access.1og combined;
Context: http,server, location,if in location,limit_except
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '$server_name:$server_port';


log_format  test  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '$server_name:$server_port';

格式可以定义多个

###注意如果开启 include  注意定义自配置文件与 日志格式的上下关系  ,   日志格式一定要在  include 之前 否则会不生效。

解释下:

注意如果开启 include  注意定义自配置文件与 日志格式的上下关系  ,日志格式一定要在  include 之前 否则会不生效。

实验:

去7-2访问:

再去7-1查看日志

 ②自定义 json 格式日志

方便ELK收集日志

log_format access_json '{"@timestamp":"$time_iso8601",'
        '"host":"$server_addr",'
        '"clientip":"$remote_addr",'
        '"size":$body_bytes_sent,'
        '"responsetime":$request_time,'
        '"upstreamtime":"$upstream_response_time",'
        '"upstreamhost":"$upstream_addr",'  
        '"http_host":"$host",'
        '"uri":"$uri",'
        '"xff":"$http_x_forwarded_for",'
        '"referer":"$http_referer",'
        '"tcp_xff":"$proxy_protocol_addr",'
        '"http_user_agent":"$http_user_agent",'
        '"status":"$status"}';

①配置

②去访问

③看日志   tail -f /apps/nginx/logs/access.log

轻松一刻:提取下状态码 200

实验1:

实验2:

③日志分割

nginx的日志是生成在安装目录下/usr/local/nginx/logs中,大量的日志如果不做良好的管理,长此以往会造成日志文件过大且日志分析困难

----------------日志切割-------------------
vim /opt/fenge.sh
#!/bin/bash
# Filename: fenge.sh
day=$(date -d "-1 day" "+%Y%m%d")											#显示前一天的时间
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path 									#创建日志文件目录
mv /usr/local/nginx/logs/access.log ${logs_path}/kgc.com-access.log-$day	#移动并重命名日志文件
kill -USR1 $(cat $pid_path)													#重建新日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;								#删除30天之前的日志文件
#find $logs_path -mtime +30 | xargs rm -rf 
 
 
 
chmod +x /opt/fenge.sh
/opt/fenge.sh
ls /var/log/nginx
ls /usr/local/nginx/logs/access.log 
 
#设置周期计划任务
crontab -e
0 1 * * * /opt/fenge.sh

编写日志分割的脚本
#!/bin/bash
#this is used for cutting nginx logs 
##定义日志收集的目录
newlogpath=/var/log/nginx
##定义区分日志的标识,采用时间标记,计划每天一次日志分割
lastday=`date -d "-1 day" +%Y%m%d`
##找到应用程序生成日志的源路径
oldlogpath=/usr/local/nginx/logs
##定义应用程序的pid号 也就是nginx的master进程号
pid=`cat ${oldlogpath}/nginx.pid`
 
##先判断收集日志的目录是否存在,没有则创建,有则进行下一步
[ -d $newlogpath ]||mkdir $newlogpath
 
##使用mv命令进行日志分割,将生成的访问日志和错误日志都移动到收集日志的目录下,并添加时间标记
mv $oldlogpath/access.log $newlogpath/access.log.$lastday
mv $oldlogpath/error.log $newlogpath/error.log.$lastday
 
##重新生成新的日志,便于nginx记录后续访问事务
kill -USR1 $pid
 
##删除大于30天的日志,释放磁盘空间
find $newlogpath -mtime +30 -exec rm -rf {} \;
 
chmod +x ~/nginx_log.sh
crontab -e
0 0 * * * ~/nginx_log.sh

面试:你写过那些脚本?

一键安装及脚本

日志分割

系统调优

自动检测系统性能

1.5 Nginx压缩功能

支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,这样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相应的CPU资源。

Nginx对文件的压缩功能  是依赖于模块 ngx_http_gzip_module
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装,可在配置文件中加入相应的压缩功能参数对压缩性能进行优化

官方文档: Module ngx_http_gzip_module

#启用或禁用gzip压缩,默认关闭
gzip on | off; 

#压缩比由低到高从1到9,默认为1
gzip_comp_level level;

#禁用IE6 gzip功能
gzip_disable "MSIE [1-6]\."; 

#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k; 

#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1; 

#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;  

#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;     

#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;

#预压缩,先压缩好,不用临时压缩,消耗cpu
gzip_static on | off;

实验:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/406928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux运维-DHCP服务器

DHCP服务器的配置与管理 项目场景 学校各部门共有180台电脑&#xff0c;除了计算机学院的教师会配置电脑的网络连接&#xff0c;其他部门的老师和工作人员均不会&#xff0c;为了提高网络的管理效率&#xff0c;技术人员决定配置一台DHCP服务器&#xff0c;来提供动态的IP地址…

js---回溯算法

在 JavaScript 中实现回溯算法通常需要使用递归来进行搜索。回溯算法通常用于解决组合优化问题、排列组合问题、棋盘类游戏等。回溯算法一般是一个for加递归,for循环横向遍历,递归纵向遍历—以上是回溯算法的基本框架 1、回溯算法求数组所有子集 2、回溯算法求全排列

电商+支付双系统项目------项目部署到服务器

我已经把这个项目的所有模块都做好了。那么&#xff0c;现在我们要做的就是将这个项目部署发布了。其实关于部署发布网上有很多的文章都会教&#xff0c;我就不写哪些很具体的步骤了&#xff0c;我就简单的总结一下怎么部署这个项目&#xff0c;让大家对项目部署有一个整体的认…

【rust】9、reqwest 调用 http

文章目录 一、client1.1 post reqwest 实现的 http server 和 client 用 https://github.com/seanmonstar/reqwest cargo add reqwest -F json cargo add tokio -F full一、client 1.1 post async fn http_post<T: Serialize>(addr: String, body: T) -> Result<…

【centos】【vsftpd】FTP本地用户登录配置

目录 ftp与sftp安装vsftpd和ftp本地用户登录-不限制访问目录本地用户登录-限制访问目录有可能影响连接的问题pam认证selinux策略被动模式防火墙ipv4和ipv6 报错1、 530 Login incorrect2、500 OOPS: vsftpd: refusing to run with writable root inside chroot()3、227 Enterin…

[C++] 如何操作ini文件

什么是ini文件&#xff1f; INI文件&#xff08;.ini&#xff09;是一种常见的配置文件格式&#xff0c;用于存储程序、操作系统或设备驱动程序的配置信息。INI是"Initialization"的缩写&#xff0c;指的是初始化。INI文件通常是纯文本文件&#xff0c;在Windows操作…

《TCP/IP详解 卷一》第3章 链路层

目录 3.1 引言 3.2 以太网 3.3 全双工 省点 自动协商 流量控制 3.4 网桥和交换机 3.5 WiFi 3.6 PPP协议 3.6.1 PPP协议流程 3.7 环回 3.8 MTU和路径MTU 3.9 隧道基础 3.9.1 GRE 3.9.2 PPTP 3.9.3 L2TP 3.10 与链路层相关的攻击 3.11 总结 3.1 引言 城域网&…

如何将负压控制信号转换为正电压

多电源域系统中&#xff0c;时常会出现负电压&#xff0c;比如双电源运放&#xff0c;比如射频功率放大器的栅极偏置电压等。以射频功率放大器的栅极偏置电压和VDD上电为例&#xff0c;是要考虑上电顺序的&#xff0c;参见博文《功放的上电顺序》https://blog.csdn.net/mzldxf/…

什么是nginx 、安装nginx、nginx调优

一、 什么是nginx 1.1 nginx的概念 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 1.2 nginx模块与作用 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错…

设备树详解

设备树(Device Tree)基本概念及作用 设备树(Device Tree)基本概念 在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的…

leet hot 100-1 两数之和

两数之和 原题链接思路代码 原题链接 leet hot 100-1 1. 两数之和 思路 可以把当前数字放到容器里面去 当我们遍历一个新的数字的时候 减一下与目标值的差 然后得到的结果在容器里面查看是否存在 时间复杂度O(n) 空间复杂度(n) 代码 class Solution { public:vector<…

修复 Android 手机陷入恢复模式的 5 种方法

您的手机卡在 Android Recovery 模式且无法退出此模式&#xff1f;无论您按什么按钮组合&#xff0c;甚至在取出并重新插入电池后重新启动手机&#xff0c;手机都会启动回到恢复模式吗&#xff1f; Android卡在recovery模式的情况并不罕见&#xff0c;各种品牌的Android手机都…

EasyRecovery易恢复14好不好用?恢复速度怎么样

EasyRecovery易恢复14的恢复速度相对较快&#xff0c;但具体的恢复速度取决于多个因素。以下是一些影响恢复速度的主要因素&#xff1a; 存储设备性能&#xff1a;恢复速度受到存储设备性能的影响。如果存储设备&#xff08;如硬盘、U盘等&#xff09;的读写速度较慢&#xff…

nginx搭建直播rtmp推流,httpflv拉流环境

背景 工作中发现挺多直播CDN在实现httpflv拉流时都没有使用http chunk编码&#xff0c;而是直接使用no-content-length的做法。所以想自己搭建一个直播CDN支持 http chunk编码。 环境搭建 系统环境 Ubuntu 18.04.4 LTS 软件 nginx-1.18.0 nginx扩展模块 nginx-http-flv-mo…

Ubuntu环境安装MySQL数据库

1.安装过程 打开终端&#xff08;Terminal&#xff09;窗口&#xff0c;使用以下命令更新系统软件包&#xff1a; sudo apt update ubuntu环境安装mysql-server和mysql开发包&#xff0c;包括mysql头文件和动态库文件&#xff0c;命令如下&#xff1a; sudo apt-get instal…

代码随想录算法训练营第60天 | 647.回文子串 + 516.最长回文子序列 + 动态规划总结篇

今日任务 647. 回文子串 516.最长回文子序列 动态规划总结篇 647.回文子串 - Medium 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串…

【Spring面试题】

目录 前言 1.Spring框架中的单例bean是线程安全的吗? 2.什么是AOP? 3.你们项目中有没有使用到AOP&#xff1f; 4.Spring中的事务是如何实现的&#xff1f; 5.Spring中事务失效的场景有哪些&#xff1f; 6.Spring的bean的生命周期。 7.Spring中的循环引用 8.构造方法…

海外媒体发稿:链游媒体宣发推广7种有效策略解析-华媒舍

随着区块链技术的不断发展&#xff0c;链游&#xff08;区块链游戏&#xff09;已经成为了游戏市场中备受瞩目的一部分。仅仅开发出一款出色的链游并不足以成功&#xff0c;而有效的宣发推广策略则是不可或缺的。 本文将介绍7种有效的链游媒体宣发推广策略&#xff0c;帮助您了…

一、初始 Vue

1、Vue 1.1 Vue简介 1.1.1 Vue.js 是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第…

wordpress免费主题模板

免费大图wordpress主题 首页是一张大图的免费wordpress主题模板。简洁实用&#xff0c;易上手。 https://www.jianzhanpress.com/?p5857 wordpress免费模板 动态效果的wordpress免费模板&#xff0c;banner是动态图片效果&#xff0c;视觉效果不错。 https://www.jianzhan…
最新文章