vlambda博客
学习文章列表

NGINX配置文件详解

location详解

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

语法规则:location [=|~|~*|^~] /uri/ { ... }
= #用于标准uri前,需要请求字符串与uri精确匹配,如果匹配成功就停止向下匹配并立即处理请求。
~ #用于标准uri前,表示包含正则表达式并且区分大小写
~* #用于标准uri前,表示包含正则表达式并且不区分大小写
!~ #用于标准uri前,表示包含正则表达式并且区分大小写不匹配
!~* #用于标准uri前,表示包含正则表达式并且不分区大小写不匹配
^~ #用于标准uri前,表示包含正则表达式并且匹配以什么开头
$ #用于标准uri前,表示包含正则表达式并且匹配以什么结尾
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以转.
*?
* #用于标准uri前,表示包含正则表达式并且代表任意长度的任意字符

NGINX配置文件详解

精确匹配

NGINX配置文件详解

#在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;
}

NGINX配置文件详解

区分大小写

NGINX配置文件详解

#将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;
}

}

NGINX配置文件详解

#此时访问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
自定义访问日志:

NGINX配置文件详解

 #在配置文件中添加如下访问日志
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"}

NGINX配置文件详解

检测文件是否存在

NGINX配置文件详解

#location配置如下
location
/ {
root
/data/nginx/html/pc/;
index index.html index.htm;
try_files $uri
/abc.html $uri/index.html $uri.html ;
#
}

NGINX配置文件详解

下载服务器配置

NGINX配置文件详解

# 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;
}

NGINX配置文件详解

上传服务器配置
#没有环境,不演示
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位作为文件名;
其他配置

NGINX配置文件详解

#只需要配置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

NGINX配置文件详解

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的版本号