nginx高级访客日志切割

切割理念(先纯手动的去切割日志,备份日志)

  1. 给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的访问限制

模块

http://nginx.org/en/docs/http/ngx_http_access_module.html

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的配置文件

posted @ 2024-03-22 21:10  不太聪明的大鹅  阅读(8)  评论(0编辑  收藏  举报