在没有使用正则表达式的时候,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的版本号