Nginx02-常用模块和Location
WEB服务-Nginx之4-常用模块和Location
Nginx模块介绍
Nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本后支持动态装载和卸载。
官网模块文档:http://nginx.org/en/docs/
模块分类:
-
核心模块:core module
-
标准模块:
- HTTP 模块:
ngx_http_*
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定 - Mail 模块:
ngx_mail_*
- Stream 模块:
ngx_stream_*
- 第三方模块
- HTTP 模块:
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、 配置文件解析 、 事件驱动机制 、 进程管理等核心功能。
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等。
- 可选HTTP模块:主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务,比如:Flash多媒体传输 、解析 GeoIP 请求、网络传输压缩、安全协议SSL支持等。
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持。
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等。
Nginx模块查看
- 查看自己添加的参数、编译时附带的可选模块或三方模块
[root@web01 ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
- 查看默认安装的模块
[root@web01 ~]# cat /opt/nginx-1.18.0/auto/options | | grep "^[^ ].*YES$"
HTTP=YES
HTTP_CACHE=YES
HTTP_CHARSET=YES
HTTP_GZIP=YES
HTTP_SSI=YES
HTTP_ACCESS=YES # 基于IP的访问控制
HTTP_AUTH_BASIC=YES # 基于用户登陆认证
HTTP_MIRROR=YES
HTTP_USERID=YES
HTTP_AUTOINDEX=YES # 目录索引
HTTP_GEO=YES
HTTP_MAP=YES
HTTP_SPLIT_CLIENTS=YES
HTTP_REFERER=YES
HTTP_REWRITE=YES
HTTP_PROXY=YES
HTTP_FASTCGI=YES
HTTP_UWSGI=YES
HTTP_SCGI=YES
HTTP_GRPC=YES
HTTP_MEMCACHED=YES
HTTP_LIMIT_CONN=YES # 连接频率限制
HTTP_LIMIT_REQ=YES # 请求频率限制
HTTP_EMPTY_GIF=YES
HTTP_BROWSER=YES
HTTP_UPSTREAM_HASH=YES
HTTP_UPSTREAM_IP_HASH=YES
HTTP_UPSTREAM_LEAST_CONN=YES
HTTP_UPSTREAM_RANDOM=YES
HTTP_UPSTREAM_KEEPALIVE=YES
HTTP_UPSTREAM_ZONE=YES
MAIL_POP3=YES
MAIL_IMAP=YES
MAIL_SMTP=YES
STREAM_LIMIT_CONN=YES
STREAM_ACCESS=YES
STREAM_GEO=YES
STREAM_MAP=YES
STREAM_SPLIT_CLIENTS=YES
STREAM_RETURN=YES
STREAM_UPSTREAM_HASH=YES
STREAM_UPSTREAM_LEAST_CONN=YES
STREAM_UPSTREAM_RANDOM=YES
STREAM_UPSTREAM_ZONE=YES
- 查看默认不安装和不存在的模块
[root@web01 ~]# cat /opt/nginx-1.18.0/auto/options | grep "NO$\|NONE$"
NGX_DEBUG=NO
CPU=NO
NGX_RPATH=NO
NGX_TEST_BUILD_DEVPOLL=NO
NGX_TEST_BUILD_EVENTPORT=NO
NGX_TEST_BUILD_EPOLL=NO
NGX_TEST_BUILD_SOLARIS_SENDFILEV=NO
EVENT_FOUND=NO
EVENT_SELECT=NO
EVENT_POLL=NO
USE_THREADS=NO
NGX_FILE_AIO=NO
HTTP_SSL=NO
HTTP_V2=NO
HTTP_REALIP=NO
HTTP_XSLT=NO
HTTP_IMAGE_FILTER=NO
HTTP_SUB=NO
HTTP_ADDITION=NO
HTTP_DAV=NO
HTTP_AUTH_REQUEST=NO
HTTP_SLICE=NO
HTTP_RANDOM_INDEX=NO
HTTP_STATUS=NO
HTTP_GEOIP=NO
HTTP_PERL=NO
HTTP_SECURE_LINK=NO
HTTP_DEGRADATION=NO
HTTP_FLV=NO
HTTP_MP4=NO
HTTP_GUNZIP=NO
HTTP_GZIP_STATIC=NO
HTTP_STUB_STATUS=NO
MAIL=NO
MAIL_SSL=NO
STREAM=NO
STREAM_SSL=NO
STREAM_REALIP=NO
STREAM_GEOIP=NO
STREAM_SSL_PREREAD=NO
NGX_COMPAT=NO
USE_PCRE=NO
PCRE=NONE
PCRE_JIT=NO
USE_OPENSSL=NO
OPENSSL=NONE
USE_ZLIB=NO
ZLIB=NONE
ZLIB_ASM=NO
USE_PERL=NO
USE_LIBXSLT=NO
USE_LIBGD=NO
USE_GEOIP=NO
NGX_GOOGLE_PERFTOOLS=NO
NGX_CPP_TEST=NO
NGX_LIBATOMIC=NO
Nginx目录索引
ngx_http_autoindex_module
模块处理以斜杠字符('/')结尾的请求,并生成目录列表。
- 当
ngx_http_index_module
模块找不到索引文件时,通常会将请求传递给ngx_http_autoindex_module
模块。 Nginx
默认是不允许列出整个目录浏览下载。- 注意: 不要在目录里创建index.html 文件
配置:
Syntax: autoindex on | off;
Default: autoindex off;
Context: http, server, location
autoindex
常用参数:
autoindex_exact_size off;
默认为on, 显示出文件的确切大小,单位是bytes。
修改为off,显示出文件的大概大小,单位是kB或者MB或者GB。
autoindex_localtime on;
默认为off,显示的文件时间为GMT(格林威治)时间。
修改为on, 显示的文件时间为文件的服务器时间。
charset utf-8,gbk;
默认中文目录乱码,添加上解决乱码。
autoindex_format html | xml | json | jsonp;
显示索引的页面文件风格,默认html
示例:
server {
listen 80;
server_name module.oldboy.com;
charset utf-8,gbk;
location / {
root /code;
index index.html index.htm;
}
location /download {
alias /module;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
Nginx状态监控
ngx_http_stub_status_module
模块提供对基本状态信息的访问。
- 官方源1.18.0默认安装此可选模块
- 未安装应使用
--with-http_stub_status_module
配置参数启用它
配置:
Syntax: stub_status;
Default: —
Context: server, location
示例:
server {
listen 80;
server_name module.oldboy.com;
access_log off;
location /nginx_status {
stub_status;
}
}
server {
listen 80;
server_name module.oldboy.com;
charset utf-8,gbk;
location / {
root /code;
index index.html index.htm;
}
location /download {
alias /module;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /nginx_status {
stub_status;
}
}
打开浏览器访问:http://module.oldboy.com/nginx_status
Active connections # 当前活动的连接数
accepts # 当前的总连接数TCP
handled # 成功的连接数TCP
requests # 总的http请求数
Reading # 请求
Writing # 响应
Waiting # 等待的请求数,开启了keepalive
# 注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证
keepalive_timeout 0; # 类似于关闭长连接
keepalive_timeout 65; # 65s没有活动则断开连接
Nginx访问控制
http_access_module
模块是基于IP的访问控制
http_auth_basic_module
模块是基于用户登陆认证
基于IP的访问控制配置:
# 允许配置语法
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
# 拒绝配置语法
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
- 访问控制配置示例:拒绝指定的IP,其他全部允许
server {
listen 80;
server_name module.oldboy.com;
access_log off;
location /nginx_status {
stub_status;
deny 10.0.0.1;
allow all;
}
}
- 访问控制配置示例:只允许谁能访问,其它全部拒绝
server {
listen 80;
server_name module.oldboy.com;
access_log off;
location /nginx_status {
stub_status;
allow 10.0.0.0/24;
allow 127.0.0.1;
deny all;
}
}
基于用户登陆认证配置:
# 访问提示字符串
Syntax: auth_basic string| off;
Default: auth_basic off;
Context: http, server, location, limit_except
# 账户密码文件
Syntax: auth_basic_user_file file;
Default: -
Context: http, server, location, limit_except
基于用户登陆认证示例:
- 需要安装httpd-tools,该包中携带了
htpasswd
命令
[root@web01 ~]# yum install httpd-tools
- 创建新的密码文件,
-c
创建新文件,-b
允许命令行输入密码
[root@web01 ~]# htpasswd -b -c /etc/nginx/auth_conf oldboy oldboy
- nginx配置
server {
listen 80;
server_name module.oldboy.com;
access_log off;
location /nginx_status {
stub_status;
auth_basic "Auth access Blog Input your Passwd!";
auth_basic_user_file auth_conf;
}
}
Nginx版本隐藏
server_tokens
在错误页面和“服务器”响应标题字段中启用或禁用Nginx版本显示。
Syntax: server_tokens on | off | build | string;
Default: server_tokens on;
Context: http, server, location
示例:
server_tokens off; # 禁用Nginx版本显示
自定义响应报文的nginx版本信息,需要修改源码文件,重新编译安装。
-
server_tokens on;
[root@web01 ~]# sed -n '13,14p' /opt/nginx-1.18.0/src/core/nginx.h #define NGINX_VERSION "1.18.0" #define NGINX_VER "nginx/" NGINX_VERSION
-
server_tokens off;
[root@web01 ~]# sed -n '49p' /opt/nginx-1.18.0/src/http/ngx_http_header_filter_module.c static u_char ngx_http_server_string[] = "Server: nginx" CRLF; # 把"Server: nginx"中的nginx改为自己想要的文字即可
Nginx访问限制
在企业中经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问, 会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,请求数、进行限制。
ngx_http_limit_conn_module
模块可以根据定义的key
来限制每个键值的连接数,连接频率限制
ngx_http_limit_req_module
模块可以根据定义的key
来限制每个键值的请求数,请求频率限制
连接限制配置:
# 模块名ngx_http_limit_conn_module
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
示例:
http{ # 在http层,设置
# 创建连接空间:大小1m
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
server{ # 在server层,调用
# 连接限制:限制同时最高1个连接,超过返回错误码503给客户端
limit_conn conn_zone 1;
}
}
重载使用ab
工具进行压力测试:-n
执行次数,-c
并发次数
[root@web01 ~]# systemctl reload nginx
[root@web01 ~]# yum install -y httpd-tools
[root@web01 ~]# ab -n 20 -c 2 http://127.0.0.1/index.html
查看nginx错误日志
[root@web01 ~]# tailf /var/log/nginx/error.log
2018/10/24 18:04:49 [error] 28656#28656: 1148 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.oldboy.com, request: "GET / HTTP/1.0", host: "www.oldboy.com"
2018/10/24 18:04:49 [error] 28656#28656: 1155 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.oldboy.com, request: "GET / HTTP/1.0", host: "www.oldboy.com"
2018/10/24 18:04:49 [error] 28656#28656: 1156 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.oldboy.com, request: "GET / HTTP/1.0", host: "www.oldboy.com"
请求限制配置:
# 模块名ngx_http_limit_req_module
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
Syntax: limit_req zone number [burst=number] [nodelay];
Default: —
Context: http, server, location
参数:
- $binary_remote_addr:表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
- zone=one:10m:表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。
- rate=1r/s:表示允许相同标识的客户端的访问频次,每秒只处理一个请求。
- burst=3: 缓冲队列的长度,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
- nodelay:不延迟
- 如果设置,会在瞬时提供处理(burst + rate)个请求的能力,永远不存在请求需要等待的情况,没有延时请求,超过(burst + rate)数量的请求直接返回503。
- 如果没有设置,则所有请求会依次等待排队,有burst个延时请求,超过(burst + 1)数量的请求直接返回503。
示例:
http { # http层定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
server {
listen 80;
server_name module.oldboy.com;
# 1r/s只接收一个请求,多余的请求拒绝处理并返回错误码503给客户端
#limit_req zone=req_zone;
# 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回错误码503给客户端
limit_req zone=req_zone burst=3 nodelay;
location / {
root /code;
index index.html;
}
}
}
重载使用ab
工具进行压力测试
[root@web01 ~]# systemctl reload nginx
[root@web01 ~]# yum install -y httpd-tools
[root@web01 ~]# ab -n 20 -c 2 http://127.0.0.1/index.html
查看nginx错误日志
[root@web01 ~]# tailf /var/log/nginx/error.log
2020/09/10 17:23:48 [error] 2657#2657: *15 limiting requests, excess: 3.999 by zone "req_zone", client: 127.0.0.1, server: module.oldboy.com, request: "GET /index.html HTTP/1.0", host: "127.0.0.1"
2020/09/10 17:23:48 [error] 2657#2657: *16 limiting requests, excess: 3.998 by zone "req_zone", client: 127.0.0.1, server: module.oldboy.com, request: "GET /index.html HTTP/1.0", host: "127.0.0.1"
2020/09/10 17:23:48 [error] 2657#2657: *17 limiting requests, excess: 3.998 by zone "req_zone", client: 127.0.0.1, server: module.oldboy.com, request: "GET /index.html HTTP/1.0", host: "127.0.0.1"
nginx请求限制重定向
在nginx请求限制的过程中,我们可以自定义一个返回值,也就是错误页面的状态码,默认是503
。
1)修改默认返回状态码
server {
listen 80;
server_name module.oldboy.com;
charset utf-8,gbk;
location / {
root /code;
index index.html index.htm;
limit_req zone=req_zone burst=3 nodelay;
# 修改返回状态码为:478
limit_req_status 478;
}
}
2)错误页面太丑,重定向错误页面
server {
listen 80;
server_name module.oldboy.com;
charset utf-8,gbk;
location / {
root /code;
index index.html index.htm;
limit_req zone=req_zone burst=3 nodelay;
limit_req_status 478;
# 重定向错误页面
error_page 478 /err.html;
}
}
3)创建错误页面
cat >/code/err.html <<EOF
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>错误478</title>
</head>
<body background="http://area.sinaapp.com/bingImg/" >
<h1 style="color:red;text-align:center;position:absolute;left:50%;top:50%;">
请求被限制<br>错误478
</h1>
</body>
</html>
EOF
3)使用浏览器访问验证
4)还可以
- 将478响应重定向为200响应,此时访问的网页就不会被拦截,返回200响应,仅提示报错。
- 指定错误页面文件路径。
server {
listen 80;
server_name module.oldboy.com;
charset utf-8,gbk;
location / {
root /code;
index index.html index.htm;
limit_req zone=req_zone burst=3 nodelay;
limit_req_status 478;
# 重定向为200响应,错误页面
error_page 478 =200 /err.html;
}
# 指定错误页面文件路径
location = /err.html {
root /code/err;
}
}
为什么Nginx连接限制没有请求限制有效?
我们先来回顾一下http协议的连接与请求:首先HTTP是建立在TCP基础之上,在完成HTTP请求需要先建立TCP三次握手(称为TCP连接),在连接的基础上在完成HTTP的请求。
所以多个HTTP请求可以建立在一次TCP连接之上。那么我们对请求的精度限制,当然比对一个连接的限制会更加的有效。因为同一时刻只允许一个TCP连接进入,但是同一时刻多个HTTP请求可以通过一个TCP连接进入。所以针对HTTP的请求限制才是较优的解决方案。
Nginx核心功能
Core functionality
核心功能
worker_processes
定义工作进程数(建议与CPU数量一致或auto)。
Syntax: worker_processes number | auto;
Default: worker_processes 1;
Context: main
worker_cpu_affinity
将Nginx工作进程绑定到指定的CPU核心。每个CPU集由允许的CPU的位掩码表示。应该为每个工作进程定义一个单独的集合。默认情况下,辅助进程未绑定到任何特定的CPU。
绑定并不是意味着当前nginx进程独占用一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。简单来说就是提高缓存命中率。
Syntax: worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Default: -
Context: main
示例:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000; # 将Nginx工作进程绑定到指定的CPU核心(当前代表的是4个CPU,4个work的意思)
查看当前有多少个CPU核心,多少个work进程。
[root@web01 ~]# lscpu | grep '^CPU(s):' CPU(s): 4 # 逻辑cpu颗数4个 [root@web01 ~]# pstree -p |grep nginx # work进程4个 |-nginx(25495)-+-nginx(25496) | |-nginx(25497) | |-nginx(25498) | |-nginx(25499)
worker_priority
定义工作进程的调度优先级,就像通过nice
命令一样:负数 number
表示更高的优先级。允许范围通常为-20至20。
Syntax: worker_priority number;
Default: worker_priority 0;
Context: main
worker_rlimit_nofile
设置RLIMIT_NOFILE
工作进程最大打开文件数。用于在不重新启动主进程的情况下增加限制。number
包括Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制。
Syntax: worker_rlimit_nofile number;
Default: -
Context: main
示例:
worker_rlimit_nofile 65535; # 所有worker进程能打开的文件数量上限,最好与 ulimit -n 的值保持一致,如65535
查看此时CPU绑定效果,此时一个nginx工作进程绑定一个CPU。
[root@web01 ~]# ps axo pid,psr,cmd |grep nginx|grep -v grep
1457 0 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
1458 0 nginx: worker process
Nginx监听功能
ngx_http_core_module
模块
listen
指令监听端口|IP:端口|unix socket
Syntax: listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Default: listen *:80 | *:8000;
Context: server
default_server 设定为默认虚拟主机,无法匹配虚拟主机时使用
ssl 限制仅能够通过ssl连接提供服务
backlog=number 超过并发连接数后,新请求进入后援队列的长度
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
示例:
listen PORT; # 监听本机所有的IPV4和IPV6的 PORT 端口,等于listen *:PORT
listen IP:PORT; # 监听指定IP的 PORT 端口
listen Unix:/www/file # 监听unix socket
Nginx保持连接
keepalive_disable
禁用行为异常的浏览器的保持活动的连接。browser
参数指定影响哪些浏览器。
msie6
禁用与旧版本MSIE的保持活动的连接。safari
禁用macOS和类似macOS的操作系统上的Safari和类似Safari的浏览器保持活动的连接。none
启用与所有浏览器的保持活动的连接。
Syntax: keepalive_disable none | browser ...;
Default: keepalive_disable msie6;
Context: http, server, location
keepalive_requests
设置一个保持活动的连接服务允许的最大请求数。发出最大数量的请求后,将关闭连接。
要释放每个连接的内存分配,必须定期关闭连接。因此,设置过多的最大请求数可能会导致使用过多的内存,不建议配置过大。
Syntax: keepalive_requests number;
Default: keepalive_requests 100;
Context: http, server, location
keepalive_timeout
设置保持活动的连接的超时时间。
timeout
是保持活动的连接的超时时间,在此期间,保持活动的客户端连接将在服务器端保持打开状态。设置为0,将禁用保持活动状态的客户端连接。
header_timeout
是显示在“ Keep-Alive:timeout = time
”响应头字段中的值。两个参数可能不同。
Syntax: keepalive_timeout timeout [header_timeout];
Default: keepalive_timeout 75s;
Context: http, server, location
send_timeout
设置将响应报文传输到客户端的超时时间。超时仅在两个连续的写操作之间设置,而不用于整个响应的传输。如果客户端在此时间内未收到任何信息,则连接将关闭。
Syntax: send_timeout time;
Default: send_timeout 60s;
Context: http, server, location
启用或禁用sendfile
选项。开启sendfile时,合并响应头和数据体在一个包中一起发送。
Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location
启用或禁用TCP_NODELAY
选项,也就是Nagle算法(Nagle algorithm)。当连接转换为保持活动状态时,将启用该选项。此外,它在SSL连接,无缓冲代理和WebSocket代理上启用。
- on,不进行延迟发送,多个包才确认一次。推荐使用。
- off,延迟发送,每发送一个包就需要确认ACK,才发送下一个包。
Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location
启用或禁用TCP_NOPUSH
,FreeBSD上的TCP_CORK
socket选项或Linux上的socket选项。仅在使用sendfile时启用。启用该选项可以
- 以一个包的形式发送响应头和文件的开头。
- 以完整的数据包发送文件。
Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location
TCP_CORK
和TCP_NODELAY
是互相排斥的
选项
TCP_NODELAY
启用是禁用Nagle算法,即数据包立即发送出去,可以降低网络里ACK的数量,从而提升网络性能。如果是交互性的业务,那应该让任意小包可以快速传输,关闭Nagle算法,提高包的传输效率。选项
TCP_CORK
与此相反,可以认为它是Nagle算法的进一步增强,即阻塞数据包发送,可以降低网络里小包的数量,从而提升网络性能。如果需要提供网络的传输效率,应该减少小包的传输,使用TCP_CORK来做汇总传输,再利用sendfile来提高效率。
Nginx字符转换
ngx_http_charset_module
模块将指定的字符集添加到“ Content-Type”响应头字段。此外,该模块可以将数据从一种字符集转换为另一种字符集,但有一些限制:
- 转换只有从服务器到客户端一种方式,
- 只能转换单字节字符集
- 或与UTF-8之间的单字节字符集。
charset
是否将指定的字符集添加到“ Content-Type”响应头字段。如果此字符集与source_charset
指令中指定的字符集不同,则会执行转换。
Syntax: charset charset | off;
Default: charset off;
Context: http, server, location, if in location
source_charset
定义响应的源字符集。如果此字符集与charset
指令中指定的字符集不同,则执行转换。
Syntax: source_charset charset;
Default: -
Context: http, server, location, if in location
Location
Nginx
使用Location
可以控制访问网站的路径
官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
Location语法示例
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
uri是用户请求的字符串,即域名后面的web文件路径。
Location正则匹配可以使用测试判断语句
-f # 是否存在文件 -d # 是否存在目录 -e # 是否存在文件或目录 -x # 文件是否可执行
Location语法优先级顺序
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配,并停止搜索,不再向下匹配。 | 1 |
^~ | 匹配以某个字符串开头的查询,并停止搜索,不再向下匹配。 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
!~ | 区分大小写不匹配的正则匹配 | 5 |
!~* | 不区分大小写不匹配的正则匹配 | 6 |
/ | 匹配任何以指定模式开始的查询,正则表达式与较长的字符串优先。 | 7 |
验证配置:
server {
listen 80;
location =/ {
return 200 "location =/";
}
location ^~/ {
return 200 "location ^~/";
}
location ~/ {
return 200 "location ~/";
}
location ~*/ {
return 200 "location ~*/";
}
#location / {
# return 200 "location /"; # 和^~语法重复,先注释下
#}
}
!~
和!~*
属于排除法,符合匹配规则时不会匹配到,也就是轮到它了也不会执行里面的语句。
验证测试:
从上往下依次测试,测试一次注释掉一级,重载Nginx:systemctl reload nginx
# 优先级最高精确匹配=
[root@web01 ~]# curl 127.0.0.1
location =/
# 注释掉=,重载Nginx
[root@web01 ~]# curl 127.0.0.1
location ^~/
# 注释掉^~,去掉/的注释,重载Nginx
[root@web01 ~]# curl 127.0.0.1
location ~/
# 注释掉~,重载Nginx
[root@web01 ~]# curl 127.0.0.1
location ~*/
Location应用场景
# 通用匹配,任何请求都会匹配到
location / {
...
}
# 严格区分大小写,匹配以.php结尾的都走这个location
location ~ \.php$ {
...
}
# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* \.png$ {
...
}
# 实现资源动静分离
location ~ \.(php|jsp|asp) {
root /opt/dynamic;
}
location ~* \.(jpg|gif|html|txt|js|css)$ {
root /opt/static;
}
Location常用配置指令
- alias是目录别名的定义,如果uri以“/”结束,alias必须要用“/”结束,否则403
location /img/ {
alias /var/www/; # 实际路径是/var/www/
}
location ~* /img/(.+\.(gif|png|jpeg)) { # location用正则表达式则必须包含捕获语句(也就是括号())
alias /usr/local/images/$1; # alias则必须要引用这些捕获值
}
- root是最上层目录的定义,文件的绝对路径等于 root+location
location /img/ {
root /var/www; # 实际路径是/var/www/img/
}
- proxy_pass是反向代理配置,用“/”结束不附加location配置路径
location /test/ {
proxy_pass http://127.0.0.1:8080; # 实际将请求转发到http://127.0.0.1:8080/test/
}
location /test/ {
proxy_pass http://127.0.0.1:8080/; # 实际将请求转发到http://127.0.0.1:8080/
}