nginx高级篇

一、日志切割(shell脚本)

1.shell脚本切割

1、当前的日志
[root@web-7 ~]#ls /var/log/nginx/
77.log               blog.linux0224.log        error.log
78.log               error.77.log              error.log-20220520
81.log               error.78.log              error.movie.linux0224.log
82.log               error.81.log              error.www.linux0224.log
access.log           error.82.log              movie.linux0224.log
access.log-20220520  error.blog.linux0224.log  www.linux0224.log

nginxw鉴权_nginxw鉴权

2、备份当前日志,用rename改名
[root@web-7 /var/log/nginx]#rename log  log.$(date +%F) *.log

nginxw鉴权_html_02

3、给nginx服务的master进程发送usr1信号,重新打开日志记录
USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

nginx -s reopen

kill -USR1 $(cat /var/run/nginx.pid)
4、重新生成日志
[root@web-7 /var/log/nginx]#kill -USR1 $(cat /var/run/nginx.pid)

nginxw鉴权_nginxw鉴权_03

2、完整的脚本

[root@web-7 /var/log/nginx]#cat /etc/nginx/cut_log.sh 
#!/bin/bash

#1、源日志
logs_path="/var/log/nginx"

#2、备份日志目录
back_logs_path="${logs_path}/$(date -d 'yesterday' +'%F')"

#3、创建备份目录,以日期命名(每天整点切割,开始记录新的一天的日志)
mkdir -p ${back_logs_path}

#4、重命名久日志
cd ${logs_path} && find . -type f | xargs -i mv {} {}.$(date -d 'yesterday' +'%F')

#5、移动久日志文件到改目录下
cd ${logs_path} && find . -type f | xargs -i mv {} ${back_logs_path}

#6、重新生成新日志
kill -USR1 `cat /var/run/nginx.pid`

3.实践过程

1、准备测试数据
[root@web-7 /var/log/nginx]#ls
77.log      afei.log            error.81.log               error.www.linux0224.log
78.log      blog.linux0224.log  error.82.log               movie.linux0224.log
81.log      cut_log.sh          error.blog.linux0224.log   www.linux0224.log
82.log      error.77.log        error.log
access.log  error.78.log        error.movie.linux0224.log
2、修改时间到第二天0点
[root@web-7 /var/log/nginx]#date -s '2022-5-23 00:00'
Mon May 23 00:00:00 CST 2022
[root@web-7 /var/log/nginx]#date
Mon May 23 00:00:05 CST 2022
3、执行脚本
[root@web-7 /var/log/nginx]#bash cut_log.sh
4、查看备份日志

nginxw鉴权_linux_04

4.写入定时任务

[root@web-7 /var/log/nginx]#crontab -e
crontab: installing new crontab
[root@web-7 /var/log/nginx]#crontab -l
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
0 0 * * * /bin/bash /etc/nginx/cul_log.sh
[root@web-7 /var/log/nginx]#

二、日志切割(logrotate工具)

1、检查logrotate

检查nginx配置文件列表
[root@web-7 ~]#rpm -qc nginx
/etc/logrotate.d/nginx
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params

2、配置文件解释

[root@web-7 /etc/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                        # 结束动作
}

nginxw鉴权_html_05

3、测试切割

1、创建压测工具,生成大量日志
[root@web-7 ~]#yum install httpd-tools -y
2、清空默认日志
[root@web-7 /var/log/nginx]#> 81.log
3、模拟100个并发用户,共计发出10000个请求
[root@web-7 /var/log/nginx]#ab -c 100 -n 10000 http://10.0.0.7:81/path
4、检查日志

nginxw鉴权_nginx_06

5、主动切割日志
[root@web-7 /var/log/nginx]#logrotate -f /etc/logrotate.d/nginx

nginxw鉴权_nginxw鉴权_07

6、当前并没有变化(切割),只有下一次才会压缩
7、修改时间,模拟到第二天
[root@web-7 /var/log/nginx]#date -s '2022-5-23 00:00'
Mon May 23 00:00:00 CST 2022
[root@web-7 /var/log/nginx]#date
Mon May 23 00:00:05 CST 2022
8、再次创建大量日志
[root@web-7 /var/log/nginx]#ab -c 100 -n 10000 http://10.0.0.7:81/path
9、再次查看日志

nginxw鉴权_nginx_08

10、开始切割,查看压缩
[root@web-7 /var/log/nginx]#logrotate -f /etc/logrotate.d/nginx

nginxw鉴权_nginx_09

11、加入定时任务
[root@web-7 /var/log/nginx]#crontab -e
crontab: installing new crontab
[root@web-7 /var/log/nginx]#crontab -l
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
0 0 * * * /bin/bash /etc/nginx/cul_log.sh
01 00 * * * /uxr/sbin/logrotate -f /etc/logrotate.d/nginx >> /var/log/nginx/logrotate_nginx.log 2>&1

nginxw鉴权_html_10

三、目录索引、文件下载服务

网址
http://nginx.org/en/docs/http/ngx_http_autoindex_module.html

1、参数说明

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;

2、配置文件

1、生成测试数据
[root@web-7 /var/log/nginx]#mkdir /afei
[root@web-7 /var/log/nginx]#dd if=/dev/zero of=/afei/条条.log

nginxw鉴权_nginx_11

2、单独生成子配置文件,用于下载
[root@web-7 /etc/nginx/conf.d]#cat xaizai.conf 
server{

  listen 8888;
  server_name localhost;
  charset utf-8,gbk;
  location / {
    root /afei/;
    autoindex on;
    autoindex_localtime on;
    autoindex_exact_size off;
  }
}


重启
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx


参数
autoindex on   ; 表示开启目录索引
autoindex_localtime on; 显示文件为服务器的时间
autoindex_exact_size off; 显示文件大概单位,是KB、MB、GB
3、访问

nginxw鉴权_nginxw鉴权_12

四、连接数监控

网址
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非常有帮助。

1、参数解释

Active connections
当前活动客户端连接数,包括Waiting连接数。

accepts
接受的客户端连接总数。

handled
处理的连接总数。
accepts 通常,除非已达到某些资源限制(例如, worker_connections限制) ,否则该参数值相同。

requests
客户端请求的总数。

Reading
nginx 正在读取请求标头的当前连接数。

Writing
nginx 将响应写回客户端的当前连接数。

Waiting
当前等待请求的空闲客户端连接数。

# 注意
一个tcp连接,可以发起多个http请求
可以通过修改保持连接参数修改
keepalive_timeout 0; 表示关闭长连接

2、查看主机的nginx支持这个模块吗

[root@web-7 ~]#nginx -v
nginx version: nginx/1.20.2
[root@web-7 ~]#

3、配置文件

[root@web-7 /etc/nginx/conf.d]#cat status.conf 
server{

  listen 9999;
  server_name localhost;
  stub_status on;
  access_log off;
  

}

重启
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx

4、访问状态

模拟发送5000请求
[root@web-7 /etc/nginx/conf.d]#ab -c 10 -n 5000 http://10.0.0.7/

nginxw鉴权_html_13

五、基于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 域套接字的访问。

2、拒绝windows访问www域名

[root@web-7 /etc/nginx/conf.d]#cat www.linux0224.conf 
server {
    listen       80;
    server_name www.linux0224.cc;
    charset utf-8;
    access_log /var/log/nginx/www.linux0224.log;
    error_log /var/log/nginx/error.www.linux0224.log;
    error_page 404 /404.html;
    location / {
        root   /usr/share/nginx/html/;
        index  index.html index.htm;
        deny 10.0.0.1;
        allow all;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

重启
systemctl restart nginx

nginxw鉴权_nginx_14

3、只允许windows访问,其他人拒绝

[root@web-7 /etc/nginx/conf.d]#cat www.linux0224.conf 
server {
    listen       80;
    server_name www.linux0224.cc;
    charset utf-8;
    access_log /var/log/nginx/www.linux0224.log;
    error_log /var/log/nginx/error.www.linux0224.log;
    error_page 404 /404.html;
    location / {
        root   /usr/share/nginx/html/;
        index  index.html index.htm;
        allow 10.0.0.1;
        deny all;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

重启
systemctl  restart nginx

nginxw鉴权_nginxw鉴权_15

六、基于用户认证的访问限制

1、语法

https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html

句法:    auth_basic string | off;
默认:    
auth_basic 关闭;
语境:    http, server, location,limit_except
启用使用“HTTP 基本身份验证”协议验证用户名和密码。
指定的参数用作realm. 参数值可以包含变量(1.3.10、1.2.7)。
特殊值off取消了auth_basic从先前配置级别继承的指令的效果。

句法:    auth_basic_user_file file;
默认:    —
语境:    http, server, location,limit_except

2.创建密码文件

htpasswd是Apache密码生成工具,Nginx支持auth_basic认证,因此我门可以将生成的密码用于Nginx中,输入一行命令即可安装:

yum -y install httpd-tools 

参数
-c 创建passwdfile.如果passwdfile 已经存在,那么它会重新写入并删去原有内容.
-b 命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互

#创建认证文件,htpasswd -bc .access username password 

#在当前目录生成.access文件,用户名username,密码:password,默认采用MD5加密方式。
操作
[root@web-7 ~]#htpasswd -b -c /etc/nginx/auth_passwd afei06 333333
Adding password for user afei06
[root@web-7 ~]#

3、nginbx调用密码文件

[root@web-7 /etc/nginx/conf.d]#cat www.linux0224.conf 
server {
    listen       80;
    server_name www.linux0224.cc;
    charset utf-8;
    access_log /var/log/nginx/www.linux0224.log;
    error_log /var/log/nginx/error.www.linux0224.log;
    error_page 404 /404.html;
    location / {
        root   /usr/share/nginx/html/;
        index  index.html index.htm;
        auth_basic "linux0224.cc welcomes you";
        auth_basic_user_file /etc/nginx/auth_passwd;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}


重启
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx

4、访问数据

访问www.linux0224.cc需要输入账号密码

nginxw鉴权_linux_16

没有设置的,则不需要认证,直接访问

七、nginx请求限制

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、用法

[root@web-7 /etc/nginx/conf.d]#cat www.linux0224.conf 
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    listen       80;
    server_name www.linux0224.cc;
    charset utf-8;
    access_log /var/log/nginx/www.linux0224.log;
    error_log /var/log/nginx/error.www.linux0224.log;
    error_page 404 /404.html;
    limit_req zone=one burst=3 nodelay;
    location / {
        root   /usr/share/nginx/html/;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

重启
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx

5、访问测试

正常限速内
[root@web-7 ~]#for i in {1..10};do curl -I www.linux0224.cc;sleep 1;done

nginxw鉴权_linux_17

超速情况
[root@web-7 ~]#for i in {1..20};do curl -I www.linux0224.cc;sleep 0.5 ;done

nginxw鉴权_html_18

八、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
2、准备好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 /linux0224/ ; cd /linux0224/
3、下载echo模块
yum install git -y
git clone https://github.com/openresty/echo-nginx-module.git


关闭防火墙
[root@web-7 /linux0224]#ll
total 0
drwxr-xr-x 6 root root 186 May 22 18:42 echo-nginx-module
4、编译nginx
下载
[root@web-7 /linux0224]#wget http://nginx.org/download/nginx-1.19.0.tar.gz
解压
[root@web-7 /linux0224]#tar -zxf nginx-1.19.0.tar.gz

[root@web-7 /linux0224]#cd nginx-1.19.0/
[root@web-7 /linux0224/nginx-1.19.0]#


编译
[root@web-7 /linux0224/nginx-1.19.0]#./configure --user=www --group=www --prefix=/linux0224/nginx-1-19-0 --with-http_stub_status_module --with-http_ssl_module --with-pcre --add-module=/linux0224/echo-nginx-module
5、编译且安装
[root@web-7 /linux0224/nginx-1.19.0]#make && make install
6、验证模块
[root@web-7 /linux0224]#nginx-1-19-0/sbin/nginx  -v
nginx version: nginx/1.19.0

3、创建型配置文件,验证echo模块

[root@web-7 /etc/nginx/conf.d]#cat echo.conf 
server {
    listen       11444;
    server_name  localhost;
    charset utf-8;
    location / {
       echo "linux0224.cc welcome you!";
       echo $uri;
       echo $document_uri;
       echo $remote_addr;
       echo $remote_port;
       echo $http_user_agent;
    }
}

编译安装

第一次下载拒绝了tcp连接
[root@web-7 /linux0224]#echo "200" >  /proc/sys/net/ipv4/tcp_keepalive_time
重新加载
[root@web-7 /linux0224]#sysctl -p


下载echo模块
yum install git -y
git clone https://github.com/openresty/echo-nginx-module.git


关闭防火墙
[root@web-7 /linux0224]#ll
total 0
drwxr-xr-x 6 root root 186 May 22 18:42 echo-nginx-module



[root@web-7 /opt/tngx]#tar  -zxf tengine-2.3.3.tar.gz 
[root@web-7 /opt/tngx]#ls
tengine-2.3.3  tengine-2.3.3.tar.gz

[root@web-7 /opt/tngx]#cd tengine-2.3.3/
[root@web-7 /opt/tngx/tengine-2.3.3]#./configure --user=www --group=www --prefix=/linux0224/tenginx233 --with-http_stub_status_module --with-http_ssl_module --with-pcre --add-module=/linux0224/echo-nginx-module

[root@web-7 /opt/tngx/tengine-2.3.3]#make && make install
[root@web-7 /opt/tngx/tengine-2.3.3]#cd /linux0224/tenginx233/
[root@web-7 /linux0224/tenginx233]#ls
conf  html  logs  sbin
修改nginx配置文件

nginxw鉴权_nginxw鉴权_19

查看模块
[root@web-7 /linux0224/tenginx233]#sbin/nginx -V
Tengine version: Tengine/2.3.3
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/linux0224/tenginx233 --with-http_stub_status_module --with-http_ssl_module --with-pcre --add-module=/linux0224/echo-nginx-module



[root@web-7 /conf]#cat echo.conf 
server {
    listen       11444;
    server_name  localhost;
    charset utf-8;
    location / {
       echo "https://nginx.org/en/docs/";
       echo $uri;
       echo $document_uri;
       echo $remote_addr;
       echo $remote_port;
       echo $http_user_agent;
       echo $request_filename;
        
    }
}

nginxw鉴权_linux_20

十、nginx 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语法优先级

优先级从高到低

匹配符

匹配规则

优先级

=

定义 URI 和位置的精确匹配。

1

^~

以某个字符串开头,不检查正则

2

~

区分大小写的正则匹配

3

~*

不区分大小写的正则匹配

4

3、测试location实战

nginxw鉴权_nginx_21

# 配置文件如下
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;

}

配置文件

[root@web-7 /linux0224]#cat /conf/location.conf 
server{
  listen 22333;
  server_name _;
  location / {
    return 200 "location / \n";
  }
  location = /afei {
    return 200 "location /afei/ \n";
  }
  location ^~ /xming/ {
    return 200 "location ^~ /xming/ \n";
  }
  location ~* \.(gif|jpg|png)$ {
    return 200 "location ~* \.(gif|jpg|png)  \n";
  }
  access_log off;
}

启动nginx

进行url的设置访问,查看结果

[root@master-61 ~]#curl 10.0.0.7:22333
location / 
[root@master-61 ~]#curl 10.0.0.7:22333/afei
location /afei/ 
[root@master-61 ~]#curl 10.0.0.7:22333/xming
location / 
[root@master-61 ~]#curl 10.0.0.7:22333/xming/
location ^~ /xming/ 
[root@master-61 ~]#curl 10.0.0.7:22333/dsfjkhf
location / 
[root@master-61 ~]#curl 10.0.0.7:22333/2.png
location ~* \.(gif|jpg|png)  
[root@master-61 ~]#curl 10.0.0.7:22333/2.PNG
location ~* \.(gif|jpg|png)  
[root@master-61 ~]#curl 10.0.0.7:22333/afei/2.gif
location ~* \.(gif|jpg|png)  
[root@master-61 ~]#curl 10.0.0.7:22333/xming/2.jpg
location ^~ /xming/

nginxw鉴权_nginxw鉴权_22

location中的root和alias实战

root

[root@web-7 /etc/nginx/conf.d]#cat root.conf 
server{
  listen 22222;
  server_name _;
  location ^~ /xming/ {
    root  /xming;   
  }
  
  access_log off;
}


放入数据
[root@web-7 /xqing]#wget https://p1.ssl.qhimg.com/t016097bbefb6bbe829.jpg
[root@web-7 /xqing]#tree
.
└── xming
    └── kuli.jpg

1 directory, 1 file



重启
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx.service

nginxw鉴权_nginxw鉴权_23

alias

[root@web-7 ~]#cat  /etc/nginx/conf.d/alias.conf 
server{
  listen 22223;
  server_name _;
  location ^~ /xming/ {
    alias /xqing/xming/;   
  }
  
  access_log off;
}

nginxw鉴权_linux_24