纸上得来终觉浅,绝知此事要躬行。
1. 主配置相关
1.1 正常运行必备的配置
【1】user USERNAME [GROUPNAME];
- 作用域
main
- 含义解释
- 指定运行
worker
进程的user
和group
- 如果省略
group
,nginx
会使用与user
相同的组名
- 指定运行
user nginx;
user nginx nginx;
【2】pid /path/to/pid_file;
- 作用域
main
- 含义解释
- 指定
nginx
运行使用的pid
文件
- 指定
- 默认值
pid /run/nginx.pid;
pid /var/run/nginx/nginx.pid;
# 文件里面包含对应的PID值
$ cat /var/run/nginx/nginx.pid
2743
【3】worker_rlimit_nofile number;
- 作用域
main
- 含义解释
- 指定一个
worker
进程所能够打开的最大文件句柄数 - 默认值为
1024
,通常无法满足我们的需求,需要修改 - 用于在不重启主进程的情况下增大该限制
- 指定一个
worker_rlimit_nofile 10240;
【4】worker_rlimit_core size;
- 作用域
main
- 含义解释
- 修改工作进程的
core
文件尺寸的最大值限制,通常不做修改 - 用于在不重启主进程的情况下增大该限制
- 修改工作进程的
worker_rlimit_core 65535;
【5】thread_pool name threads=number [max_queue=number];
- 作用域
main
- 含义解释
- 线程池可以使
worker
进程不阻塞的读写文件 name
参数用于定义线程池的名称threads
参数用于定义线程池中的线程数量max_queue
参数可以限制多少数量的任务可以在队列中等待- 版本
1.7.11
之后,该指令才可以使用
- 线程池可以使
- 默认值
thread_pool default threads=32 max_queue=65536;
# 如果线程池中所有的线程很很繁忙忙,新请求进来之前就需要排队等待了
# 此时max_queue参数可以限制多少数量的任务可以在队列中等待
# 默认情况下,队列的最大等待任务数量为65536个,超出时就会导致队列溢出抛出错误
thread_pool wsescape threads=32 max_queue=65536;
【6】include file|mask;
- 作用域
- 任意位置
- 含义解释
- 将一个文件或者匹配指定
mask
的文件包含到配置中去 - 被包含的文件应由语法正确的指令和块组成
- 将一个文件或者匹配指定
# main
include /etc/nginx/modules-enabled/*.conf;
# http
include /etc/nginx/mime.types;
# http
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
【7】env variable[=value];
- 作用域
main
- 含义解释
- 一般情况下,不用设置
- 默认情况下,
nginx
会删除从父进程继承的除TZ
变量以外的所有环境变量 - 该指令允许
nginx
保留某些继承的环境变量,改变它们的值或者创建新的环境变量 - 这些变量将在热升级
nginx
执行文件时被继承、被ngx_http_perl_module
模块使用、被工作进程使用 TZ
变量总是被继承,并且可被ngx_http_perl_module
模块使用, 除非明确配置不允许这样
- 默认值
env TZ;
# Nginx环境变量是由nginx内部设置和使用,用户不应直接设置它
env MALLOC_OPTIONS;
env PERL5LIB=/data/site/modules;
env OPENSSL_ALLOW_PROXY_CERTS=1;
1.2 优化性能相关的配置
【1】worker_processes number|auto;
- 作用域
main
- 含义解释
- 设置
master
启用的worker
线程个数,通常设置为物理CPU
核心数减1
- 从
nginx1.3.8
开始支持auto
参数,表示nginx
会自动检测进行合理的分配 - 最优值取决于许多因素,包括 CPU 核的数量、数量存储数据的硬盘驱动器、加载模式等
- 设置
- 默认值
worker_processes 1;
worker_processes auto;
【2】worker_cpu_affinity auto|cpumask ...;
- 作用域
main
- 含义解释
- 绑定
worker
进程至指定的CPU
上 - 默认情况下,工作进程不绑定到任何特定的
CPU
上的 - 绑定进程不能避免进程间切换,但是至少可以保证该进程的缓存不会失效
- 绑定
# 绑定工作进程到指定的CPU集合
# 每个CPU集合使用一个标记允许使用的CPU的位图来表示,需要为每个工作进程分别设置CPU集合
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
# 如果位数不够表示了,可以使用更多的位数
worker_processes 6;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000;
# 适合于超线程的机器
# 将每个工作进程分别绑定至不同的CPU
# 将第一个工作进程绑定至CPU0/CPU2,将第二个工作进程绑定至CPU1/CPU3
worker_processes 2;
worker_cpu_affinity 0101 1010;
【3】ssl_engine device;
- 作用域
main
- 含义解释
- 在存在
ssl
硬件加速器的服务器上,指定所使用的ssl
硬件加速设备
- 在存在
ssl_engine ssl-speed-hr;
【4】timer_resolution interval;
- 作用域
main
- 含义解释
- 计时器解析度:降低此值可以减少
gettimeofday()
的调用次数 - 默认情况下,每收到一个内核事件,
nginx
都会调用一次gettimeofday()
方法 - 在
x86-64
系统上,gettimeofday()
代价已经很小,可以忽略此配置
- 计时器解析度:降低此值可以减少
timer_resolution 100ms;
【5】worker_priority number;
- 作用域
main
- 含义解释
- 定义
worker
进程的调度优先级 - 与
nice
命令基本一致,number
为负数代表优先级更高 - 范围为
-20, 19
对于值为100, 139
- 定义
- 默认值
worker_priority 0;
# 调为负值的时候,可以让CPU优先处理nginx的进行请求
worker_priority -10;
【6】worker_shutdown_timeout time;
- 作用域
main
- 含义解释
- 配置
worker
进程的优雅的关闭时长,过期后将尝试关闭所有当前打开的连接之后重启 - 版本
1.11.11
之后,该指令才可以使用
- 配置
worker_shutdown_timeout 100s;
【7】pcre_jit on | off;
- 作用域
main
- 含义解释
- 开启或禁止在配置解析阶段为正则表达式使用即时编译(
PCRE JIT
)技术,可以显著提升正则表达式的处理速度 - 从
PCRE 8.20
版本开始,可用PCRE
的--enable-jit
编译选项打开JIT
功能 - 当使用
PCRE
源码库编译nginx
时(--with-pcre=
), 应该使用nginx
的--with-pcre-jit
编译选项开启JIT
支持
- 开启或禁止在配置解析阶段为正则表达式使用即时编译(
- 默认值
pcre_jit off;
pcre_jit on;
1.3 event 事件相关的配置
【1】events { ... }
- 作用域
main
- 含义解释
- 提供配置上下文,以解析那些影响连接处理的指令
events {
accept_mutex on;
accept_mutex_delay 100ms;
worker_connections 10240;
...
}
【2】accept_mutex on|off;
- 作用域
events
- 含义解释
master
进程将请求调度至各worker
进程时用的负载均衡锁- 如果使用,
nginx
的多个worker
进程将以串行方式轮流响应新请求 - 而通常当一个
worker
进程的负载达到其上限的7/8
,master
就尽可能不再将请求调度此worker
- 否则,新请求将通报给所有
worker
进程,如果新请求数量较少,某些worker
进程可能只是在浪费系统资源 - 必须开启
accept_mutex
才能使用rtsig
事件模型
- 默认值
accept_mutex on;
accept_mutex off;
【3】accept_mutex_delay time;
- 作用域
events
- 含义解释
- 使用
accept_mutex
时,发现某个worker
进程正在工作,自身需要等待多久重新开始尝试接入新请求
- 使用
- 默认值
accept_mutex_delay 500ms;
accept_mutex_delay 100ms;
【4】lock_file file;
- 作用域
main
- 含义解释
nginx
使用锁机制来实现accept_mutex
,并将访问串行化到共享内存- 定义
accept_mutex
使用的锁文件位置
- 默认值
lock_file logs/nginx.lock;
lock_file /etc/nginx/lock/nginx.lock;
【5】multi_accept on|off;
- 作用域
events
- 含义解释
- 是否允许一次性地响应多个用户请求,默认为
off
模式 - 使用
kqueue
事件模式时,可忽略这条指令,因为 kqueue 可以报告有多少新连接等待接入 - 使用 rtsig 事件模式将自动开启 multi_accept
- 是否允许一次性地响应多个用户请求,默认为
- 默认值
multi_accept off;
multi_accept on;
【6】use method;
- 作用域
events
- 含义解释
- 定义
nginx
使用的事件模型 - 通常不需要明确设置,因为
nginx
默认会使用最高效的方法
- 定义
use epoll;
【7】worker_connections number;
- 作用域
events
- 含义解释
- 设置每个
worker
进程可以响应的最大并发请求数 - 请求数量 =
work_processes * worker_connections
- 需要记住,这个数量包含所有连接而不仅仅是和客户端的连接
- 实际的并发连接数是不能超过打开文件的最大数量限制的,这个限制可以用
worker_rlimit_nofile
指令修改
- 设置每个
- 默认值
worker_connections 512;
worker_connections 10240;
【8】worker_aio_requests number;
- 作用域
events
- 含义解释
- 在使用
epoll
事件模型下使用aio
时, 可以设置单个工作进程未处理的异步I/O
操作的最大数量 - 只在版本
1.1.4
和1.0.7
可以使用该指令
- 在使用
- 默认值
worker_aio_requests 32;
worker_aio_requests 64;
1.4 调试/定位相关的配置
部分参数设置需要在编译
nginx
时使用了--with-debug
选项才有效
【1】daemon on|off;
- 作用域
main
- 含义解释
- 是否以守护进程方式启动
nginx
服务,调试时设置为off
,运行时设置为on
- 不运行为守护进程,会将日志等信息输出到控制台,主要用于开发和调试时才使用
- 是否以守护进程方式启动
- 默认值
daemon on;
daemon off;
【2】master_process on|off;
- 作用域
main
- 含义解释
- 是否以
master/worker
模型来运行nginx
服务 - 调试时可以设置为
off
,表示由master
直接接受用户请求
- 是否以
- 默认值
master_process on;
master_process off;
【3】error_log file [level];
- 作用域
main
、http
、server
、location
- 含义解释
- 错误日志文件及其级别,出于调试的目的可以使用
debug
级别 - 但此级别只有在编译
nginx
时使用了--with-debug
选项才有效 level
的值可以为debug|info|notice|warn|error|crit|alert|emerg
,默认为error
- 输出可以为文件(
file
)、标准输出(stderr
)、日志服务器(syslog
)、内存空间(memory
)
- 错误日志文件及其级别,出于调试的目的可以使用
- 默认值
error_log logs/error.log error;
# 文件
error_log /var/logs/error.log info;
# 标准输出
error_log stderr error;
# 日志服务器
# 格式:syslog:server=address{,parameter=value}
error_log syslog:server=192.168.100.10 warn;
# 内存空间
error_log memory:10240;
2. 虚拟主机相关
Nginx
必须使用虚拟机来配置站点,且每个虚拟主机使用一个server {}
段配置,非虚拟主机的配置或公共配置,需要定义在server
之外和http
之内。
2.1 常规运行相关的配置
【1】http { ... }
- 作用域
main
- 含义解释
- 为
HTTP
服务器提供配置
- 为
http {
server {
listen 8080;
server_name www.wsescape.com;
root "/nginx/web";
}
}
【2】server {}
- 作用域
http
- 含义解释
- 表示开始设置虚拟主机的配置
Nginx
没有明显分隔基于 IP 地址(IP-based
)和基于主机名(name-based
)这两种类型的虚拟主机, 而是用listen
指令描述虚拟主机接受连接的地址和端口,用server_name
指令列出虚拟主机的所有主机名
http {
server {
listen 8080;
server_name www.wsescape.com;
root "/nginx/web";
}
}
【3】listen address[:port];
- 作用域
server
- 含义解释
- 定义虚拟主机监听的地址和端口
- 对于
IP
协议,这个地址就是address
和port
- 对于
UNIX
域套接字协议,这个地址就是path
- 默认值
listen *:80|*:8000;
# IPv4地址的表示方式
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
# IPv6地址(0.7.36版)用方括号来表示
listen [::]:8000;
listen [fe80::1];
# UNIX域套接字(0.8.21版)则使用“unix:”前缀
listen unix:/var/run/nginx.sock;
# 配置服务器可以处理HTTP和HTTPS请求
listen 80;
listen 443 ssl;
# 配置带参数的listen
listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
# 在这些操作系统上(Linux 2.4+)可以使用keepidle,keepintvl和keepcnt参数来配置
# 空闲超时(TCP_KEEPIDLE)、探测次数(TCP_KEEPCNT)、探测时间间隔(TCP_KEEPINTVL)
# 设置空闲超时为30分钟,设置探测次数为10次,保留探测时间间隔为系统默认值
so_keepalive=30m::10
# 第一种表达方式
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]];
版本0.8.21以前,default_server参数的名称为default
版本0.7.14以前,才可以使用ssl参数,配置服务器可以处理HTTP和HTTPS请求
版本1.9.5以前,才可以使用http2参数,配置服务器可以支持HTTP/2协议
版本1.3.15-1.9.4之间,可以支持谷歌开发的SPDY协议,基本不用
版本1.5.12以前,才可以使用proxy_protocol参数,允许指定所有连接在该端口上接受应该使用代理协议
# (1) default_server参数
如果listen指令带有default_server参数,当前虚拟主机将成为指定address:port的默认虚拟主机。
如果listen指令后没有带default_server参数,那么第一个监听address:port的虚拟主机将作为这个地址的默认虚拟主机。
# (2) setfib=number参数
这个参数(0.8.44)为监听套接字设置关联路由表FIB,当前这个参数仅工作在FreeBSD上
# (3) fastopen=number参数
使“TCP快开放”的监听套接字(1.5.8)和连接队列的最大长度限制,尚未完成了三方握手
建议不要启用该参数特性,除非服务器可以处理接收相同的SYN包不止一次的数据
# (4) backlog=number参数
为系统调用listen()设置backlog参数,用以限制未接受(Accept)连接的队列的最大长度
FreeBSD和Mac的操作系统下,backlog的默认值是-1,在其他操作系统中,backlog的默认值是511
# (5) rcvbuf=size参数
为监听套接字设置接收缓冲区大小(SO_RCVBUF参数)
# (6) sndbuf=size参数
为监听套接字设置发送缓冲区大小(SO_SNDBUF参数)
# (7) deferred参数
指示在Linux系统使用延迟的accept()
# (8) bind参数
指示nginx为设置的address:port单独调用一次bind()。这是因为当有多条listen指令监听不同地址下的
相同端口,而其中一条listen指令监听了这个端口的所有地址(*:port)时,nginx只会为*:port调用一次
bind()绑定套接字。需要留意的是,这种情况下,nginx会调用getsockname()系统调用来确定接受请求的
套接字地址。 如果为某个address:port定义了参数backlog、rcvbuf、 sndbuf、accept_filter、
deferred或者so_keepalive, nginx总会为这个地址单独调用一次bind()绑定套接字。
# (9) ipv6only=on|off参数
这个参数(0.7.42)决定监听在通配地址[::]上的IPv6套接字是只支持IPv6连接,还是同时支持IPv6和IPv4连接
这个参数默认打开,并且只能在nginx启动时设置
在1.3.4版本以前,如果省略此参数,那么操作系统的套接字设置将生效
# (10) ssl参数
本参数(0.7.14)与套接字相关的系统调用无关,但是它可以指定从这个端口接受的连接应该以SSL模式工作
本参数在某服务器同时处理HTTP和HTTPS请求时,可以使配置更为紧凑。
# (11) so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]参数
这个参数(1.1.11)为监听套接字配置“TCP keepalive”行为,如果省略此参数设置将对此端口生效
如果参数值设置为on,监听套接字的SO_KEEPALIVE属性将被开启
如果参数值设置为off,监听套接字的SO_KEEPALIVE属性将被关闭
【4】server_name name ...;
- 作用域
server
- 含义解释
- 设置虚拟主机名
- 可以跟多个主机名,名称中可以使用通配符和正则表达式(通常以
~
开头) - 当
nginx
收到一个请求时,会取出其首部的server
的值,而后跟众server_name
进行比较
- 默认值
server_name "";
# 匹配比较优先顺序
(1) 先做精确匹配:如www.escape.com
(2) 左侧通配符匹配:如*.escape.com
(3) 右侧通配符匹配:如www.abc.com, www.*
(4) 正则表达式匹配:如~^.*\.escape\.com$
# 设置单个虚拟主机名称
server {
server_name .example.com;
}
# 设置多个虚拟主机名称
server {
server_name www.example.com ~^www\d+\.example\.com$;
}
【5】server_names_hash_bucket_size size;
- 作用域
http
- 含义解释
- 设置主机名哈希桶大小,其默认值取决于处理器的缓存线长度
- 为了实现快速主机查找,
nginx
使用hash
表来保存主机名 - 另一篇文档设置哈希表详细介绍了如何设置哈希表
- 默认值
server_names_hash_bucket_size 32|64|128;
server_names_hash_bucket_size 64;
【6】server_names_hash_max_size size;
- 作用域
http
- 含义解释
- 设置主机名哈希表的最大容量
- 默认值
server_names_hash_max_size 512;
server_names_hash_max_size 1024;
【7】location [ = | ~ | ~* | ^~ ] uri { ... }
- 作用域
server
、location
- 含义解释
- 还有一种表达方式:
location @name { ... }
- 允许根据用户请求的
URI
来匹配指定的各location
以进行访问配置 - 匹配到时,将被
location
块中的配置所处理,比如http://www.wsescape.com/images/logo.gif
- 使用
=
前缀可以定义URI
和路径的精确匹配,如果匹配,则终止路径查找 - 前缀
@
定义了命名路径,这种路径不在一般的请求处理中使用, 而是用在请求重定向中
- 还有一种表达方式:
# 匹配比较优先顺序:字符字面量最精确匹配、正则表达式检索(由第一个匹配到所处理)、按字符字面量
(1) =:精确匹配
(2) ~:正则表达式模式匹配,匹配时区分字符大小写
(3) ~*:正则表达式模式匹配,匹配时忽略字符大小写
(4) ^~: URI前半部分匹配,不检查正则表达式
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
2.2 文件路径相关的匹配
【1】root path;
- 作用域
http
、server
、location
、if in location
- 含义解释
- 设置
Web
资源路径,用于指定请求的根文档目录
- 设置
- 默认值
root html;
# /index.html将由/www/htdocs/index.html文件来响应
location / {
root /www/htdocs;
}
# /images/b.html将由/data/w3/images/b.html文件来响应
location /images/ {
root /data/w3;
}
【2】alias path;
- 作用域
location
- 含义解释
- 只能用于
location
中,用于路径别名
- 只能用于
# /i/top.gif将由/data/w3/images/top.gif文件来响应
location /i/ {
alias /data/w3/images/;
}
# /images/b.html将由/data/w3/b.html文件来响应
location /images/ {
alias /data/w3/;
}
# /images/b.html将由/data/w3/images/b.html文件来响应
location /images/ {
alias /data/w3/images/;
}
location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
alias /data/w3/images/$1;
}
【3】index file ...;
- 作用域
http
、server
、location
- 含义解释
- 定义默认页面,可参跟多个值,列表中的最后一个元素可以是一个带有绝对路径的文件
- 模块
ngx_http_index_module
处理以斜线字符/
结尾的请求
- 默认值
index index.html;
location / {
index index.$geo.html index.0.html /index.html;
}
# 需要注意的是,index文件会引发内部重定向,请求可能会被其它location处理
# 如下面这个例子中,请求“/”实际上将会在第二个location中作为“/index.html”被处理
location = / {
index index.html;
}
location / {
...
}
【4】error_page code ... [=[response]] uri
- 作用域
http
、server
、location
、if in location
- 含义解释
- 定义错误页面重定向
- 当对于某个请求返回错误时,如果匹配上了
error_page
指令中设定的code
,则重定向到新的URI
中
# 一般的设置方式
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 可以使用=response语法改变响应状态码,响应的如果是404的话返回给用户200页面
error_page 404 =200 /empty.gif;
# 也可以使用本指令对错误处理进行重定向
error_page 403 http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;
# 如果内部跳转时无需改变URI,可以将错误处理转到一个命名路径
location / {
error_page 404 = @fallback;
}
location @fallback {
proxy_pass http://backend;
}
【5】try_files file ... uri;
- 作用域
server
、location
- 含义解释
- 还有一种表达方式:
try_files file ... =code;
- 自左至右尝试读取指定的路径,在第一次找到即停止并返回,如果所有路径均不存在,则返回最后一个
URI
- 文件路径是根据
root
指令和alias
指令,将file
参数拼接而成 - 可以在名字尾部添加斜线以检查目录是否存在,比如
$uri/
- 还有一种表达方式:
# $uri表示请求的路径
location /images/ {
try_files $uri /images/default.gif;
}
location = /images/default.gif {
expires 30s;
}
# /documents/a.html请求,先查找/docu/a.html,在查找/temp.html
location ~* ^/documents/(.*)$ {
root /www/htdocs;
try_files $uri /docu/$1 /temp.html;
}
# 从0.7.51版本开始,最后一个参数也可以是code
location / {
try_files $uri $uri/index.html $uri.html =404;
}
# 下面是代理Mongrel的例子
location / {
try_files /system/maintenance.html
$uri $uri/index.html $uri.html
@mongrel;
}
location @mongrel {
proxy_pass http://mongrel;
}
# 下面是Drupal用FastCGI的例子
location / {
try_files $uri $uri/ @drupal;
}
location ~ \.php$ {
try_files $uri @drupal;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param QUERY_STRING $args;
... other fastcgi_param's
}
location @drupal {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/index.php;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param QUERY_STRING q=$uri&$args;
... other fastcgi_param's
}
2.3 网络连接相关的设置
【1】keepalive_timeout timeout [header_timeout];
- 作用域
http
、server
、location
- 含义解释
- 保持连接的超时时长
- 第一个参数设置客户端的长连接在服务器端保持的最长时间,在此时间客户端未发起新请求则长连接关闭
- 第二个参数为可选项,设置
Keep-Alive: timeout=time
响应头的值 - 可以为这两个参数设置不同的值
- 默认值
keepalive_timeout 75s;
keepalive_timeout 360s;
【2】keepalive_requests number;
- 作用域
http
、server
、location
- 含义解释
- 在一次长连接上允许承载的最大请求数,请求数超过此值时长连接将关闭
- 在
0.8.0
版本之后才可以使用该指令
- 默认值
keepalive_requests 100;
keepalive_requests 1000;
【3】keepalive_disable none|browser ...;
- 作用域
http
、server
、location
- 含义解释
- 对指定的浏览器禁止使用长连接
- 浏览器可以为:
msie6
|safari
|none
,值为none
表示为所有浏览器开启长连接功能
- 默认值
keepalive_disable msie6;
keepalive_disable none;
【4】tcp_nodelay on|off;
- 作用域
http
、server
、location
- 含义解释
- 对
keepalive
连接是否使用TCP_NODELAY
选项,仅在将连接转变为长连接的时候才被启用 TCP_NODELAY
选项的功能就是响应报文不经过内核直接返回给客户端,加载网站的响应速度- 一般在
upstream
发送响应到客户端时也会启用
- 对
- 默认值
tcp_nodelay on;
tcp_nodelay off;
【5】client_header_timeout time;
- 作用域
http
、server
- 含义解释
- 读取
http
客户端请求首部的超时时长 - 如果客户端在这段时间内没有传送完整的头部到服务器,将返回错误
408
(Request Time-out
)给客户端
- 读取
- 默认值
client_header_timeout 60s;
client_header_timeout 10s;
【6】client_body_timeout time;
- 作用域
http
、server
、location
- 含义解释
- 读取
http
请求包体的超时时长 - 超时是指相邻两次读操作之间的最大时间间隔,而不是整个请求正文完成传输的最大时间
- 如果客户端在这段时间内没有传输任何数据,服务器将返回
408
(Request Time-out
)错误到客户端
- 读取
- 默认值
client_body_timeout 60s;
client_body_timeout 10s;
【7】send_timeout time;
- 作用域
http
、server
、location
- 含义解释
- 服务器发送响应的超时时长
- 超时仅指两次相邻写操作之间的时间间隔,而非整个响应的传输时间
- 如果客户端在这段时间中没有收到任何数据,连接将关闭
- 默认值
send_timeout 60s;
send_timeout 10s;
2.4 对客户端请求的限制
【1】client_max_body_size size;
- 作用域
http
、server
、location
- 含义解释
- 设置允许客户端请求正文的最大长度,请求的长度由
Content-Length
请求头指定 - 如果请求的长度超过设定值,服务器将返回错误
413
(Request Entity Too Large
)到客户端 - 将
size
设置成0
可以使nginx
不检查客户端请求正文的长度
- 设置允许客户端请求正文的最大长度,请求的长度由
- 默认值
client_max_body_size 1m;
client_max_body_size 2m;
【2】limit_except method ... { ... }
- 作用域
location
- 含义解释
- 指定对范围之外的其它方法的访问控制
HTTP
方法可选值有GET
、HEAD
、POST
、PUT
、DELETE
、OPTIONS
、PATCH
等- 指定
method
为GET
方法的同时,nginx
会自动添加HEAD
方法 - 由
ngx_http_access_module
和ngx_http_auth_basic_module
模块的指令来限制访问
# 请留意该例子将对除GET和HEAD方法以外的所有HTTP方法的请求进行访问限制
limit_except GET {
allow 192.168.1.0/32;
deny all;
}
【3】limit_rate rate;
- 作用域
http
、server
、location
、if in location
- 含义解释
- 限制向客户端传送响应的速率限制,参数
rate
的单位是字节/秒,设置为0
将关闭限速 - 如果进行连接限速时,某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的
2
倍
- 限制向客户端传送响应的速率限制,参数
- 默认值
limit_rate 0;
# 也可以利用$limit_rate变量设置流量限制
server {
if ($slow) {
set $limit_rate 4k;
}
...
}
【4】limit_rate_after size;
- 作用域
http
、server
、location
、if in location
- 含义解释
- 设置不限速传输的响应大小,当传输量大于此值时,超出部分将限速传送
- 默认值
limit_rate_after 0;
location /flv/ {
flv;
limit_rate_after 500k;
limit_rate 50k;
}
2.5 文件操作优化的设置
【1】sendfile on|off;
- 作用域
http
、server
、location
、if in location
- 含义解释
- 开启或关闭使用
sendfile()
调用
- 开启或关闭使用
- 默认值
sendfile off;
# 从0.8.12版本开始可以使用aio预装数据sendfile()
location /video/ {
sendfile on;
tcp_nopush on;
aio on;
}
【2】aio on|off|threads[=pool];
- 作用域
http
、server
、location
- 含义解释
- 是否启用异步文件 I/O(
AIO
)功能 - 在
0.8.11
版本之后才可以使用该指令
- 是否启用异步文件 I/O(
- 默认值
aio off;
location /video/ {
aio on;
output_buffers 1 64k;
}
# 从Linux内核2.6.22版开始也可以使用AIO,但必须同时开启directio,否则读取将是阻塞的
# 在Linux上,directio指令只在读取的块的边界对齐512字节(在XFS上是4K字节)时才有用
location /video/ {
aio on;
directio 512;
output_buffers 1 128k;
}
# 如果在Linux上同时使用AIO和sendfile
# AIO用于大于或等于directio指令指定的文件,sendfile用于小于directio指令指定的文件或directio未设置
location /video/ {
sendfile on;
aio on;
directio 8m;
}
# 在1.7.11版本之后,文件读取也可以使用多线程,实现真正的无阻塞进程
# 默认情况下,多线程功能是未开启的,需要在编译的时候通过--with-threads参数指定
location /video/ {
sendfile on;
aio threads;
}
【3】open_file_cache off|max=N [inactive=time];
- 作用域
http
、server
、location
- 含义解释
- 是否打开文件缓存功能
- 可缓存打开文件描述符的大小和修改时间、目录查找结果、文件查找时的错误结果
max
设置缓存中元素的最大数量,当缓存溢出时,使用最近最少使用(LRU
)算法删除缓存中的元素inactive
设置超时,在这段时间内缓存元素如果没有被访问,将从缓存中删除,默认超时是60
秒- 如果设置为
off
则关闭缓存
- 默认值
open_file_cache off;
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
【4】open_file_cache_errors on|off;
- 作用域
http
、server
、location
- 含义解释
- 开启或者关闭缓存文件找不到或没有权限访问等相关信息
- 默认值
open_file_cache_errors off;
open_file_cache_errors on;
【5】open_file_cache_min_uses number;
- 作用域
http
、server
、location
- 含义解释
- 设置在由
open_file_cache
指令的inactive
参数配置的超时时间内,文件应该被访问的最小次数 - 如果访问次数大于等于此值,文件描述符会保留在缓存中,否则从缓存中删除
- 设置在由
- 默认值
open_file_cache_min_uses 1;
open_file_cache_min_uses 10;
【6】open_file_cache_valid time;
- 作用域
http
、server
、location
- 含义解释
- 设置检查
open_file_cache
缓存的元素的时间间隔,默认为60s
- 设置检查
- 默认值
open_file_cache_valid 60s;
open_file_cache_valid 30s;
2.6 对客户端请求的处理
【1】ignore_invalid_headers on | off;
- 作用域
http
、server
- 含义解释
- 控制是否忽略非法的请求头字段名,默认为
on
- 合法的名字是由英文字母、数字、下划线和连字符组成,由
underscores_in_headers
指令控制 - 可以在默认虚拟主机的
server
层中定义一次,那么监听在相同地址和端口的所有虚拟主机上都生效
- 控制是否忽略非法的请求头字段名,默认为
- 默认值
ignore_invalid_headers on;
ignore_invalid_headers on;
【2】log_not_found on|off;
- 作用域
http
、server
、location
- 含义解释
- 是否将文件找不到的信息也记录进在错误日志(
error_log
)中去
- 是否将文件找不到的信息也记录进在错误日志(
- 默认值:
log_not_found on;
log_not_found on;
【3】log_subrequest on|off;
- 作用域
http
、server
、location
- 含义解释
- 是否将文件找不到的信息也记录进在错误日志(
access_log
)中去
- 是否将文件找不到的信息也记录进在错误日志(
- 默认值:
log_subrequest off;
log_subrequest off;
【4】resolver address ... [valid=time];
- 作用域
http
、server
、location
- 含义解释
- 指定
nginx
使用的DNS
服务器地址,多台的话以轮询方式 - 可以指定域名或者
IP
地址,如果未指定端口,则使用53
端口 - 可以缓存名字解析的结果,默认情况下,缓存时间为解析响应中的
TTL
字段的值,也允许通过valid
参数覆盖 - 在
1.1.9
版本以前,不可能调节缓存时间,nginx
总会将响应缓存5
分钟
- 指定
resolver 127.0.0.1 [::1]:5353;
resolver 127.0.0.1 [::1]:5353 valid=30s;
【5】resolver_timeout time;
- 作用域
http
、server
、location
- 含义解释
- 为名字解析设置超时
- 默认值
resolver_timeout 30s;
resolver_timeout 5s;
【6】server_tokens on | off;
- 作用域
http
、server
、location
- 含义解释
- 开启或关闭在错误信息的
Server
响应头中输出nginx
版本号
- 开启或关闭在错误信息的
- 默认值
server_tokens on;
server_tokens on;
【7】chunked_transfer_encoding on|off;
- 作用域
http
、server
、location
- 含义解释
- 允许关闭
HTTP/1.1
中的分块传输编码 - 在客户端软件不支持分块传输编码的时候,这条指令才有用
- 允许关闭
- 默认值
chunked_transfer_encoding on;
chunked_transfer_encoding on;
2.7 内存及磁盘资源分配
【1】client_body_buffer_size size;
- 作用域
http
、server
、location
- 含义解释
- 设置读取客户端请求正文的缓冲容量大小
- 如果请求正文大于缓冲容量,整个正文或者正文的一部分将写入临时文件
- 缓冲大小默认等于两块内存页的大小,在
x86
平台、其他32
位平台和x86-64
平台,这个值是8K
- 在其他
64
位平台,这个值一般是16K
- 默认值
client_body_buffer_size 8k|16k;
client_body_buffer_size 8k;
【2】client_body_in_file_only on|clean|off;
- 作用域
http
、server
、location
- 含义解释
- 决定
nginx
是否将客户端请求正文整个存储在磁盘文件中 - 非
off
表示存储,即使包体大小为0
也会创建一个磁盘文件 - 当指令值设置为
on
时,请求处理结束后不会删除临时文件 - 当指令值设置为
clean
时,请求处理结束后会删除临时文件
- 决定
- 默认值
client_body_in_file_only off;
client_body_in_file_only on;
【3】client_body_in_single_buffer on|off;
- 作用域
http
、server
、location
- 含义解释
- 决定
nginx
将整个客户端请求正文保存在一块缓冲区中 - 这条指令推荐在使用
$request_body
变量时使用,可以节省引入的拷贝操作
- 决定
- 默认值
client_body_in_single_buffer off;
client_body_in_single_buffer on;
【4】client_body_temp_path path [level1 [level2 [level3]]];
- 作用域
http
、server
、location
- 含义解释
- 定义存储客户端请求正文的临时文件的目录
- 支持在指定目录下多达
3
层的子目录结构
- 默认值
client_body_temp_path client_body_temp;
# 1表示只使用一个数字,2表示使用两个数字的组合
# 存储临时文件的路径是/spool/nginx/client_temp/7/45/00000123457
client_body_temp_path /spool/nginx/client_temp 1 2;
【5】client_header_buffer_size size;
- 作用域
http
、server
- 含义解释
- 设置读取客户端请求头部的缓冲容量,默认为
1k
- 如果请求中含有的
cookie
很长或者请求来自WAP
的客户端,可能请求头不能放在1K
的缓冲中 - 如果从请求行或者某个请求头开始不能完整的放在这块空间中,那么
nginx
将按照large_client_header_buffers
指令的配置分配更多更大的缓冲来存放
- 设置读取客户端请求头部的缓冲容量,默认为
- 默认值
client_header_buffer_size 1k;
client_header_buffer_size 2k;
【6】large_client_header_buffers number size;
- 作用域
http
、server
- 含义解释
- 设置读取客户端请求超大请求的缓冲最大数量和每块缓冲的容量
HTTP
请求行的长度不能超过一块缓冲的容量,否则nginx
返回错误414
(Request-URI Too Large
)到客户端- 每个请求头的长度也不能超过一块缓冲的容量,否则
nginx
返回错误400
(Bad Request
)到客户端 - 缓冲仅在必需是才分配,默认每块的容量是
8K
字节 - 即使
nginx
处理完请求后与客户端保持入长连接,nginx
也会释放这些缓冲
- 默认值
large_client_header_buffers 4 8k;
large_client_header_buffers 4 8k;
【7】connection_pool_size size;
- 作用域
http
、server
- 含义解释
- 允许微调为每个连接分配的内存,默认为
256
- 这条指令对
nginx
的性能影响非常小,一般不应该使用
- 允许微调为每个连接分配的内存,默认为
- 默认值
connection_pool_size 256;
connection_pool_size 512;
【8】request_pool_size size;
- 作用域
http
、server
- 含义解释
- 允许对每个请求的内存分配进行细调,默认为
4k
- 这条指令对性能影响很小,通常情况下不应使用
- 允许对每个请求的内存分配进行细调,默认为
- 默认值
request_pool_size 4k;
request_pool_size 2k;
3. 高级配置相关
Nginx
的高级配置会涉及到虚拟主机配置、访问控制、用户认证等。
3.1 基于 IP 地址的访问控制
主要事项
ngx_http_access_module
模块提供限制某些IP
地址的客户端访问- 也可以通过用户名/密码或
JWT
来实现限制访问,使用satisfy
指令就能同时通过IP
地址和密码来限制访问 - 在规则很多的情况下,使用
ngx_http_geo_module
模块变量更合适
提供指令
- allow
- 语法格式:
allow address|CIDR|unix:|all;
- 含义解释:允许指定的网络地址访问
- 作用范围:
http
、server
、location
、limit_except
- 语法格式:
- deny
- 语法格式:
deny address|CIDR|unix:|all;
- 含义解释:拒绝指定的网络地址访问
- 作用范围:
http
、server
、location
、limit_except
- 语法格式:
实例演示
# 规则按照顺序依次检测,直到匹配到第一条规则
# IPv4的网络中只有10.1.1.0/16和192.168.1.0/24允许访问,但192.168.1.1除外
# 对于IPv6的网络,只有2001:0db8::/32允许访问
# 在规则很多的情况下,使用ngx_http_geo_module模块变量更合适
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
3.2 基于用户名的访问控制
主要事项
ngx_http_auth_basic_module
模块允许使用HTTP
基本认证协议验证用户名/密码来限制对资源的访问- 也可以通过
IP
地址或JWT
来限制访问,使用satisfy
指令就能同时通过地址和密码来限制访问 auth_basic
指令的参数off
可以取消继承自上一个配置等级auth_basic
指令的影响- 密码应该使用
crypt()
函数加密,可以用htpasswd
命令来创建此类文件,支持MD5
、SHA-1
等格式
提供指令
- auth_basic
- 语法格式:
auth_basic string|off;
- 含义解释:开启基于用户名和密码的访问控制,
string
参数用纸指定名称 - 作用范围:
http
、server
、location
、limit_except
- 默认值是:
auth_basic off;
- 语法格式:
- auth_basic_user_file
- 语法格式:
auth_basic_user_file file;
- 含义解释:指定保存用户名和密码的文件
- 作用范围:
http
、server
、location
、limit_except
- 语法格式:
实例演示
# 用户名/密码文件存储格式
name1:password1
name2:password2:comment
name3:password3
# 配置如下
location / {
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
location /admin/ {
root /www/b.org;
auth_basic "admin area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
3.3 根据 JWT 的客户端授权
主要事项
ngx_http_auth_jwt_module
模块通过使用指定的键验证提供的JSON Web Token
(即JWT
)来实现客户端授权JWT
声明必须以JSON Web Signature
(即可JWS
)结构编码JWT
使用OpenID Connect
作为身份认证方式
提供指令
- auth_jwt
- 语法格式:
auth_jwt string [token=$variable] | off;
- 含义解释:使用
JWT
验证 - 作用范围:
http
、server
、location
- 默认值是:
auth_jwt off;
- 语法格式:
- auth_jwt_key_file
- 语法格式:
auth_jwt_key_file file;
- 含义解释:指定一个文件在
JWT
签名验证的关键设置格式,参数值可以包含变量。 - 作用范围:
http
、server
、location
- 语法格式:
实例演示
location / {
auth_jwt "closed site";
auth_jwt_key_file conf/keys.json;
}
3.4 建立超简单的下载站点
主要事项
ngx_http_autoindex_module
模块可以列出目录中的文件- 一般当
ngx_http_index_module
模块找不到默认主页时,会把请求转给ngx_http_autoindex_module
模块处理
提供指令
- autoindex
- 语法格式:
autoindex on|off;
- 含义解释:开启或者关闭列出目录中文件的功能
- 作用范围:
http
、server
、location
- 默认值是:
autoindex off;
- 语法格式:
- autoindex_exact_size
- 语法格式:
autoindex_exact_size on|off;
- 含义解释:设置目录中列出的文件是显示精确大小,还是对
KB
、MB
、GB
进行四舍五入 - 作用范围:
http
、server
、location
- 默认值是:
autoindex_exact_size on;
- 语法格式:
- autoindex_format
- 语法格式:
autoindex_format html|xml|json|jsonp;
- 含义解释:设置目录列表的格式
- 作用范围:
http
、server
、location
- 默认值是:
autoindex_format html;
- 语法格式:
- autoindex_localtime
- 语法格式:
autoindex_localtime on|off;
- 含义解释:设置目录中列出文件的时间是本地时间还是
UTC
时间 - 作用范围:
http
、server
、location
- 默认值是:
autoindeautoindex_localtime off;
- 语法格式:
实例演示
location / {
autoindex on;
}
3.5 防止网站非法盗链发生
Referer
请求头为指定值时,内嵌变量$invalid_referer
会被设置为空字符串,否则这个变量会被置成1
,查找匹配时不区分大小写。
主要事项
ngx_http_referer_module
模块允许拦截Referer
请求头中含有非法值的请求,阻止它们访问站点。- 但伪造一个有效的
Referer
请求头是相当容易的, 因此预期目的不在于彻底地阻止这些非法请求,而是为了阻止由正常浏览器发出的大规模此类请求。还有一点需要注意,即使正常浏览器发送的合法请求,也可能没有Referer
请求头。
提供指令
valid_referers
- 语法格式:
valid_referers none | blocked | server_names | string ...;
- 含义解释:定义引用规则
- 作用范围:
server
、location
- 语法格式:
指令参数
指令参数 | 指令含义 |
---|---|
none |
匹配没有Referer 的HTTP 请求 |
blocked |
匹配有Referer 请求头,但是它的值被防火墙或者代理服务器删除;这些值都不以http:// 或者https:// 字符串作为开头 |
server_names |
Referer 请求头包含某个虚拟主机名 |
任意字符串 | 定义一个服务器名和可选的URI 前缀;服务器名允许在开头或结尾使用* 符号;当nginx 检查时,Referer 请求头里的服务器端口将被忽略 |
正则表达式 | 必须以~ 符号作为开头;需要注意的是表达式会从http:// 或者https:// 之后的文本开始匹配 |
实例演示
# 定义合规的引用
valid_referers none blocked server_names
*.example.com example.* www.example.org/galleries/
~\.google\.;
# 拒绝不合规的引用
if ($invalid_referer) {
return 403;
}
# 所有来至mysite.com和二级域名的*.mysite.com都是允许访问的
# 以上配置都是简单通过验证请求头来实现防盗链,如果盗链的网站通过伪造来路的http请求时不能屏蔽
location ~ .(jpe?g|png|gif)$ {
valid_referers none blocked mysite.com *.mysite.com;
if ($invalid_referer) {
return 403;
}
}
# 所有来至wsescape.com和域名中包含google和baidu的站点都可以访问到当前站点的图片
# 如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户
# 如果使用下面的rewrite重写,那么盗链的图片都会显示403.jpg
location /images/ {
valid_referers none blocked *.wsescape.com server_names ~\.google\. ~\.baidu\.;
if ($invalid_referer) {
return 403;
# rewrite ^/ http://www.wsescape.com/403.jpg;
}
}
3.6 服务连接的状态页面
主要事项
ngx_http_stub_status_module
模块提供对基本状态信息的访问- 该模块默认情况下不安装,需要启用
--with-http_stub_status_module
参数
提供指令
- stub_status
- 语法格式:
stub_status;
- 含义解释:定义状态页面
- 作用范围:
server
、location
- 语法格式:
# 当前所有处于打开状态的活动连接数
Active connections: 6
# 共处理了x个连接,成功建立了x个握手,总共处理了x个请求
server accepts handled request
241 241 431
# Reading: 正处于接受请求状态的连接数
# Writing: 请求已经接受完成,正处于处理请求或发送响应过程中的连接数
# Waiting: 持久连接模式且处于活动状态的连接数,意思就是nginx已经处理正在等待下一次请求指令的驻留连接,开启keep-alive时,该值等于active-(reading+writing)
Reading: 0 Writing: 1 Waiting: 5
实例演示
# 配置状态页面
server {
listen *:80 default_server;
server_name wsescape.com;
location /ngx_status
{
stub_status;
access_log off;
#allow 127.0.0.1;
#deny all;
}
}
# 重启服务
service nginx restart
# 查看状态页面
Active connections: 11921
server accepts handled requests
11989 11989 11991
Reading: 0 Writing: 7 Waiting: 42
3.7 设置 URL 页面重定向
主要事项
- 用来执行
URL
重定向,该机制用于去掉恶意访问的URL
而且有利于搜索引擎优化 ngx_http_rewrite_module
模块允许正则替换URI
,返回页面重定向和按条件选择配置
处理规则
- 处理在
server
级别中定义的模块指令 - 为请求查找
location
- 处理在选中的
location
中定义的模块指令- 如果指令改变了
URI
,按新的URI
查找location
- 这个循环至多重复
10
次,之后nginx
返回错误500
(Internal Server Error
)
- 如果指令改变了
提供指令
- if
- 语法格式:
if (condition) { ... }
- 含义解释:匹配使用范围
- 作用范围:
server
、location
- 语法格式:
# condition条件类型
1. 变量名
变量值为空串或以0开始,则为false,其余均为true
2. 比较表达式
可以使用=、!=类似的比较操作符进行测试
3. 正则表达式
~: 区分大小写的模式匹配检测,!~为取反
~*: 不区分大小写的模式匹配检测,!~*为取反
4. 测试路径为文件
-f、!-f
5. 测试路径为目录
-d、!-d
6. 测试文件存在
-e、!-e
7. 检测文件是否又可执行权限
-x
- rewrite
- 语法格式:
rewrite regex replacement [flag];
- 含义解释:如果指定的正则表达式能匹配
URI
,此URI
将被replacement
参数定义的字符串改写 - 作用范围:
server
、location
、if
- 语法格式:
# last
本条规则匹配完成后,立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求
# break
本条规则匹配完成即终止,不再匹配后面的任何规则
# redirect
返回302临时重定向,浏览器地址会显示跳转后的URL地址
# permanent
返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
表达式 | 解释说明 |
---|---|
^ |
锚定开头 |
$ |
锚定结尾 |
. |
匹配任意字符 |
[a-z] |
匹配指定字符集内的任意字符 |
[^] |
匹配任何不包括在指定字符集内的任意字符串 |
` | ` 匹配之前和之后的字符串 |
() |
分组;^(hello)(world)\$ 分组捕获结果,\$1 为 hello,\$2 为 world |
rewrite_log
- 语法格式:
rewrite_log on|off;
- 含义解释:是否把重写过程记录以
notice
级别记录到错误日志中,默认为off
- 作用范围:
http
、server
、location
、if
- 默认值是:
rewrite_log off
- 语法格式:
return
- 语法格式:
return code [text];
、return code URL;
、return URL;
- 含义解释:用于结束
rewrite
规则,并且为客户返回状态码 - 作用范围:
server
、location
、if
- 语法格式:
实例演示
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
break;
}
if ($invalid_referer) {
return 403;
}
# 基于浏览器分离
if ($http_user_agent ~ Firefox) {
rewrite ^(.*)$ /Firefox/$1 break;
}
if ($http_user_agent ~ Chrome) {
rewrite ^(.*)$ /Chrome/$1 break;
}
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /MSIE/$1 break;
}
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
rewrite ^/shop/(.*\.html)$ /meishi/$1 break;
rewrite ^/search/(.*) https://www.baidu.com/s?ie=UTF-8&wd=$1 redirect
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
# 上述指令应使用标志break代替last,否则nginx会重复10轮循环,然后返回错误500
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
# 如果replacement字符串包括新的请求参数,以往的请求参数会添加到新参数后面
# 如果不希望这样,在replacement字符串末尾加一个问号?,就可以避免
# 如果正则表达式中包含字符“}”或者“;”,整个表达式应该被包含在单引号或双引号的引用中。比如:
rewrite ^/users/(.*)$ /show?user=$1? last;
4. 内置变量说明
内置变量 | 说明 |
---|---|
$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 ,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 |
在nginx 的配置文件中,可以通过$http_cookie 来访问Cookie |
$http_host |
请求地址,即浏览器中你输入的地址(IP 或域名) |
$http_referer |
url 跳转来源,用来记录从那个页面链接访问过来的 |
$http_user_agent |
用户终端浏览器等信息 |
$http_x_forwarded_for |
能保证网站的web 服务器能获取到真实IP ,即使中间有代理 |
5. 配置 HTTPS 服务
5.1 配置相关证书
# CA服务器
# 创建私钥
cd /etc/pki/CA
(umask 077; openssl genrsa -out private/cakey.key 2048)
# 创建自签证书
# 需要输入相关信息
openssl req -new -x509 -key private/cakey.key -out cacert.pem -days 365
# 创建必要文件
touch index.txt
echo "01" > serial
# Nginx服务器
# 创建私钥
cd /etc/nginx/ssl
(umask 077; openssl genrsa -out nginx.key 2048)
# 创建证书签署请求
# 需要输入相关信息
openssl req -new -key nginx.key -out nginx.csr
# CA服务器
# CA签署证书请求
# 将Nginx服务器的请求发送到CA服务器进行签署
# 之后将签署的文件传送到/etc/nginx/ssl目录下配置nginx的ssl支持
openssl ca -in nginx.scr -out nginx.crt -days 365
5.2 修改配置文件
# Nginx服务器
vim /etc/nginx/conf/nginx.conf
server {
listen 443 ssl;
server_name www.escapelife.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /vhosts/web1;
index index.html index.htm;
}
}
...
# 重新加载配置文件
nginx -s reload