location详解

在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理请求

语法规则:location [=|~|~*|^~] /uri/ { ... }
=    #用于标准uri前,需要请求字符串与uri精确匹配,如果匹配成功就停止向下匹配并立即处理请求。
~    #用于标准uri前,表示包含正则表达式并且区分大小写
~*    #用于标准uri前,表示包含正则表达式并且不区分大小写
!~    #用于标准uri前,表示包含正则表达式并且区分大小写不匹配
!~*    #用于标准uri前,表示包含正则表达式并且不分区大小写不匹配
^~    #用于标准uri前,表示包含正则表达式并且匹配以什么开头
$    #用于标准uri前,表示包含正则表达式并且匹配以什么结尾
\    #用于标准uri前,表示包含正则表达式并且转义字符。可以转.*?*    #用于标准uri前,表示包含正则表达式并且代表任意长度的任意字符
精确匹配
#在opt中放入一个1.jpg的图片这个时候使用浏览器访问www.hu.com/1.jpg的时候就可以精确匹配到opt目录下的图片
#同时在pc文件下放一个不同的图片也叫1.jpg
location / {
    root   /data/nginx/html/pc/;                                            
    index  index.html index.htm;
}
location = /1.jpg {                                                         
    root   /opt;
}
区分大小写
#将server配置成为如下:其中第三个location配置成区分大小写,此时我们可以访问:www.hu.com/Aa.jpg这个时候可以访问图片,当访问www.hu.com.Aa.JPG的时候都不能访问
server{
    listen  80;
    server_name www.hu.com;
    location / {
        root   /data/nginx/html/pc/;
        index  index.html index.htm;
    }

    location = /1.jpg {
        root   /opt;
    }
    #区分大小写
    location ~ /A.?\.jpg{                                                                    
        root /data/nginx/html/pc/image;
    }
    #配置成不区分大小写
    
    location ~* /A.?\.jpg{                                                          
        root /data/nginx/html/pc/image;
    }
    
}
#此时访问www.hu.com/Aa.jPg的时候可以访问,关掉不区分大小写,并访问Aa.jPg时,查看日志显示如下
2020/01/06 05:06:32 [error] 1604#0: *35 open() "/data/nginx/html/pc/Aa.jPg" failed (2: No such file or directory), client: 192.168.1.7, server: www.hu.com, request: "GET /Aa.jPg HTTP/1.1", host: "www.hu.com"
自定义错误页面
#在配置文件中配置如下:
error_page 500 502 503 504 404 /error.html;
    location = /error.html {
    root /apps/nginx/html;
}
#然后在/apps/nginx/html目录下编辑一个error.html文件,并访问一个不存在的地址,如:#www.hu.com/aaaaaa.html
自定义访问日志:
 #在配置文件中添加如下访问日志
 access_log /data/nginx/logs/www_hu_com_access.log;
 error_log /data/nginx/logs/www_hu_com_error.log; 
 
 #新建日志文件
[root@localhost logs]# vim www_hu_com_access.log
[root@localhost logs]# vim www_hu_com_error.log

#验证正确访问nginx
192.168.1.7 - - [06/Jan/2020:06:48:39 +0800] "GET /Aa.jpg HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
#验证错误访问nginx
2020/01/06 06:40:45 [error] 1787#0: *68 open() "/apps/nginx/html/aaa.html" failed (2: No such file or directory), client: 192.168.1.7, server: www.hu.com, request: "GET /aaa.html HTTP/1.1", host: "www.hu.com"
2020/01/06 06:40:45 [error] 1787#0: *68 open() "/apps/nginx/html/error.html" failed (2: No such file or directory), client: 192.168.1.7, server: www.hu.com, request: "GET /aaa.html HTTP/1.1", host: "www.hu.com"


#nginx的访问日志不能在启动的时候删除,否则会找不到日志,可以在nginx启动的情况下删除日志,然后访问nginx,在#日志目录下不会生成新的日志文件,如果重启则会重新生成日志,重新touch一个nginx访问日志依然不能写入数据,因为#新建的nginx访问日志文件的inode与已经删除的访问文件的inode不一样,综上所述,nginx是通过inode去识别访问日#志文件,在访问日志比较大的情况下,nginx在运行期间删除日志文件并不能清除访问日志所占用的磁盘,最好的方式是##通过echo将nginx访问日志覆盖
[root@localhost logs]# rm -f www_hu_com_access.log 
[root@localhost logs]# ls
www_hu_com_error.log

#正确清除nginx访问日志的方法
[root@localhost logs]# ll -h
total 24K
-rw-r--r-- 1 root root  19K Jan  6 06:55 www_hu_com_access.log
-rw-r--r-- 1 root root 1.5K Jan  6 06:43 www_hu_com_error.log
[root@localhost logs]# echo 1 > www_hu_com_access.log 
[root@localhost logs]# ll -h
total 8.0K
-rw-r--r-- 1 root root    2 Jan  6 06:56 www_hu_com_access.log
-rw-r--r-- 1 root root 1.5K Jan  6 06:43 www_hu_com_error.log

#定义成json格式的日志(编辑nginx.conf)
#注意这里存在一个坑位,定义日志类型,必须要放在include vhost/*.conf的前面,否则*.conf的虚拟主机不会识别access_json类型的日志文件
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",'
    '"domain":"$host",'
    '"xff":"$http_x_forwarded_for",'
    '"referer":"$http_referer",'
    '"tcp_xff":"$proxy_protocol_addr",'
    '"http_user_agent":"$http_user_agent",'
    '"status":"$status"}';
    access_log /apps/nginx/logs/access_json.log access_json;
    
#然后在server/www_hu_com.conf中添加如下:
access_log /data/nginx/logs/www_hu_com_access.log access_json;

#验证如下:
{"@timestamp":"2020-01-07T00:47:21+08:00","host":"192.168.1.170","clientip":"192.168.1.7","size":0,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"www.hu.com","uri":"/abc.html","domain":"www.hu.com","xff":"-","referer":"http://www.hu.com/","tcp_xff":"","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400","status":"304"}
检测文件是否存在
#location配置如下
location / {
    root   /data/nginx/html/pc/;
    index  index.html index.htm;
    try_files $uri /abc.html $uri/index.html $uri.html ;  
    #
}
下载服务器配置
# autoindex on开启文件自动索引功能;autoindex_exact_size on精确文件大小到字节,off为可视化显示,显示单位依据文件大小进行显示;limit_rate 10k限制下载速度每秒最大10k/s
location /download {
    root /data/nginx/html/pc;
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;  
    limit_rate 10k;
}
上传服务器配置
#没有环境,不演示
client_max_body_size 1m;    #允许客户端上传单个文件的最大值,默认值为1m
client_body_buffer_size size;    #用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;
client_body_temp_path path [level1 [level2 [level3]]];    #存储客户端请求报文body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为文件名;
其他配置
#只需要配置aio
aio on|off    #是否启动asynchronous file IO (AIO)功能,需要在linux内核2.6及以上版本的系统调用来支持aio
SYS_io_setup    建立aio的context
SYS_io_submit    提交IO操作请求
SYS_IO_getevents    获取已完成的IO事件
SYS_IO_cancel    取消IO操作请求
SYS_IO_destroy    销毁aio的context
directio    size|off    #操作完全和aio相反,aio是读取文件而directio是写文件到磁盘,启用直接IO,默认为关闭,档文件大于等于给定大小时,例如directio 4m,同步直接写磁盘,而非写缓存;配置在http模块或者http模块下的location
open_file_cache    off;    #是否缓存打开过的文件信息
open_file_cache    max=N    [inactive=time];
    nginx可以缓存以下三种信息:
    1、文件元数据:文件的描述符、文件大小和最近一次的修改时间
    2、打开的目录结构
    3、没有找到的或者没有权限访问的文件的相关信息
    max=N;可缓存的缓存项上限数量;达到上限后会使用LRU算法实现管理
    inactive=time;缓存项的非活动时间长,在此处指定时长内未命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除
open_file_cache        max=1000    inactive=20s;    缓存数量1000个,活动时间为20s
open_file_cache_valid    30s    有效时间是30s;
open_file_cache_min_uses    2;30秒内有2个users打开文件才被认为是可存活的
open_file_cache_errors    on;        #是否缓存错误的也文件
server_tokens off;http协议头中不返回nginx的版本号