【05】Nginx第三方模块和变量

Nginx第三方模块和变量

1.1 Nginx第三方模块:echo

要安装第三方模块需要对Nginx重新编译
echo模块 https://github.com/openresty/echo-nginx-module

我们先看看未安装模块时的提示是怎么样的

# 
location /echo {
                index   index.html;
                default_type    text/html;
                echo "hello world! main-->";
                echo_reset_timer;
                echo_location /sub1;
                echo_location /sub2;
                echo    "took $echo_timer_elapsed sec for total.";
        }

        location /sub1 {
                echo_sleep 1;
                echo sub1;
        }

        location /sub2 {
                echo_sleep 1;
                echo sub2;
        }

#
# 检查语法时报错
[root@localhost@conf]->nginx -t
nginx: [emerg] unknown directive "echo" in /apps/nginx/conf/conf.d/pc.conf:55
nginx: configuration file /apps/nginx/conf/nginx.conf test failed

知道报错原因,开始安装echo模块

[root@localhost@conf]->yum install git -y
# 要在github上下载模块先安装个git是吧
#
[root@localhost@conf]->git clone https://github.com/openresty/echo-nginx-module
#
# 下载好后准备重新编译
#
# 先看看原先输入的编译选项
[root@localhost@conf]->nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --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
#
# 找到解压文件路径
[root@localhost@/]->find / -name 'nginx-1.16*'
/usr/local/src/nginx-1.16.1.tar.gz
/usr/local/src/nginx-1.16.1
#
[root@localhost@/]->cd /usr/local/src/nginx-1.16.1/
[root@localhost@nginx-1.16.1]->./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=/apps/nginx/mods/echo-nginx-module
# 这里我把这个模块拷贝到了/apps/nginx/mods/
#
[root@localhost@nginx-1.16.1]->make&&make install
#
# 检查语法
[root@localhost@conf]->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
# 通过
#
# 需要重启nginx模块
[root@localhost@conf]->systemctl restart nginx 
#
# 测试

在这里插入图片描述

当你成功安装好该模块后,我们就可以愉快♂的来学习变量了

1.2 Nginx 变量使用

Nginx中的变量分为内置变量和自定义变量,内置变量是Nginx自带的,通过变量我们可以知道许多有意思的值。

$remote_addr
# 客户端地址,公网的IP
#
$args
# URL地址
#
$document_root
# 当前会话请求的系统目录
#
$document_uri
# 不含指令的URI
#
$host
# 请求的host名称
#
$http_user_agent
# 客户端浏览器详情
#
$http_cookie
# 客户端cookie信息
#
$limit_rate 10240
# 如果设置了limit_rate则会显示网络速率,否则显示0
#
$remote_port
# 客户端发出请求的端口
#
$remote_user
# 经过Auth Basic Module验证过的用户名
#
$request_body_file
# 做反向代理时候发给后端服务器的本地资源名称
#
$request_filename
# 当前请求的资源文件路径名称,实际上是由root和alias生成过后的一个绝对路径
#
$request_method
# 请求资源的方法:GET/PUT/DELETE等
#
$request_uri
# 包含请求参数的原始URI,不包含主机名
#
$scheme
# 请求的协议
#
$server_protocol
# 协议版本
#
$server_addr
# 服务器IP地址
#
$server_name
# 服务器主机名
#
$server_port
# 请求的服务器端口

1.3 自定义变量

方法很简单

set $variable value;
echo $variable
# 一般多使用在server,location,if块中

了解这么多干啥用?
你懂的

<think>首先,用户的问题是关于在Linux系统下,不使用第三方工具脚本,按天切割Nginx日志的方法。用户强调不要使用第三方工具脚本,所以我需要基于标准的Linux工具Nginx功能来回答。 从系统级指令中,我必须使用$...$格式表示行内数学表达式,但在这个上下文中,可能没有数学表达式,所以我需要确保如果出现变量如文件名,用合适的格式。 用户提供了几个引用: - 引用[1]: 提到了Python脚本实现日志切割,但用户指定不要脚本,所以不能用这个。 - 引用[2]: 关于编译Nginx时添加fancyindex模块,但这不是直接相关。 - 引用[3]: Nginx的核心组成日志文件。 - 引用[4]: 日志配置的例子。 用户的问题核心是:不使用第三方工具脚本,按天切割Nginx日志。 我需要回忆Nginx的日志切割功能。Nginx本身不会自动切割日志;它依赖于外部工具如logrotate或自定义脚本。但用户说不要第三方工具脚本,所以我必须找到一个不使用额外工具的方法。 思考Nginx内置功能:Nginx可以通过发送信号重新打开日志文件来实现切割。具体来说: - 发送USR1信号给Nginx主进程,会使Nginx重新打开日志文件。这时,可以手动重命名当前的日志文件,然后发送信号。 但是,用户说不使用脚本,所以操作应该是手动执行命令。 步骤可能包括: 1. 重命名当前的访问日志文件或错误日志文件,添加日期后缀。 2. 发送USR1信号给Nginx进程,让它重新打开日志文件。 3. 这个操作需要手动执行,或者用cron定时任务,但cron任务可能被视为脚本,用户说不要脚本,所以我应该描述手动方式。 用户说“不使用第三方工具脚本”,但cron是Linux内置工具,不是第三方。所以,我可以建议使用cron定时执行命令。 命令本身不是脚本,是单行命令。 例如: - 创建一个cron job,每天执行: mv /path/to/access.log /path/to/access-$(date +%Y%m%d).log kill -USR1 $(cat /path/to/nginx.pid) 但这涉及到命令,用户可能认为这是脚本?系统级指令说“不使用第三方工具脚本”,所以简单的命令应该可以。 在引用[1]中,有Python脚本,但用户拒绝了。 另一个方式是使用logrotate,但logrotate是第三方工具?logrotate通常是Linux系统自带的日志管理工具,在大多数发行版中默认安装,所以可能不算第三方。 用户指定“不使用第三方工具”,logrotate是标准工具,我认为可以接受?但用户说“不使用第三方工具脚本”,在问题中是“不使用第三方工具脚本”,在引用中提到了logrotate,所以或许logrotate是选项。 在引用[1]开头说“Linux日志切割工具Logrotate”,所以logrotate是标准工具。 但用户的问题:“我想查找在Linux系统下,不使用第三方工具脚本,按天切割Nginx日志的方法”,所以明确不要脚本第三方工具。 logrotate不是第三方工具;它是Linux系统的一部分。 同样,cron是内置。 所以,我可以建议使用logrotate配置。 或者手动方式。 最佳实践是使用logrotate。 在引用[4]中提到了日志配置,但那是Nginx配置,不是切割。 回忆logrotate: - Logrotate可以配置为每天切割Nginx日志。配置文件通常位于/etc/logrotate.d/nginx。 例如: /var/log/nginx/*.log { daily missingok rotate 52 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript } 这使用postrotate脚本,但logrotate是系统工具,脚本是配置的一部分。 用户说不要脚本,这可能包括logrotate的postrotate部分? 用户说“不使用第三方工具脚本”,logrotate是系统工具,所以应该可以。 为了严格遵循“不使用脚本”,我可以说手动执行命令。 但手动每天执行不实用。 或许描述方法而不提供脚本。 在回答中,我可以解释过程。 另一个方式:Nginx有一个access_log指令支持日志切割吗?不,Nginx自己不切割日志;它只写入日志文件。 所以,标准方式是使用信号或logrotate。 参考用户的上一个问题:在历史中,用户可能问过类似,但在这个对话中,是新问题。 用户提到“参考站内引用”,但内容是给定的。 现在,构建回答。 回答结构: - 解释Nginx日志切割原理:通过发送USR1信号使Nginx重新打开日志文件。 - 方法1:手动切割 - 每天手动重命名日志文件并发送信号。 - 方法2:使用logrotate配置自动切割(虽然logrotate是工具,但内置)。如果用户坚持不要工具,则只提手动。 用户说“不使用第三方工具脚本”,logrotate是内置工具。 在Linux中,logrotate是标准包。 我认为可以建议。 确保语言中文。 最后,生成相关问题。 步骤: 1. 介绍方法。 2. 描述步骤。 3. 可能提供示例命令。 4. 添加引用标识:用户提供了引用,我应该在相关部分添加[^1]等。 例如,在提到信号时,参考引用[1][4]。 引用[1]有kill -USR1命令。 引用[4]有日志配置。 生成相关问题。 回答结构清晰。 </think>### Linux系统下不使用第三方工具脚本按天切割Nginx日志的方法 在Linux系统中,Nginx本身不提供内置的日志切割功能,但可以通过系统信号机制手动实现日志切割,而无需依赖任何第三方工具(如Logrotate)或自定义脚本(如Python脚本)。核心原理是:通过发送`USR1`信号给Nginx主进程,使其重新打开日志文件。之后,您可以手动重命名当前日志文件以添加日期后缀。这种方法完全基于Linux内置命令Nginx功能,符合您的要求(不使用第三方工具脚本)。以下是详细步骤注意事项。 #### 切割原理说明 - Nginx在运行时,会将日志写入指定的文件(如`access.log`或`error.log`)。当发送`USR1`信号时,Nginx会关闭当前日志文件并重新打开一个新文件(文件名不变),这相当于“切割”日志[^1]。 - 手动重命名日志文件不会影响Nginx的写入,因为Nginx是根据文件描述符(inode)写入的。只有在发送信号后,Nginx才会切换到新文件。 - 按天切割需要您每天手动执行命令,或依赖Linux内置的定时任务工具(如`cron`)。`cron`是Linux系统级调度工具,不属于第三方工具或脚本。 #### 切割步骤(手动执行) 以下是按天切割Nginx日志的具体操作步骤。假设Nginx日志目录为`/var/log/nginx/`(根据您的实际配置调整),Nginx PID文件路径通常为`/var/run/nginx.pid`(您可以在Nginx配置文件`nginx.conf`中确认 `pid` 指令的设置)[^3]。 1. **重命名当前日志文件(添加日期后缀)**: - 在每天固定时间(如午夜),手动登录Linux系统。 - 使用内置命令重命名日志文件,添加昨天的日期(以保证切割发生在日志文件对应日期结束时)。例如: ```bash mv /var/log/nginx/access.log /var/log/nginx/access-$(date -d "yesterday" +%Y%m%d).log ``` - 这里,`$(date -d "yesterday" +%Y%m%d)` 生成昨天的日期(格式如`20231001`)。您可以根据需要调整日期格式,例如`+%Y-%m-%d`。 - 如果需要切割错误日志,重复此步骤:`mv /var/log/nginx/error.log /var/log/nginx/error-$(date -d "yesterday" +%Y%m%d).log`. 2. **发送信号使Nginx重新打开日志文件**: - 使用`kill`命令发送`USR1`信号到Nginx主进程(进程ID从PID文件获取): ```bash kill -USR1 $(cat /var/run/nginx.pid) ``` - 这会强制Nginx创建新的`access.log``error.log`文件,并继续写入新日志[^1][^4]。 - 验证信号是否生效:检查新日志文件是否生成(`ls /var/log/nginx/access.log`)。 3. **(可选)自动化手动命令**: - 如果您希望每天自动执行,可以使用Linux内置的`cron`定时任务(`cron`是系统级工具,非第三方)。编辑cron表: ```bash crontab -e ``` - 添加一行,指定每天00:00执行切割命令(示例): ``` 0 0 * * * mv /var/log/nginx/access.log /var/log/nginx/access-$(date -d "yesterday" +%Y%m%d).log && kill -USR1 $(cat /var/run/nginx.pid) ``` - 这会将重命名发送信号组合成一个命令,避免脚本文件。 - 注意:确保命令路径正确,如果Nginx日志目录或PID文件路径不同,需相应调整。 #### 注意事项 - **安全性**: - 操作前备份日志文件,防止误删除。 - 确保您有权限操作日志目录(通常需`root`用户)。 - 发送信号后,检查Nginx是否正常工作:`systemctl status nginx` 或 `ps aux | grep nginx`。 - **日志文件管理**: - 切割后的日志文件(如`access-20231001.log`)不会自动压缩或删除。您需手动清理旧文件(例如使用`rm`命令)。 - 在Nginx配置文件(`nginx.conf`)中,确保`access_log``error_log`指令使用固定路径(如`access_log /var/log/nginx/access.log;`),否则切割可能失败[^3][^4]。 - **局限性**: - 手动方法简单但依赖人工干预,不适合高可用环境。 - 如果Nginx进程崩溃,PID文件可能无效;此时需通过`ps aux | grep nginx`获取主进程ID再发送信号。 - 对于大规模日志,建议结合日志轮转策略(如logrotate),但您要求不使用第三方工具,因此这里不展开[^1][^4]。 #### 验证方法 - 切割后,检查新日志文件是否生成:`ls -l /var/log/nginx/access.log`(应为新文件)。 - 确认Nginx日志写入正常:`tail -f /var/log/nginx/access.log`。 此方法完全基于Linux标准命令(如`mv`, `date`, `kill`, `cron`)Nginx信号机制,符合“不使用第三方工具脚本”的要求。如果您偏好自动化,cron是可靠的内置解决方案[^1][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值