nginx高级访客日志切割
切割理念(先纯手动的去切割日志,备份日志)
- 给nginx进程发送信号,让nginx重新生成一个新日志文件,这就是一个日志切割根本
/var/log/nginx/access.log.bak # 1.备份原本日志文件
nginx reload reopen信号
# 配置文件中定义的日志文件名,是这个
2. /var/log/nginx/access.log # 重新生成新日志文件,让新日志往这里去写
# 手动切割,修改日志
#1.准备好旧的日志文件,测试写入大量的日志记录,先用第一种办法,for循环
[root@web-8 ~]#for num in {1..10000};do curl 10.0.0.8 ; done
#2.使用支持多进程,并发写入的工具,如ab命令 apache提供的性能压测命令,给网站发送支持并发的大量的http请求。
[root@web-8 ~]#yum install httpd-tools -y
# 发送10000个http请求,且招来100个人同时发请求
ab -c 100 -n 10000 http://10.0.0.8/
# 3.当前日志数量
[root@web-8 /var/log/nginx]#cat all-server-accesss.log |wc -l
20000
# 3.让你有一个已经记录了大量日志的文件,得进行日志切割了
切割思路就是,1.先重命名,等于备份() 2. 重新记录nginx日志 (/var/log/nginx/access.log) 按天记录日志 (每天夜里的 整点分进行日志备份,日志)
按天,生成一个新的日志文件
# 备份旧日志(模拟是前一天的旧日志)
cd /var/log/nginx && mv all-server-accesss.log all-server-accesss.log.$(date '+%F')
# 还得生成新日志,得继续记录
给nginx进程发送reopen信号,重新生成新日志
# 用这种方式,可以最精确的提取进程id号。
kill -USR1 $(ps -ef|grep nginx |grep master | awk '{print $2}')
此时会生成新的日志
[root@web-8 /var/log/nginx]#ll
total 6084
-rw-r--r-- 1 www root 0 May 23 10:10 all-server-accesss.log
-rw-r--r-- 1 root root 4160000 May 23 10:08 all-server-accesss.log.2022-05-23---10:04:17
-rw-r--r-- 1 www root 700 May 23 10:10 error.log
此时新日志,就会记录到这个新的日志文件中了
==> all-server-accesss.log <==
/index.html 10.0.0.8 - - [23/May/2022:10:10:56 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html 10.0.0.8 - - [23/May/2022:10:10:57 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html 10.0.0.8 - - [23/May/2022:10:10:58 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html 10.0.0.8 - - [23/May/2022:10:10:58 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
对于旧的日志 你最好 创建文件夹去分类管理他们
shell脚本形式
.你得先有解决问题的思路,然后将思路转变为linux命令,再优化为shell脚本
#!/bin/bash
# 源日志目录
logs_path="/var/log/nginx"
# 备份日志目录
back_logs_path="${logs_path}/$(date -d 'yesterday' +'%F')"
# 创建备份目录,以日期命名,注意,每天零点整切割,开始记录新的一天的日志,备份目录应该是昨天
mkdir -p ${back_logs_path}
# 重命名旧日志名,注意日期
cd ${logs_path} && find . -type f |xargs -i mv {} {}.$(date -d 'yesterday' +'%F')
# 移动旧日志文件到该目录下
cd ${logs_path} && find . -type f |xargs -i mv {} ${back_logs_path}
# 重新生成新日志
kill -USR1 `ps -ef|grep nginx |grep master|awk '{print $2}'`
添加到定时任务
crontab -e
0 0 * * * /bin/bash /my_shell/back_nginx.sh
logrotate工具切割形式
# 看看该日志切割工具,支持哪些软件
# 默认改工具,对nginx的支持.
# 这里的写法,是针对你的yum安装的nginx,实现日志切割
[root@web-8 /var/log/nginx]#cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天切割
missingok # 忽略错误
rotate 52 # 最多保留多少个存档
compress # 切割后且压缩
delaycompress # 延迟压缩动作在下一次切割
notifempty # 日志为空就不切割
create 640 nginx adm # 切割的文件权限
sharedscripts # 共享脚本,结果为空
postrotate # 收尾动作,重新生成nginx日志
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript # 结束动作
}
# 如果说你要用这个logrotate工具对你的编译安装的淘宝nginx实现日志切割,你还会写吗?
# 会的扣 1 不会扣 2
# 区别是1.确定日志目录 /opt/ngx/logs/ ; 2.给nginx主进程发送USR1信号(tengine是生成了nginx.pid文件,还是没有)
# 生成切割脚本
# 针对你编译安装的 淘宝nginx,实现自动的日志切割
cat > /etc/logrotate.d/tengine <<EOF
/opt/ngx/logs/*.log {
daily # 每天切割
missingok # 忽略错误
rotate 52 # 最多保留多少个存档
compress # 切割后且压缩
delaycompress # 延迟压缩动作在下一次切割
notifempty # 日志为空就不切割
create 640 nginx adm # 切割的文件权限
sharedscripts # 共享脚本,结果为空
postrotate # 收尾动作,重新生成nginx日志
if [ -f /opt/ngx/sbin/tengine.pid ]; then
kill -USR1 `cat /opt/ngx/sbin/tengine.pid`
fi
endscript # 结束动作
}
看具体的效果,是否理解
先清理你刚才的shell的定时任务
重新生成nginx日志环境,然后测试工具
[root@web-8 /var/log/nginx]#crontab -e
crontab: installing new crontab
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#ntpdate -u ntp.aliyun.com
23 May 10:59:03 ntpdate[4346]: step time server 203.107.6.88 offset -47699.063535 sec
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#date
Mon May 23 10:59:14 CST 2022
应该先修改时间,作为测试
测试logrotate工具是否实现日志切割
手动实现日志切割,执行该工具
logrotate -f /etc/logrotate.d/nginx
被切割后的日志
[root@web-8 /var/log/nginx]#ll -h
total 21M
-rw-r----- 1 www adm 10M May 24 00:01 all-server-accesss.log
-rw-r--r-- 1 root root 5.0M May 23 10:59 all-server-accesss.log.1
-rw-r----- 1 www adm 0 May 24 00:01 error.log
-rw-r--r-- 1 root root 700 May 24 00:01 error.log.1
logrotate工具,本身会压缩备份的日志文件,是因为,压缩工作,被延迟到了下一次切割
logrotate -f /etc/logrotate.d/nginx
等于实现了第二次切割动作,本次会进行日志压缩了
最终的操作,应该吧这个切割命令,写入到定时任务即可
[root@web-8 /var/log/nginx]#crontab -l
00 00 * * * logrotate -f /etc/logrotate.d/nginx
目录索引、下载服务
实现一个类似于ftp工具的功能
1.先准备好一个用于共享的数据目录
2.部署server虚拟主机,然后去展示这些数据,完事
1. 准备一个 rpm包的 目录
2. 提供该rpm包目录的展示
mkdir /0224rpms
[root@web-8 /0224rpms]#yum install python3 python3-devel --downloadonly --downloaddir=/0224rpms
3.创建nginx的虚拟主机
[root@web-8 /0224rpms]#cat /etc/nginx/conf.d/autoindex.conf
server {
listen 11111;
server_name _;
location / {
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
root /0224rpms;
}
}
4.重启nginx实现该目录索引功能
[root@web-8 /0224rpms]#systemctl reload nginx
如何明确,该虚拟主机是否可用
[root@web-8 /0224rpms]#netstat -tunlp |grep 11111
tcp 0 0 0.0.0.0:11111 0.0.0.0:* LISTEN 4361/nginx: master
5.测试访问即可
此时这个虚拟主机就提供了基于http请求的文件下载功能
6.利用wget下载
wget http://10.0.0.8:11111/python3-3.6.8-18.el7.x86_64.rpm
参数说明
Syntax: autoindex on | off;
Default:
autoindex off;
Context: http, server, location
# autoindex on ; 表示开启目录索引
Syntax: autoindex_localtime on | off;
Default:
autoindex_localtime off;
Context: http, server, location
# autoindex_localtime on; 显示文件为服务器的时间
Syntax: autoindex_exact_size on | off;
Default:
autoindex_exact_size on;
Context: http, server, location
# autoindex_exact_size on; 显示确切bytes单位
# autoindex_exact_size off; 显示文件大概单位,是KB、MB、GB
若目录有中文,nginx.conf中添加utf8编码
charset utf-8,gbk;
连接数监控
http://nginx.org/en/docs/http/ngx_http_stub_status_module.html 模块介绍
该ngx_http_stub_status_module模块提供对基本状态信息的访问。
默认情况下不构建此模块,应使用 --with-http_stub_status_module 配置参数启用它。
Nginx状态信息(status)介绍 Nginx软件在编译时又一个with-http_stub_status_module模块,这个模块功能是记录Nginx的基本访问状态信息,对于想了解nginx的状态以及监控nginx非常有帮助。
让使用者了解Nginx的工作状态。
要想使用状态模块,在编译时必须增加--with-http_stub_status_module参数。
参数解释
Active connections
当前活动客户端连接数,包括Waiting连接数。
accepts
接受的客户端连接总数。
handled
处理的连接总数。
accepts 通常,除非已达到某些资源限制(例如, worker_connections限制) ,否则该参数值相同。
requests
客户端请求的总数。
Reading
nginx 正在读取请求标头的当前连接数。
Writing
nginx 将响应写回客户端的当前连接数。
Waiting
当前等待请求的空闲客户端连接数。
# 注意
一个tcp连接,可以发起多个http请求
可以通过修改保持连接参数修改
keepalive_timeout 0; 表示关闭长连接
看下你的nginx支持这个模块吗
nginx -V 必须有这个模块--with-http_stub_status_module
# 创建虚拟主机文件,查看status功能
[root@web-8 /etc/nginx/conf.d]#cat status.conf
# 作用就是让你访问 ip:9999可以精确定位到这个虚拟主机
server{
listen 9999;
server_name _;
stub_status on;
access_log off; # 因为它不是一个基于http请求响应的网站,仅仅是展示连接的信息,都不需要写location。
}
重新读取
[root@web-8 /etc/nginx/conf.d]#cat status.conf
server{
listen 9999;
server_name localhost;
stub_status on;
access_log off;
}
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#systemctl reload nginx
为什么激活数是2
基于IP的访问限制
模块
1.配置语法
句法: allow address | CIDR | unix: | all;
默认: —
语境: http, server, location,limit_except
允许访问指定的网络或地址。如果指定了特殊值unix:(1.5.1),则允许访问所有 UNIX 域套接字。
句法: deny address | CIDR | unix: | all;
默认: —
语境: http, server, location,limit_except
拒绝对指定网络或地址的访问。如果指定了特殊值unix:(1.5.1),则拒绝所有 UNIX 域套接字的访问。
allow xxxxx;
deny xxxx;
他俩的放置顺序;
第一题
限制只允许10.0.0.0~10.0.0.255范围的IP访问(禁止其他网段的访问)
创建虚拟主机,完成该功能
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf
server {
listen 22334;
server_name _;
location / {
allow 10.0.0.0/24;
deny all;
root /www/deny-allow;
index index.html;
}
}
创建测试数据,查看访问情况
[root@web-8 /etc/nginx/conf.d]#mkdir -p /www/deny-allow
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#echo 'I am web-8 , test deny and allow !!!!!!!!' > /www/deny-allow/index.html
[root@web-8 /etc/nginx/conf.d]#systemctl restart nginx
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#netstat -tunlp|grep 22334
tcp 0 0 0.0.0.0:22334 0.0.0.0:* LISTEN 7402/nginx: master
1. 用win去访问,可以吗? 可以的
http://10.0.0.8:22334/
2. 用61机器去访问,
# 网卡的流量,网段是对应起来的
eth0 10.0.0.61
eth1 172.16.1.61
curl 10.0.0.8:22334 # 从61机器的10.0.0.61发出
curl 172.16.1.8:22334 # 从61机器的172.16.1.61发出
提示
只写一个allow的话,等于没有任何意义,必须做好deny限制,才有实际意义。
第二题
限制只允许172.16.1.0 ~ 172.16.1.255 范围的IP访问,禁止其他任意的地址访问。
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf
server {
listen 22334;
server_name _;
location / {
#allow 10.0.0.0/24;
allow 172.16.1.0/24;
deny all; # 拒绝客户端访问该网页根目录下的资源,返回403权限不足
root /www/deny-allow;
index index.html;
}
}
你发现,处于同一个内网环境下的 ,有172网段的机器是通的,
比如win这回访问可以通码? 可以 1 不可以 2
第三题
- 限制只允许windows访问(禁止其他机器访问,比如任意的 10.0.0.61 任意的172.16.1.52)
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf
server {
listen 22334;
server_name _;
location / {
# allow 10.0.0.0/24;
# allow 172.16.1.0/24;
allow 10.0.0.1;
deny all; # 拒绝客户端访问该网页根目录下的资源,返回403权限不足
root /www/deny-allow;
index index.html;
}
}
# 待会试试,用不同网段的客户端ip,访问,查看权限
# 测试几个客户端
10.0.0.1 通 ,只有这一个ip地址是通的.
10.0.0.61 不通
172.16.1.52 不通
第四题
- 限制拒绝10.0.0.0~10.0.0.255范围的IP访问(得允许其他网段访问)
(这个ip限制规则,自上而下的匹配,匹配到规则后,就不会继续向后匹配了)
此时只能通过内网的172网卡去访问这个机器了
# 配置如下
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf
server {
listen 22334;
server_name _;
location / {
deny 10.0.0.0/24;
root /www/deny-allow;
index index.html;
}
}
# 通过如下这几个客户端试试,先用10网段的试试
发现10网段全部被拒绝
发现172网段是允许被访问的
第五题
限制只拒绝windows访问。其他人都允许访问
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf
server {
listen 22334;
server_name _;
location / {
deny 10.0.0.1;
root /www/deny-allow;
index index.html;
}
}
10.0.0.1 只有它不能访问
基于用户认证的访问限制
简单说就是访问网站需要输入账号密码
给虚拟主机,加上密码验证
1. 创建密码,密码不是一个简单的纯文本文件,得基于密码数据库的存储
有工具帮你完成htpasswd这个工具去创建密码文件
yum -y install httpd-tools
创建密码文件
# -b 免交互,输入账号密码即可
# -c 设置密码写入到什么文件
htpasswd -b -c /etc/nginx/auth_passwd yuchao01 yuchao666
[root@web-8 /etc/nginx/conf.d]#cat /etc/nginx/auth_passwd
yuchao01:$apr1$.D27Ssim$P9KebeNNrgXWUIbo1fZs40
2. 让nginx 的虚拟主机,支持该功能,并且由于是内网文档,让他只在内网下可访问
[root@web-8 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#cat auth_basic.conf
server {
listen 172.16.1.8:33334;
charset utf-8;
server_name _;
location / {
auth_basic "please input your account password";
auth_basic_user_file /etc/nginx/auth_passwd;
root /www/auth-html;
index index.html;
}
}
3.创建测试数据
[root@web-8 ~]#mkdir -p /www/auth-html
[root@web-8 ~]#
[root@web-8 ~]#echo '我是用于验证账户密码的,你不输入密码,别想看到我!!!' > /www/auth-html/index.html
4.启动测试访问
用win去测试
10.0.0.8:33334 觉得通的 扣 1 不通 2,这一次都不是权限之类的问题,而是tcp/ip都没有建立。直接提示网络连接失败
这里由于我们是学习环境,linux虚拟机的网段,都是vmware提供的纯局域网
在企业里,也会有内网环境,但是有网工给你配置好了所有的环境
你的办公电脑,会有该内网的ip,可以访问到该内网下的资料(需要进行一系列的网络转发设置)
只能在内网环境下,去访问了
172,只能是linux下的访问
# 咱们临时测试,还是先用windows去访问该站点
# 理解了nginx虚拟主机,绑定网段即可,
# 还是改为,允许让windows也可以访问,修改监听的地址,放置到10网段
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#netstat -tunlp|grep 33334
tcp 0 0 10.0.0.8:33334 0.0.0.0:* LISTEN 7765/nginx: master
[root@web-8 /etc/nginx/conf.d]#cat auth_basic.conf
server {
#listen 172.16.1.8:33334;
listen 10.0.0.8:33334;
charset utf-8;
server_name _;
location / {
auth_basic "please input your account password";
auth_basic_user_file /etc/nginx/auth_passwd;
root /www/auth-html;
index index.html;
}
}
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#netstat -tunlp|grep 33334
tcp 0 0 10.0.0.8:33334 0.0.0.0:* LISTEN 7765/nginx: master
# 此时你就可以基于10网段去访问了
nginx限流模块
1.知道用法即可,生产下的限流,更多的是后端框架中限制,nginx这里一般不做,可能导致请求出错。知道用法,以后看到企业里在用,会维护即可。
2.以及理解限流的概念。
计算机程序,会给网站带来极大的恶意流量,导致服务器压力多大,以及网站所有的负载都会很大
www.taobao.com
服务端
nginx 解析这用户的请求
tcp/ip连接
大量的客户端,大量的ip,去访问服务器,导致服务器建立的大量的tcp连接
(这些大量的ip都是恶意ip,肉鸡一类的机器,而非正常用户的ip)
默认情况下,服务器可建立的连接时65535个tcp连接
1.官网模块
https://nginx.org/en/docs/http/ngx_http_limit_req_module.html
2.配置语法
限速规则语法
https://docshome.gitbook.io/nginx-docs/he-xin-gong-neng/http/ngx_http_limit_req_module
ngx_http_limit_req_module 模块(0.7.21)用于限制每个已定义 key 的请求处理速率,特别是来自单个 IP 地址请求的处理速率。限制机制采用了 leaky bucket (漏桶算法)方法完成。
3.参数示例
# 1.定义一个限速规则
# 定义限速区域,保持在10兆字节的区域one,该区域的平均处理请求每秒不能超过1个。
# $binary_remote_addr 变量的大小始终为 4 个字节,在64位机器上始终占用64字节
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_zone $binary_remote_addr zone=two:10m rate=1r/s;
参数解释
limit_req_zone # 引用限速模块
binary_remote_addr # 判定条件,远程的客户端IP
zone # 定义限速区域名称,内存大小
rate # 限速规则,1秒只能1个请求
# 2.引用限速规则
limit_req zone=two burst=5;
limit_req # 引用哪一个限速区域
burst=5 # 令牌桶、平均每秒不超过 1 个请求,并且突发不超过5个请求。
nodelay # 如果不希望排队堆积的请求过多,可以用这个参数。
4.实际用法
限速规则是1秒一个请求
提供3个vip特殊名额
[root@web-9 /etc/nginx/conf.d]#cat www.yuchaoit.conf
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name www.yuchaoit.cn;
charset utf-8;
access_log /var/log/nginx/www.yuchaoit.log;
error_log /var/log/nginx/error.www.yuchaoit.log;
error_page 404 /404.html;
limit_req zone=one burst=3 nodelay;
location / {
root /usr/share/nginx/html/game; index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
5.访问测试
正常限速内
[root@master-61 ~]#for i in {1..10};do curl -I www.yuchaoit.cn;sleep 1;done
超速访问情况
[root@master-61 ~]#for i in {1..20};do curl -I www.yuchaoit.cn;sleep 0.5 ;done
nginx内置变量
官网
https://nginx.org/en/docs/varindex.html
学这些内置nginx变量,目的是为了在配置文件中使用,如
日志功能会用
url跳转时用
等
$args #请求中的参数值
$query_string #同 $args
$arg_NAME #GET请求中NAME的值
$is_args #如果请求中有参数,值为"?",否则为空字符串
$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri #同 $uri
$document_root #当前请求的文档根目录或别名
$host #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名
$hostname #主机名
$https #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent #传输给客户端的字节数
$connection #TCP连接的序列号
$connection_requests #TCP连接当前的请求数量
$content_length #"Content-Length" 请求头字段
$content_type #"Content-Type" 请求头字段
$cookie_name #cookie名称
$limit_rate #用于设置响应的速度限制
$msec #当前的Unix时间戳
$nginx_version #nginx版本
$pid #工作进程的PID
$pipe #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr #客户端地址
$remote_port #客户端端口
$remote_user #用于HTTP基础认证服务的用户名
$request #代表客户端的请求地址
$request_body #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method #HTTP请求方法,通常为"GET"或"POST"
$request_time #处理客户端请求使用的时间; 从读取客户端的第一个字节开始计时
$request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme #请求使用的Web协议,"http" 或 "https"
$server_addr #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name #服务器名
$server_port #服务器端口
$server_protocol #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status #HTTP响应代码
$time_iso8601 #服务器时间的ISO 8610格式
$time_local #服务器时间(LOG Format 格式)
$cookie_NAME #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie
$http_post
$http_referer
$http_user_agent
$http_x_forwarded_for
$sent_http_NAME #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding
nginx添加第三方模块
1.理念
nginx除了支持内置模块,还支持第三方模块,但是第三方模块需要重新编译进nginx。
(重新生成nginx二进制命令)
1.如你的nginx默认不支持https
2.给你的nginx添加echo模块,用于打印nginx的变量。
2.编译添加echo模块
echo-nginx-module 模块可以在Nginx中用来输出一些信息,可以用来实现简单接口或者排错。
# 1.模块网址 https://github.com/openresty/echo-nginx-module
yum -y install gcc-c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
# 3.准备好nginx编译环境
yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel gzip gcc gcc-c++ make wget httpd-tools vim -y
groupadd www -g 666
useradd www -u 666 -g 666 -M -s /sbin/nologin
mkdir -p /yuchaoit/ ; cd /yuchaoit/
# 下载echo模块
yum install git -y
git clone https://github.com/openresty/echo-nginx-module.git
# 4.编译nginx
wget http://nginx.org/download/nginx-1.19.0.tar.gz
tar -zxf nginx-1.19.0.tar.gz
cd nginx-1.19.0
./configure \
--user=www \
--group=www \
--prefix=/opt/nginx-1-19-0 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-pcre \
--add-module=/yuchaoit/echo-nginx-module
# 5.编译且安装
make && make install
# 6.创建快捷方式
ln -s /opt/nginx-1-19-0/sbin/nginx /usr/sbin/
# 7.验证模块
nginx -V
3.创建新配置文件,验证echo模块
[root@web-9 /etc/nginx/conf.d]#cat echo.conf
server {
listen 11444;
server_name localhost;
charset utf-8;
location / {
echo "yuchaoit.cn welcome you!";
echo $uri;
echo $document_uri;
echo $remote_addr;
echo $remote_port;
echo $http_user_agent;
}
}
4.客户端访问
[root@master-61 ~]#curl 10.0.0.9:11444/hello_chaoge
yuchaoit.cn welcome you!
/hello_chaoge
/hello_chaoge
10.0.0.61
42378
curl/7.29.0
location高级实战
location是nginx的核心重要功能,可以设置网站的访问路径,一个web server会有多个路径,那么location就得设置多个。
Nginx的locaiton作用是根据用户请求的URI不同,来执行不同的应用。
针对用户请求的网站URL进行匹配,匹配成功后进行对应的操作。
官网文档
https://nginx.org/en/docs/http/ngx_http_core_module.html#location
1.语法介绍
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
官网用法
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
测试用法,如果定义了如上的5个location,则
http://yuchaoit.cn/ 匹配A
http://yuchaoit.cn/hello 匹配B
http://yuchaoit.cn/documents/hello 匹配C
http://yuchaoit.cn/images/葫芦娃.gif 匹配D
http://yuchaoit.cn/documents/德玛西亚.gif 匹配E
2.location语法优先级
优先级从高到低
有符号的,才有优先级,否则都往后排
3.测试location实战
# 配置文件如下
server {
listen 22333;
server_name _;
# 最低级匹配,不符合其他locaiton就来这
# 属于通用url规则
location / {
return 200 "location / \n";
}
# 优先级最高,等于号后面可以指定url
location = / {
return 200 "location = / \n";
}
#以/documents/开头的url,来这里,如符合其他locaiton,则以其他优先
location /documents/ {
return 200 "location /documents/ \n";
}
#匹配任何以/images/开头的请求,不匹配正则
location ^~ /images/ {
return 200 "location ^~ /images/ \n";
}
#匹配任何以.gif结尾的请求,支持正则
location ~* \.(gif|jpg|jpeg)$ {
return 200 "location ~* \.(gif|jpg|jpeg) \n";
}
access_log off;
}
4.客户端测试访问
[root@master-61 ~]#
# 精确匹配
[root@master-61 ~]#curl 10.0.0.9:22333
location = /
[root@master-61 ~]#
# 依然是精确匹配
[root@master-61 ~]#curl 10.0.0.9:22333/
location = /
[root@master-61 ~]#
# 没有满足的条件,因此匹配 /
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit
location /
[root@master-61 ~]#
# 没有满足的条件,因此匹配 / ,这里注意结尾的斜线
[root@master-61 ~]#curl 10.0.0.9:22333/documents
location /
[root@master-61 ~]#
# 符合匹配规则,匹配到了location /documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/
location /documents/
[root@master-61 ~]#
# 符合匹配规则,匹配到了location /documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.html
location /documents/
[root@master-61 ~]#
# 依然是没有符合的规则,默认匹配 /
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit/documents/yuchaoit.html
location /
[root@master-61 ~]#
# 通过正则表示匹配内容,只要是.jpg结尾
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit/documents/yuchaoit.jpg
location ~* \.(gif|jpg|jpeg)
[root@master-61 ~]#
# 即使前面匹配到了/documents/,但是结尾符合jpg优先级更高
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.jpg
location ~* \.(gif|jpg|jpeg)
# 除非结尾文件名不符合,因此匹配到/documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.jpgggg
location /documents/
[root@master-61 ~]#
[root@master-61 ~]#
# 证明 ^~ 优先级 大于 ~*
[root@master-61 ~]#curl 10.0.0.9:22333/images/yuchaoit.jpgggg
location ^~ /images/
5 实际工作使用
实际工作中,会有至少3个匹配规则如下,需要同学们学习了nginx负载均衡即可理解,以及具体的网站部署实践。
# 1.必选规则,设置反向代理,官网也推荐该用法,可以加速处理,因为首页会频繁被访问
# 该location 一般直接设置反向代理,转发给后端应用服务器,或者是静态页;
location = / {
proxy_pass http://yuchaoit.cn;
}
# 2.静态文件处理,nginx强项
# 两个模式,二选一即可
# 这个表示当用户请求是 http://yuchaoit.cn/static/hello.css 这样的请求时
# 进入/www目录下,寻找static文件夹, 也就是/www/static/hello.css文件
location ^~ /static/ {
root /www/;
}
# 这个表示请求是以如下静态资源结尾的,进入到/www/下寻找该文件
#匹配任何以.gif结尾的请求,支持正则
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /www/;
}
# 3.还有就是通用规则,用于处理未定义的url,默认匹配
# 一般网站除了静态文件的请求,默认就是动态请求,因此直接转发给后端
location / {
proxy_pass http://my_django:8080/;
}
6. location的root和alias
nginx的location路径匹配功能
1.匹配用户的url
2.匹配到之后决定动作,代理转发,或者设置网页根目录,提供静态数据。
静态页面的设置,就得设置linux中的文件路径,nginx提供了2个参数
root和alias
语法:
1.root是定义最上层目录,目录路径结尾的斜线可有可无;
2.alias是定义目录别名,结尾必须以 "/" 结束,否则找不到文件。
1.你还是必须要明确,用户要访问的url,是如下
http://10.0.0.8:33555/static/caixukun.jpg
2. 正确的配置文件应该是如下
[root@web-8 /huya/static]#cat /opt/nginx-1-19-0/conf/extra/test-root-alias.conf
server {
listen 33555;
server_name _;
# 你现在需要设置
# 需要访问 10.0.0.8:33555/static/caixukun.jpg
# 你有什么写法,可以返回这个数据,给用户看到呢?
# 当前有一个代码目录,叫做 /huya/ 要求静态数据放在这个目录下
# 已知有一个静态图片,放在如下的目录中 /huya/static/caixukun.jpg
# 要求,要进行静态请求匹配,匹配/static/ url开头
# 到这还看懂扣1 不懂 3
# 等于匹配用户访问的url形式是 10.0.0.8:33555/static/caixukun.jpg
location ^~ /static/ {
# 两种写法第一个,写root,root特点是会将该url(/static)填充到网页根目录下,认为它也是一个目录
# 应该正确写法如下
root /huya/;
# 第二种写法,alias别名用法
}
}
重启服务
3.按照这个写法的话,该资源文件应该是防止在什么位置?
给我发弹幕,你觉得完整的,正确的绝对路径是
最终你要确保
(这里的路径,意识是,该caixukun.jpg资源放在服务器上的什么路径下!!)
才能正确的访问
http://10.0.0.8:33555/static/caixukun.jpg
alias参数用法
1.还拿这个url来做实验,用户需要访问的url依然是
http://10.0.0.8:33555/static/caixukun.jpg
2. 修改nginx的配置文件
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性