Nginx模块
ngx_http_core_module 模块
帮助文档:
http://nginx.org/en/docs/http/ngx_http_core_module.html
与套接字相关的配置:
1 、server { ... }
配置一个虚拟主机
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
2 、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy][backlog=number] [rcvbuf=size] [sndbuf=size]
default_server 设定为默认虚拟主机
ssl 限制仅能够通过ssl 连接提供服务
backlog=number 超过并发连接数后,新请求进入后援队列的长度
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
注意:
(1) 基于port; ;
listen PORT; 指令监听在不同的端口
(2) 基于ip 的虚拟主机
listen IP:PORT; IP 地址不同
(3) 基于hostname
server_name fqdn; 指令指向不同的主机名
3 、server_name name ...;
虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
支持* 通配任意长度的任意字符
server_name *.magedu.com www.magedu.*
支持~ 起始的字符做正则表达式模式匹配,因性能原因慎用
server_name ~^www\d+\.magedu\.com$
\d 表示 [0-9]
匹配优先级机制从高到低:
(1) 首先是字符串精确匹配 如:www.magedu.com
(2) 左侧* 通配符 如:*.magedu.com
(3) 右侧* 通配符 如:www.magedu.*
(4) 正则表达式: 如: ~^.*\.magedu\.com$
(5) default_server
4 、tcp_nodelay on | off;
在keepalived 模式下的连接是否启用TCP_NODELAY。
选项为off时,延迟发送,合并多个请求后再发送。
默认On 时,不延迟发送。
可用于:http, server,location
5 、sendfile on | off;
是否启用sendfile功能,在内核中封装报文直接发送
默认Off
6 、server_tokens on | off | build | string
是否在响应报文的Server首部显示nginx
定义路径相关的配置
1 、root
设置web资源的路径映射,用于指明请求的URL所对应的文档的目录路径,可用于http, server, location,if in location,就是替换成所指定的根。
location / i / {
root /data/www/vhost1;
}
这个/data/www/vhost1/i/top.gif就是根据/i/top.gif发送的请求
示例
server {
root /data/www/vhost1;
}
http://www.magedu.com/images/logo.jpg --> /data/www/vhosts/images/logo.jpg
2 、location [ = | ~ | ~* | ^~ ] url { ... }
location @name { ... }
语境:server, location
在一个server中location 配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location ,并找出一个最佳匹配,而后应用其配置
示例:
server {...
server_name www.magedu.com;
location /images/ {
root /data/imgs/;
}
}
http://www.magedu.com/images/logo.jpg --> /data/imgs/images/logo.jpg
= :对URI做精确匹配;
location = / {
...
}
http://www.magedu.com/ 匹配
http://www.magedu.com/index.html 不匹配
^~ :对URI的最左边部分做匹配检查,不区分字符大小写
~ :对URI做正则表达式模式匹配,区分字符大小写
~* :对URI做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于此uri的所有的uri
匹配优先级从高到低:
=, ^~, ~/ ~*,
示例:
root /vhosts/www/htdocs/
http://www.magedu.com/index.html --> /vhosts/www/htdocs/index.html
server {
root /vhosts/www/htdocs/
location /admin/ {
root /webapps/app1/data/
}
}
http://www.magedu.com/admin/index.html --> /webapps/app1/data/admin/index.html
location示例
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
3、alias path;
路径别名,文档映射的另一种机制,就是进行完全替换,仅能用于location上下文
示例:
http://www.magedu.com/bbs/index.php
location /bbs/ {
alias /web/forum/;
} --> /web/forum/index.html
location /bbs/ {
root /web/forum/;
} --> /web/forum/bbs/index.html
注意:location 中使用root 指令和alias 指令的意义不同
(a) root,给定的路径对应于location中的/uri/左侧的/
(b) alias,给定的路径对应于location中的/uri/右侧的/
4、index file ...;
指定默认网页资源,注意:ngx_http_index_module
帮助文档:http://nginx.org/en/docs/http/ngx_http_index_module.html#index
5 、error_page code, ... [=[response]] uri;
定义错误页,以指定的响应状态码进行响应
可用位置:http, server, location, if in location
error_page 404 /404.html
error_page 404 =200 /404.html
6 、try_files file, ... uri;
try_files file, ... =code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。
只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。
最后一个参数是回退URI且必须存在,否则会出现内部500错误。
location /images/ {
try_files $uri /images/default.gif;
}
location / {
try_files $uri $uri/index.html $uri.html =404;
}
定义客户端请求的相关设置
1、keepalive_timeout timeout [header_timeout];
设定保持连接超时时长,0表示禁止长连接,默认为75s
2 、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量
默认为100
3 、keepalive_disable none | browser ...
对哪种浏览器禁用长连接
4 、send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
5 、client_body_buffer_size size;
用于接收每个客户端请求报文的body部分的缓冲区大小,默认为16k ,超出此大小时,其将被暂存到磁盘上的由client_body_temp_path 指令所定义的位置
6 、client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body 部分的临时存储路径及子目录结构和数量
目录名为16 进制的数字;
client_body_temp_path /var/tmp/client_body 1 2 2
1,1级目录占1 位16进制,即2^4=16个目录 0-f
2,2级目录占2 位16进制,即2^8=256个目录 00-ff
2,3级目录占2 位16进制,即2^8=256个目录 00-ff
对客户端进行限制的相关配置
1、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second
默认值0表示无限制
2 、limit_except method,... { ... },仅用于location
限制客户端使用除了指定的请求方法之外的其它方法
method:
GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {
allow 192.168.1.0/24;
deny all;
} 允许GET方法,也就会允许HEAD方法,所以上述为,除了GET和HEAD之外其它方法仅允许192.168.1.0/24网段主机
文件操作优化的配置
1 、aio on | off | threads[=pool];
是否启用aio功能,也就是启用或禁用在FreeBSD和Linux上使用异步文件I/O(AIO)。
2 、directio size | off;
是否同步(直接)写磁盘,而非写缓存,在Linux主机启用O_DIRECT标记,则文件大于或等于给定大小时使用,例如directio 4m
3 、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 指令所指定的次数的缓存项即为非活动项,将被删除
4 、open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息
默认值为off
5 、open_file_cache_min_uses number;
open_file_cache 指令的inactive参数指定的时长内,至少被命中此处指定的次数,方可被归类为活动项
默认值为1
6 、open_file_cache_valid time;
缓存项有效性的检查频率
默认值为为60s
ngx_http_access_module 模块
参考文档:
http://nginx.org/en/docs/http/ngx_http_access_module.html
实现基于ip 的访问控制功能
1 、allow address | CIDR | unix: | all;
2 、deny address | CIDR | unix: | all;
使用范围:
http, server, location, limit_except
自上而下检查,一旦匹配,将生效,条件严格的置前
示例:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
ngx_http_auth_basic_module 模块
参考文档:
http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
实现基于用户的访问控制,使用basic机制进行用户认证
1 、auth_basic string | off;
2 、auth_basic_user_file file;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
用户口令 :
1 、明文文本:格式name:password[:comment]
2 、加密文本:由htpasswd命令实现,httpd-tools所提供,或者openssl passwd命令实现。
ngx_http_stub_status_module 模块
参考文档
http://nginx.org/en/docs/http/ngx_http_stub_status_module.html
用于输出nginx 的基本状态信息
输出信息示例:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
对应accepts,handled,requests 三个值
Reading: 6
Writing: 179
Waiting: 106
Active connections: 当前状态,活动状态的连接数
accepts :统计总值,已经接受的客户端请求的总数
handled :统计总值,已经处理完成的客户端请求的总数
requests :统计总值,客户端发来的总的请求数
Reading :当前状态,正在读取客户端请求报文首部的连接的连接数
Writing :当前状态,正在向客户端发送响应报文过程中的连接数
Waiting :当前状态,正在等待客户端发出请求的空闲连接数
stub_status;
最好用于主配文件中的server中定义location
示例:
location /status {
stub_status;
allow 172.16.0.0/16;
deny all;
}
ngx_http_log_module 模块
参考文档
http://nginx.org/en/docs/http/ngx_http_log_module.html
指定日志格式记录请求
1、log_format name [escape=default|json ] string ...;
string 可以使用nginx核心模块及其它模块内嵌的变量
2、access_log path [format [buffer=size] [gzip[=level]][flush=time] [if=condition]];
access_log off;
访问日志文件路径,格式及相关的缓冲的配置
buffer=size
flush=time
示例
log_format compression ‘$remote_addr-$remote_user [$time_local] ‘‘"$request" $status $bytes_sent ‘‘"$http_referer" "$http_user_agent" "$gzip_ratio"‘;
access_log /spool/logs/nginx-access.log compression buffer=32k;
3 、open_log_file_cache max=N [inactive=time][min_uses=N] [valid=time];
open_log_file_cache off;
缓存各日志文件相关的元数据信息
max :缓存的最大文件描述符数量
min_uses :在inactive 指定的时长内访问大于等于此值方可被当作活动项
inactive :非活动时长
valid :验正缓存中各缓存项是否为活动项的时间间隔
ngx_http_gzip_module 模块
参考文档
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
用gzip 方法压缩响应数据,节约带宽
1 、gzip on | off;
启用或禁用gzip压缩
2 、gzip_comp_level level;
压缩比由低到高:1 到 9
默认:1
3 、gzip_disable regex ...;
匹配到客户端浏览器不执行压缩,禁止使用与任何指定的正则表达式匹配的“User-Agent”头域的请求的响应。
4 、gzip_min_length length;
启用压缩功能的响应报文大小,设置将被gzip压缩的响应的最小长度。只能从“内容长度”响应头字段确定长度。
5 、gzip_http_version 1.0 | 1.1;
设定启用压缩功能时,协议的最小版本。
默认:1.1
6 、gzip_buffers number size;
支持实现压缩功能时缓冲区数量及每个缓存区的大小。
默认:32 4k 或16 8k
7 、gzip_types mime-type,...;
指明仅对哪些类型的资源执行压缩操作;即压缩过滤器。
默认包含有text/html,不用指定,否则出错。*匹配任何类型。
类型可见:/etc/nginx/mime.types
8 、gzip_vary on | off;
如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”
9 、gzip_proxied off | expired | no-cache | no-store |private | no_last_modified | no_etag | auth | any ...;
nginx 对于代理服务器请求的响应报文,在何种条件下启用压缩功能
off :
对被代理的请求不启用压缩
expired,no-cache,no-store,private :对代理服务器请求的响应报文首部Cache-Control 值任何一个,启用压缩功能
expired
如果响应头包含具有禁用缓存的值的“Expires”字段,则启用压缩;
no-cache
如果响应头包含“Cache-Control”字段和“ no-cache”参数,则启用压缩。
no-store
如果响应头包含“Cache-Control”字段和“ no-store”参数,则启用压缩。
private
如果响应头包含“Cache-Control”字段和“ private”参数,则启用压缩。
no_last_modified
如果响应头不包含“Last-Modified”字段,则启用压缩;
no_etag
如果响应头不包含“ETag”字段,则启用压缩;
auth
如果请求头包含“Authorization”字段,则启用压缩;
any
为所有代理的请求启用压缩。
示例:
gzip on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css application/javascript;
ngx_http_ssl_module 模块
用于验证,参考文档
http://nginx.org/en/docs/http/ngx_http_ssl_module.html
http {
...
server {
listen 443 ssl;
keepalive_timeout 70;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
...
}
1 、ssl on | off;
为指定虚拟机启用HTTPS protocol,建议用listen 指令进行监听443 ssl。
2 、ssl_certificate file;
当前虚拟主机使用PEM 格式的证书文件。
3 、ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件。
4 、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1][TLSv1.2];
启用指定的协议,支持ssl协议版本,默认为后三个。
5 、ssl_session_cache off | none | [builtin[:size]][shared:name:size];
设置存储会话参数的高速缓存的类型和大小。
off
严格禁止使用会话缓存:nginx明确告诉客户端会话可能不被重用。
none
会话缓存的使用被轻轻地禁止:nginx告诉客户端会话可能被重用,但实际上并没有将会话参数存储在缓存中。
builtin[:size]
使用OpenSSL内建缓存,为一个worker进程私有。一个内置OpenSSL的缓存; 仅由一个工作进程使用。缓存大小在会话中指定。如果没有给出大小,则等于20480次会话。使用内置缓存可能会导致内存碎片。
[shared:name:size]
在各worke之间使用一个共享缓存。在所有工作进程之间共享缓存。缓存大小以字节为单位指定; 一兆字节可以存储约4000个会话。每个共享缓存应具有任意名称。具有相同名称的缓存可用于多个虚拟服务器。
6 、ssl_session_timeout time;
客户端连接可以复用ssl session cache 中缓存的ssl 参数的有效时长,默认5m
7 、密钥和证书创建
1)可以进入到/etc/ssl/certs进行创建
cd /etc/pki/tls/certs/
make nginx.crt(根据需求填写,且会同时创建nginx.key)
此时nginx.key还是加密状态,所以要先解密,不然nginx启动时没法读取。
openssl rsa -in nginx.key -out nginx2.key
2)使用openssl命令
openssl genrsa -out /etc/nginx/ssl/nginx.key 2048
openssl rep -new -x509 -key /etc/nginx/ssl/nginx.key -days 7300 -out /etc/nginx/ssl/nginx.crt
示例:
server {
listen 443 ssl;
server_name www.shen.com;
root /usr/share/nginx/ssl;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
}
curl -k https://www.shen.com
ngx_http_rewrite_module 模块
将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换。
该ngx_http_rewrite_module模块用于使用PCRE正则表达式,返回重定向和有条件选择配置来更改请求URI。
示例:
http://www.magedu.com/hn --> http://www.magedu.com/henan
http://www.magedu.com --> https://www.magedu.com/
参考文档
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
1 、rewrite regex replacement [flag]
语境: server,location,if.
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement 指定的新的URI
注意:
如果在同一级配置块中存在多个rewrite 规则,那么会自上而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查。
隐含有循环机制, 但不超过10 次;如果超过,提示500响应码,[flag] 所表示的标志位用于控制此循环机制。
如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端。
301 :永久重定向
[flag]:
last:
重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查,提前重启新一轮循环。
break:
重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用。
redirect:
临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,不能以http:// 或https:// 开头,使用相对路径,状态码:302
permanent:
重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码 :301。
示例:
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
rewrite ^/users/(.*)$ /show?user=$1? last;
2 、return
return code [text];
return code URL;
return URL;
停止处理,并返回给客户端指定的响应码。
可以指定重定向URL(代码301,302,303,307和308)或响应主体text(用于其他代码)。
响应正文文本和重定向网址可以包含变量。
URL用于代码302的临时重定向可以被指定为唯一的参数。
这样的参数应该以“ http://”,“ https://” 或“ $scheme”字符串开头,URL可以包含变量。
3 、rewrite_log on | off;
是否开启重写日志, 发送至error_log (notice level)
启用或禁用将ngx_http_rewrite_module 模块指令处理结果记录到该notice级别的error_log中。
4 、set $variable value;
用户自定义变量
注意:变量定义和调用都要以$
设置一个value指定的variable。该value可以包含文本,变量,他们的组合。
5 、if (condition) { ... }
引入新的上下文, 条件满足时,执行配置块中的配置指令,server, location condition:
指定的condition被评估,如果为true,则在该大括号内指定的此模块指令将被执行,并且请求被分配给该if指令内的配置 。if指令内的配置继承自以前的配置级别。
比较操作符:
== 相同
!= 不同
~ :模式匹配,区分字符大小写
~* :模式匹配,不区分字符大小写
!~ :模式不匹配,区分字符大小写
!~* :模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e 存在(包括文件,目录,软链接)
-f, !-f 文件
-d, !-d 目录
-x, !-x 执行
示例:
if($ http_user_agent?MSIE){
rewrite ^(。*)$ / msie / $ 1 break;
}
if($ http_cookie?*“id =([^;] +)(?:; | $)”){
set $ id $ 1;
}
if($ request_method = POST){
return 405;
}
if($ slow){
limit_rate 10k;
}
if($ invalid_referer){
return 403;
}
ngx_http_referer_module 模块
The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the“Referer” header field,可防止盗链。
该ngx_http_referer_module模块用于在“Referer”标题字段中阻止对具有无效值的请求的站点访问。
应该记住,使用适当的“参考”字段值制造请求是非常容易的,因此本模块的预期目的不是彻底阻止这些请求,而是阻止常规浏览器发送请求的大量流量。
还应该考虑到,即使有效的请求,常规浏览器也可能不会发送“引用者”字段。
valid_referers none blocked server_names *.example.com example.* www.example.org/galleries ~\.google\.;
if ($invalid_referer) {
return 403;
}
参考文档
http://nginx.org/en/docs/http/ngx_http_referer_module.html
1、valid_referers none|blocked|server_names|string ...;
定义referer首部的合法可用值,不能匹配的将是非法值
none:
请求报文首部没有referer首部
block:
请求报文有referer首部,但无有效值
server_names:
参数,其可以有值作为主机名或主机名模式
arbitrary_string:
任意字符串,但可使用*作通配符
regular expression:
被指定的正则表达式模式匹配到的字符串, 要使用~开头,例如: ~.*\.magedu\.com
$invalid_referer
如果“Referer”请求头字段值被认为有效,则为空字符串, 否则为“ 1”。
示例:
valid_referers none block server_names *.magedu.com
*.mageedu.com magedu.* mageedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
2 、referer_hash_max_size size;
设置size有效参考哈希表的最大值。设置散列表的细节在单独的文档中提供,默认为2048。
3 、referer_hash_bucket_size size;
设置有效的引用哈希表的存储器大小,设置散列表的细节在单独的文档中提供,默认为64。
示例:
valid_referers none blocked server_names
*.example.com example.* www.example.org/galleries/
~\.google\.;
if ($invalid_referer) {
return 403;
}
ngx_http_proxy_module 模块
该ngx_http_proxy_module模块允许将请求传递给另一个服务器。
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
参考文档
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
1 、proxy_pass URL;
Context:location, if in location, limit_except。
设置代理服务器的协议和地址以及位置应映射到的可选URI。
作为协议,可以指定“ http”或“ https”。
该地址可以指定为域名或IP地址,也可以指定为可选端口。
注意:
proxy_pass 后面的路径不带uri时,其会将location的uri传递给后端主机。
server {
...
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host[:port]; ##最后没有/
}
...
}
上面示例是:http://HOSTNAME/uri --> http://host/uri
http://host[:port]/ 意味着:http://HOSTNAME/uri --> http://host/
proxy_pass 后面的路径是一个uri时,其会将location的uri替换为proxy_pass 的uri。
server {
...
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host/new_uri/; ##这个最后有/
}
...
}
http://HOSTNAME/uri/ --> http://host/new_uri/
如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri,因为不能进行替换,用户请求时传递的uri将直接附加代理到的服务的之后。
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host; ##不能加/
}
...
}
http://HOSTNAME/uri/ --> http://host/uri/
2 、proxy_set_header field value;
Context: http, server, location
设定发往后端主机的请求报文的请求首部的值。
允许将字段重新定义或附加到传递给代理服务器的请求标头 。
该value可以包含文本,变量,以及它们的组合。
当且仅当proxy_set_header 在当前级别上没有定义指令时,这些指令将从上一级继承 。
默认情况下,仅重新定义两个字段:
proxy_set_header Host $ proxy_host;
proxy_set_header Connection close;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
3 、proxy_cache_path;
定义可用于proxy功能的缓存;
设置缓存的路径和其他参数,缓存数据存储在文件中,缓存中的文件名是将MD5功能应用于缓存键的结果。
Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=name:size [inactive=time] [max_size=size]
[manager_files=number] [manager_sleep=time]
[manager_threshold=time] [loader_files=number] [loader_sleep=time]
[loader_threshold=time] [purger=on|off] [purger_files=number]
[purger_sleep=time] [purger_threshold=time];
4 、proxy_cache zone | off; 默认off
Context:http,server, location
指明调用的缓存,或关闭缓存机制;
定义用于缓存的共享内存区域。相同的区域可以在几个地方使用。参数值可以包含变量。
5 、proxy_cache_key string;
缓存中用于“键”的内容
默认值: proxy_cache_key $scheme$proxy_host$request_uri;
6 、proxy_cache_valid [code ...] time;
语境: http,server,location。
定义对特定响应码的响应内容的缓存时长。
如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
为代码为200和302的响应设置10分钟的缓存,对于代码为404的响应,设置1分钟。
proxy_cache_valid 5m;
仅time指定缓存,只有200,301和302个响应被缓存。
另外,any可以指定参数来缓存任何响应
示例:
在http 配置定义缓存
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:1:1 keys_zone=proxycache:20m
inactive=120s max_size=1g;
调用缓存功能,需要定义在相应的配置段 ,如server{...};
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
7 、proxy_cache_use_stale;
proxy_cache_use_stale error | timeout |invalid_header | updating | http_500 | http_502 |http_503 | http_504 | http_403 | http_404 | off ...
在被代理的后端服务器出现哪种情况下,可以直接使用过期的缓存响应客户端
8 、proxy_cache_methods GET | HEAD | POST ...;
对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存。
如果客户端请求方法在此指令中列出,则响应将被缓存。“ GET”和“ HEAD”方法总是添加到列表中
9 、proxy_hide_header field;
语境: http,server,location
默认情况下,nginx不会将代理服务器的响应中的头字段“Date”,“Server”,“X-Pad”和“X-Accel -...”传递给客户端。
该proxy_hide_header指令设置不会传递的其他字段。如果需要允许字段的传递,则可以使用proxy_pass_header指令。
用于隐藏后端服务器特定的响应首部。
10 、proxy_connect_timeout time;
语境: http,server,location
定义与后端服务器建立连接的超时时长,如超时会出现502错误,默认为60s ,一般不建议超出75s,
11、proxy_send_timeout time;
语境: http,server,location
把请求发送给后端服务器的超时时长;默认为60s
12 、proxy_read_timeout time;
语境: http,server,location
等待后端服务器发送响应报文的超时时长, 默认为60s
参考文档
http://nginx.org/en/docs/http/ngx_http_headers_module.html
向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值
1、add_header name value [always];
语境: http,server,location,if in location
添加自定义首部
如果响应代码等于200,201,204,206,301,302,303,304,307或308,则将指定的字段添加到响应头部,该值可以包含变量。
可能有几个add_header指令,当且仅当add_header在当前级别上没有定义指令时,这些指令将从上一级继承 。
如果always指定了参数,则将添加头字段,而不管响应代码如何。
示例:
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;
2、add_trailer name value [always];
语境: http,server,location,if in location
添加自定义响应信息的尾部
将响应代码等于200,201,206,301,302,303,307或308的指定字段添加到响应的结尾。该值可以包含变量。
可能有几个add_trailer指令,当且仅当add_trailer 在当前级别上没有定义指令时,这些指令将从上一级继承 。
如果always指定了参数,则无论响应代码如何,都将添加指定的字段。
ngx_http_fastcgi_module 模块
参考文档
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
转发请求到FastCGI服务器,不支持php模块方式
location / {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
}
1 、fastcgi_pass address;
语境: location,if in location
address 为后端的fastcgi server的地
设置FastCGI服务器的地址,地址可以指定为域名或IP地址,端口号:
fastcgi_pass localhost:9000;
或作为UNIX域的套接字路径:
fastcgi_pass unix:/tmp/fastcgi.socket;
如果域名解析成多个地址,则所有这些地址都将以循环方式使用。
另外,可以将地址指定为服务器组。
参数值可以包含变量。
在这种情况下,如果地址被指定为域名,则在描述的服务器组之间搜索该名称,如果未找到,则使用解析器确定该名称 。
2 、fastcgi_index name;
语境: http,server,location。
fastcgi 默认的主页资源。
示例:
fastcgi_index index.php;
3 、fastcgi_param parameter value [if_not_empty];
语境: http,server,location
给设置传递给 FastCGI 服务器的参数值,可以是文本,变量或组合
示例
显示了PHP的最低要求设置:
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
fastcgi_param QUERY_STRING $ query_string;
该SCRIPT_FILENAME参数用于PHP中以确定脚本名称,该QUERY_STRING 参数用于传递请求参数。
对于处理POST请求的脚本,还需要以下三个参数:
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
如果使用--enable-force-cgi-redirect 配置参数构建PHP,那么该REDIRECT_STATUS参数也应该传递值为“200”:
fastcgi_param REDIRECT_STATUS 200;
如果使用if_not_empty指定了该指令,那么这样的参数将不会传递给服务器,直到其值不为空:
fastcgi_param HTTPS $ https if_not_empty;
示例1:
1 )在后端服务器先配置fpm server 和mariadb-server
2 )在前端nginx 服务上做以下配置:
location ~* \.php$ {
fastcgi_pass 后端fpm服务器IP:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
fastcgi_param QUERY_STRING $ query_string;
include fastcgi_params;
…
}
示例2 :通过/pm_status 和/ping 来获取fpm server状态信息
location ~* ^/(pm_status|ping)$ {
include fastcgi_params;
fastcgi_pass 后端fpm 服务器IP :9000;
fastcgi_param SCRIPT_FILENAME
$fastcgi_script_name;
}
4 、fastcgi_cache_path path [levels=levels]
[use_temp_path=on|off]keys_zone=name:size [inactive=time] [max_size=size][manager_files=number] [manager_sleep=time] [manager_threshold=time][loader_files=number] [loader_sleep=time] [loader_threshold=time][purger=on|off] [purger_files=number] [purger_sleep=time][purger_threshold=time];
语境: http
定义fastcgi 的缓存;
path 缓存位置为磁盘上的文件系统
max_size=size
磁盘path 路径中用于 缓存数据的缓存空间上限
levels=levels :缓存目录的层级数量,以及每一级的目录数量levels=ONE:TWO:THREE
示例:leves=1:2:2
keys_zone=name:size
k/v 映射的内存空间的名称及大小
inactive=time
非活动时长
设置缓存的路径和其他参数。
缓存数据存储在文件中。缓存中的密钥和文件名都是将MD5功能应用于代理URL的结果。该levels参数定义缓存的层次结构级别:从1到3,每个级别接受值1或2.
fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
5 、fastcgi_cache zone | off;
语境: http,server,location
调用指定的缓存空间来缓存数据。相同的区域可以在几个地方使用。参数值可以包含变量。
6 、fastcgi_cache_key string;
语境: http,server,location
定义用作缓存项的key的字符串
示例:
fastcgi_cache_key $request_rui;
fastcgi_cache_key localhost:9000 $request_uri;
7 、fastcgi_cache_methods GET | HEAD | POST ...;
语境: http,server,location
为哪些请求方法使用缓存。
如果客户端请求方法在此指令中列出,则响应将被缓存。“GET”和“HEAD”方法总是添加到列表中,建议明确指定。
8 、fastcgi_cache_min_uses number;
语境: http,server,location
缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到,此处所指定的次数方可被认作活动项。
9 、fastcgi_keep_conn on | off;
语境: http,server,location
收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启用长连接。
默认情况下,FastCGI服务器将在发送响应后立即关闭连接。但是,当该指令设置为on,nginx将指示FastCGI服务器保持连接处于打开状态。这是必要的,特别是与FastCGI服务器的Keepalive连接功能。
10 、fastcgi_cache_valid [code ...] time;
语境: http,server,location
不同的响应码各自的缓存时长
如:
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 404 1m;
为代码为200和302的响应设置10分钟的缓存,对于代码为404的响应,设置1分钟。
如果仅time上指定缓存
fastcgi_cache_valid 5m;
那么只有200,301和302个响应被缓存。
另外,any可以指定参数来缓存任何响应:
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
缓存的参数也可以直接在响应头中设置。这比使用该指令设置缓存时间要高。
示例:
http {
fastcgi_cache_path /var/cache/nginx/fcgi_cache levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;
...
server {
location ~* \.php$ {
...
fastcgi_cache fcgicache;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
...
}
}
ngx_http_upstream_module 模块
参考文档
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
用于将多个服务器定义成服务器组,而由proxy_pass,fastcgi_pass 等指令进行引用
该ngx_http_upstream_module模块用于定义可由proxy_pass, fastcgi_pass,uwsgi_pass, scgi_pass和 memcached_pa??ss指令引用的服务器组。
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
1 、upstream name { ... }
语境: http
定义后端服务器组,会引入一个新的上下文
默认调度算法是wrr
upstream httpdsrvs {
server ...
server...
...
}
定义一组服务器。服务器可以在不同端口上侦听。另外,监听TCP和UNIX域套接字的服务器可以混合使用。
如:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
默认情况下,使用加权循环平衡方法在服务器之间分配请求。
在上述示例中,每个7个请求将按如下方式分发:
5个请求转到backend1.example.com ,一个请求到每个第二和第三个服务器上。
如果在与服务器通信期间发生错误,则请求将被传递到下一个服务器,依此类推,直到所有正在运行的服务器都将被尝试。
如果无法从任何服务器获得成功的响应,客户端将收到与最后一台服务器通信的结果。
2 、server address [parameters];
语境:upstream
在upstream 上下文中server成员,以及相关的参数,定义服务器address和其他parameters服务器。
address 的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters:
weight=number
权重,默认为1
max_conns
连接后端服务器最大并发活动连接数
max_fails=number
失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用, 默认为1
fail_timeout=time
后端服务器标记为不可用状态的连接超时时长,默认10s。
backup
将服务器标记为“备用”,即所有服务器均不可用时才启用
down
标记为“不可用”,配合ip_hash
3 、ip_hash ;
语境: upstream
源地址hash调度方法
指定组应该使用根据客户端IP地址在服务器之间分配请求的负载平衡方法。
客户端IPv4地址或整个IPv6地址的前三个八位字节被用作散列密钥,该方法确保来自同一客户端的请求将始终传递到同一服务器,除非此服务器不可用。
在后一种情况下,客户端请求将被传递到另一个服务器。很可能,它将始终是同一台服务器。
如果其中一个服务器需要临时删除,则应该使用该down参数标记,这是为了保留客户端IP地址的当前哈希值。
如:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
4 、least_conn
语境: upstream
最少连接调度算法,当server拥有不同的权重时其为wlc。
当所有后端主机连接数相同时,则使用wrr,适用于长连接。
指定一个组应该使用负载平衡方法,其中请求被传递到具有最少数量的活动连接的服务器,同时考虑服务器的权重。
如果有几个这样的服务器,则依次使用加权循环平衡方法。
5 、hash key [consistent(一致性哈希)]
语境: upstream
基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者组合。
指定客户机 - 服务器映射基于散列key值的服务器组的负载平衡方法。该key可以包含文本,变量,以及它们的组合。
请注意,从组中添加或删除服务器可能会导致将大多数密钥重新映射到不同的服务器。
如果consistent指定了参数,将改为使用ketama一致的散列方法。
该方法确保在将服务器添加到组或从组中删除时,只会将几个键重新映射到不同的服务器。这有助于为缓存服务器实现更高的缓存命中率。
作用:将请求分类,同一类请求将发往同一个upstream server ,使用consistent参数, 将使用ketama 一致性hash算法,适用于后端是Cache服务器(如varnish )时使用
hash $request_uri consistent;
hash $remote_addr;
6 、keepalive connections;
连接数N,为每个worker进程保留的空闲的长连接数量, 可节约nginx端口,并减少连接管理的消耗。
激活与上游服务器连接的缓存。
该connections参数设置保存在每个工作进程的缓存中的上游服务器的空闲保持连接的最大数量。超过此号码时,最近使用的最近连接关闭。
应该特别指出,该keepalive指令不限制与nginx工作进程可以打开的上游服务器的总数。该connections参数应设置为足够小的数量,以使上游服务器也处理新的传入连接。
具有keepalive连接的memcached上游示例配置:
upstream memcached_backend {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
keepalive 32;
}
server {
...
location /memcached/ {
set $memcached_key $uri;
memcached_pass memcached_backend;
}
}
对于HTTP,proxy_http_version 指令应该被设置为“ 1.1”,并且应该清除“连接”头字段:
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
对于FastCGI服务器,必须设置 fastcgi_keep_conn 才能使keepalive连接正常工作:
upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 8;
}
server {
...
location /fastcgi/ {
fastcgi_pass fastcgi_backend;
fastcgi_keep_conn on;
...
}
}
7 、health_check [parameters];
语境:http
健康状态检测机制;只能用于location 上下文
常用参数:
interval=time
检测的频率,默认为5秒
fails=number:
判定服务器不可用的失败检测次数;默认为1次
passes=number:
判定服务器可用的失败检测次数;默认为1次
uri=uri:
做健康状态检测测试的目标uri ;默认为/
match=NAME:
健康状态检测的结果评估调用此处指定的match 配置块
注意:仅对nginx plus
8 、match name { ... }
语境:http
对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文
常用的参数:
status code[ code ...]:
期望的响应状态码
header HEADER[operator value]:
期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较
body :
期望响应报文的主体部分应该有的内容
注意:仅对nginx plus
nginx 的其它的二次发行版
Tengine:
由淘宝网发起的Web 服务器项目。
它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。
它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
从2011年12月开始,Tengine 成为一个开源网项目,官网 http://tengine.taobao.org/
OpenResty:
基于Nginx与Lua语言的高性能 Web平台
ngx_stream_core_module 模块
参考文档
http://nginx.org/en/docs/stream/ngx_stream_core_module.html
模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器。
worker_processes auto;
error_log /var/log/nginx/error.log info;
events {
worker_connections 1024;
}
stream {
upstream backend {
hash $remote_addr consistent;
server backend1.example.com:12345 weight=5;
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
upstream dns {
server 192.168.0.1:53535;
server dns.example.com:53;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass backend;
}
server {
listen 127.0.0.1:53 udp;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass dns;
}
server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
}
1 、stream { ... }
语境: main
定义stream 相关的服务;
提供指定流服务器指令的配置文件上下文。
stream {
upstream telnetsrvs {
server 192.168.22.2:23;
server 192.168.22.3:23;
least_conn;
}
server {
listen 10.1.0.6:23;
proxy_pass telnetsrvs;
}
}
2 、listen
listen address:port [ssl] [udp] [proxy_protocol][backlog=number]
[bind] [ipv6only=on|off] [reuseport][so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
语境: server
设置address以及port对哪些服务器将接受连接。可以指定端口。地址也可以是主机名。如:
listen 127.0.0.1:12345;
listen *:12345;
listen 12345; # same as *:12345
listen localhost:12345;
IPv6地址在方括号中指定:
listen [::1]:12345;
listen [::]:12345;
UNIX域套接字用“ unix:”前缀指定:
listen unix:/var/run/nginx.sock;
该ssl参数允许指定在此端口上,接受的所有连接都应在SSL模式下工作。
该udp参数配置一个侦听套接字来处理数据报。
该proxy_protocol参数允许指定这个端口上接受的所有连接,应使用代理服务器协议。
该listen指令可以具有特定于套接字相关系统调用的几个附加参数。
ngx_stream_proxy_module 模块
参考文档
http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html
可实现代理基于TCP,UDP,UNIX-domain sockets的数据流。
该ngx_stream_proxy_module模块允许通过TCP,UDP和UNIX域套接字代理数据流。
server {
listen 127.0.0.1:12345;
proxy_pass 127.0.0.1:8080;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 1m;
proxy_pass example.com:12345;
}
server {
listen 53 udp;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass dns.example.com:53;
}
server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
1 、proxy_pass address;
语境: server
指定后端服务器地址。
设置代理服务器的地址,地址可以指定为域名或IP地址,端口号:
proxy_pass localhost:12345;
或作为UNIX域的套接字路径:
proxy_pass unix:/tmp/stream.socket;
如果域名解析成多个地址,则所有这些地址都将以循环方式使用。
另外,可以将地址指定为服务器组。
也可以使用变量指定地址:
proxy_pass $ upstream;
在这种情况下,在所描述的服务器组之间搜索服务器名称 ,并且如果没有找到,则使用解析器来确定 。
2 、proxy_timeout timeout;
语境: stream, server
无数据传输时,保持连接状态的超时时长,默认为10m
timeout在客户端或代理服务器连接上设置两次连续的读取或写入操作。如果在此时间内没有数据传输,则连接被关闭。
3 、proxy_connect_timeout time;
语境: stream, server
设置nginx与被代理的服务器尝试建立连接的超时时长,默认为60s
示例:
stream {
upstream telnetsrvs {
server 192.168.10.130:23;
server 192.168.10.131:23;
hash $remote_addr consistent;
}
server {
listen 172.16.100.10:2323;
proxy_pass telnetsrvs;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}