Nginx官方站点:http://nginx.org/
解决C10k的问题;能支持较大并发的服务器程序,突破了1万个请求。
nginx功能:
可以当做静态的web服务器;
core模块实现http功能;
支持虚拟主机(基于port、hostname、ip方式);
keepalived保持会话
访问日志
url rewrite重写
路径别名
基于ip访问控制
速率限制及并发数量限制等;
可作为(http的)反代服务器及负载均衡器;
proxy模块实现反代
upstream模块实现负载均衡
支持fastcgi使用FastCGI模块与php通信
基于模块化,,可以与后端的不同应用通信;需要哪种功能就把哪种功能的模块编译进来即可;
Nginx模块一般可分为三类:核心模块、标准模块(http和邮件)、第三方模块(各种应用);
每个模块都有相应的配置指令和内置变量;
Nginx是模块化设计,包括核心模块、标准模块(http标准模块、http可选模块、mail模块)、3rd(第三方)模块
Nginx配置文件结构:
nginx.conf:主配置文件
main block:全局配置(对http及mail模块均有效);
event {
...
}:事件驱动的相关配置;
http{
...
}:http协议的相关配置;
mail {
...
}:mail相关配置;
http相关的配置:
http {
...
...
server { 每个用来定义一个虚拟主机,但只能有一个虚拟主机使用https;
...
servr_name 当前主机名
root 根文档路径
alias 别名
location /uri/{ 定义类似于别名的映射;
...
if
}
...
}
server {
...
...
}
}
main block配置段: Core functionality 核心模块
配置指令的类别:3类
正常运行必备的配置;
优化性能的配置;
用于调试、定位问题的配置;
正常运行必备的配置:
1、user USERNAME [GROUPNAME];
指定用于运行worker进程的用户和组;组可省略;
例如:
user nginx nginx;
2、pid /PATH/TO/PID_FILE;
指定nginx进程的pid文件路径;
例如:
pid /var/run/nginx.pid;
3、worker_rlimit_nofile number;
单个worker进程所能打开的最大文件数,默认1024个;
性能优化相关的配置:
1、worker_processes number | auto;
指明worker的进程数,通常为CPU的核心数减1;
例如:
worker_processes 4;
2、绑定nginx使用固定哪颗cpu
worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
CPUMASK:掩码,只能有一位置1,代表固定的cpu颗数;
0000 0001 第0号cpu,即第1颗cpu
0000 0010 第1号cpu,即第2颗cpu
0000 0100 第2号cpu,即第3颗cpu
......
例如:
worker_cpu_affinity 0001
工作在第1颗cpu上,但是cpu编号是从0开始;
3、worker_priority nice;
工作进程优先级,nice:[-20,19],对应优先级:[100-139],nice值越小,优先级越高;
例如:
worker_priority -5;
调试、定位问题:
1、daemon on|off;
是否以守护进程方式启动nginx进程;只有调试时才关闭,为off;
2、master_proces on|off;
是否以master/worker模型启动nginx进程;只有调试时才关闭,为off;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
错误日志文件的记录方式及其日志级别;其中debug,依赖于编译时--with-debug选项;
例如:
error_log /var/log/nginx/error.log warn;
file /PATH/TO/SOME_LOG_FILE; 指定日志文件路径,也可以使用syslog记录日志;
stderr:发送到错误输出
syslog:server=address[,parameter=value]:发送给syslog服务器;要指明服务器IP或参数;
memory:size 记录到内存中;性能好,断电会消失,磁盘IO压力大;一般打开日志缓冲,缓解IO压力;
日志级别(列出的选项):debug依赖于configure时的--with-debug选项;
events配置段
1、worker_connections numbers;
每个worker进程所能够并发打开的最大连接数;受限于(worker_rlimit_nofile设置)它所能够打开的文件数量的;
当前主机所能响应的最大并发连接数=worker_processes*worker_connections
2、use method;
指明并发连接请求处理时使用的方法;支持的方法有:select、poll、kqueue、epoll、/dev/poll、eventport
3、accept_mutex on|off;
是否打开负载均衡锁,启用时,表示用于让多个worker进程轮流地、序列化的响应新请求;
4、lock_file file;
指明锁文件路径且需要自定义;nginx使用锁机制实现互斥功能,并且序列化的让各worker访问这段共享内存;
http配置段:ngx_http_core_module模块
定义套接字相关功能:
1、server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
...
}
注意:
(1)基于port的虚拟主机:
listen指令需要使用不同的端口;
(2)基于HOSTNAME的虚拟主机:
server_name指令指向不同的主机名;
(3)基于IP的虚拟主机;
listen IP:por
ip要使用不同的地址;
例如:基于端口的虚拟主机
server {
listen 80;
server_name webserver;
root /usr/share/nginx/html;
index index.html;
}
server {
listen 808;
server_name webserver;
root /var/www/html;
index index.html;
}
例如:基于主机名的虚拟主机
server {
listen 80;
server_name www.stu11.com;
root /usr/share/nginx/html;
index index.html;
sendfile on;
}
server {
listen 80;
server_name www1.stu11.com;
root /var/www/html;
index index.html;
}
例如:基于ip的虚拟主机
server {
listen 172.18.11.11:80;
server_name webserver;
root /usr/share/nginx/html;
index index.html;
}
server {
listen 172.18.11.12:80;
server_name webserver;
root /var/www/html;
index index.html;
}
2、listen(定义方法有3种):
(1)listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
指明地址,默认端口为80;
(2)listen port [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
指定端口的所有地址,即本机所有可用地址的端口;
(3)listen unix:path [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
使用unix socket套接字文件实现通信,客户端和服务端都是本机进程,使用本地回环接口进行通信,特点就是不会经由协议栈发送数据;
default_server:设置默认虚拟主机;
ssl:限制只能通过ssl连接提供服务;端口要为443;
backlog:后援队列的长度;
rcvbuf:接收缓冲区大小;
sndbuf:发送缓冲区大小;
3、server_name name ...;
为虚拟主机指明当前server的主机名;后可跟一个或空白字符分隔的多个主机名;支持使用*通配任意长度的任意字符;~起始的正则表达式模式字符串;
主机名匹配应用策略:(优先级)由高到底:
(1)首先精确匹配;
(2)左侧*通配符匹配;
(3)右侧*通配符匹配;
(4)正则表达式模式匹配;
4、tcp_nodelay on|off;
默认为on,只对keepalived模式下的连接是否启用此功能,客户端请求有小数据时,服务端不延迟等待多个小数据之后再响应给客户端,而是立即发送给客户端;
5、sendfile on|off;
是否启用sendfile功能,即在内核中直接封装响应报文响应用户的请求;默认是关闭的,需要手动启用;
定义路径相关配置:
6、root path;
设置web资源的路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;
可用的上下文:
http:表示对所有server都生效;
server:表示只对当前一个server生效;
location:表示只对location中的URL生效;
if:表示仅对条件判断生效;
7、location(有2种方式):
根据用户请求的URI来匹配定义的多个location,匹配到时,此请求将被相应的location块中的配置指令所处理;
(1)location [ = | ~ | ~* | ^~ ] uri { ... }
(2)location @name {...}
匹配优先级:=、^~、~/~*、不带符号;
=:URI精确匹配;用户给定的URI与location中的完成一样;
^~:对URI左半部分做匹配检查,不区分字符大小写;
~:做正则表达式模式匹配,区分字符大小写;
~*:做正则表达式模式匹配,不区分字符大小写;
8、alias path;
定义路径别名,也是文档映射的一种机制,只能用在location上下文;
注意:
root指令:给定的路径对应于location中/uri/左侧的/;
alias指令:给定的路径对应于location中的/uri/右侧的/(这个url),而不包含uri本身;
例如:
请求资源:http://www.magedu.com/bbs/a.jpg
对应资源:http://www.magedu.com/web/forum/a.jpg
文件路径:/web/forum/a.jpg
location /bbs/ {
alias /web/forum/;
}
相当于访问的是:/web/forum/a.jpg;
例如:
location /bbs/ {
root /web/forum/;
}
相当于访问的是:/web/forum/bbs/a.jpg
9、index file ...;
设置默认主页;在不同的location可指定不同的主页;
10、error_page code...[=[response]] url;
自定义错误页面,根据用户请求的资源的http响应的状态码实现错误页重定向;
例如:
]# vim /etc/nginx/nginx.conf
server {
listen 80;
server_name www.stu11.com;
root /web;
location /www/ {
root /web/var/;
index page.html;
}
location / {
root /var/www/html;
index index.html;
}
error_page 404 /index.html;
index index.html;
sendfile on;
}
]# vim /var/www/html/index.html
<h1>Error_Page</h1>
在浏览器输入:http://www1.stu11.com/hello.html
显示:Error_Page
用错误页面响应时,响应码是404;
也可以定义响应码,例如让客户端显示错误页面时的响应码为200,则:
]# vim /etc/nginx/nginx.conf
error_page 404 =200 /404.html;
在浏览器输入:http://www1.stu11.com/hello.html
显示:Error_Page
11、try_files
实验失败!
定义客户端请求的相关配置:
12、keepalive_timeout timeout [header_timeout];
设定保持连接的超时时长,0表示禁止使用长连接,默认为75秒;
13、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认100个;
14、keepalive_disable none|browser...;
对哪种浏览器禁用长连接;none表示不禁用;
15、send_timeout time;
向客户端发送响应报文的超时时长,默认60秒;特别地,是指两次写操作之间的间隔时长;
16、client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小,默认为16k,超出此大小时,其将被暂存到磁盘上;
17、client_body_tmp_path path[level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
例如:
client_body_tmp_path /var/tmp/body 2 1 2;
表示在/var/tmp/body目录下用2个十六进制数创建一级子目录,即可创建256个(2个十六进制数的变化范围)一级子目录;然后在每个一级子目录下又用1个十六进制数创建二级子目录,即可创建16个(1个十六进制数的变化范围)二级子目录;最后在每个二级子目录下又可创建256个(2个十六进制数的变化范围)三级子目录;
对客户端请求进行限制的相关配置:
18、limiti_rate rate;
限制服务器端每秒钟响应给客户端的传输速率,单位是字节/秒,bytes/second,0表示无限制;
例如:
]# vim /etc/nginx/nginx.conf
location /download/ {
limit_rate 20480;
root /web/host1;
}
]# mkdir /web/host1/download
]# dd if=/dev/zero of=/web/host1/download/test.img bs=1M count=50
]# nginx -s reload
]# vim /web/host1/download/index.html
<h1>download</h1>
在本机测试:
]# wget http://192.168.255.2/test.img
浏览器测试:http://www1.stu11.com/download/test.img
显示:下载对话框;速度非常慢;
19、limit_except method... {...};
限制对指定的请求方法之外的其它方法的使用客户端;
例如:
limit_except GET POST{
allow 172.17.0.0/16;
deny all;
}
表示除了GET(自动包含HEAD)和POST之外的其它方法仅允许172.18.0.0/16中的主机使用;
文件操作优化的配置:
20、aio on|off|threads[=pool];
是否启用aio功能;默认关闭;指明使用多少个线程;不指定就是用多少启用多少线程;可用在http, server, location;
21、directio size|off;
是否启用直接IO;启用多大的IO空间;
直接IO就是写请求的时候,数据不在内存中缓存而是直接刷到磁盘上去,这就是直接IO;对性能有影响,对数据可靠性比较高;
22、缓存启用
open_file_cache off;
对打开的文件是否缓存下来,nginx缓存的是文件的元数据;off:表示不缓存;
nginx可以缓存以下三种信息:
(1)文件的描述符、文件大小和最近一次的修改时间;
(2)打开的目录结构;
(3)没有找到的或没有权限访问的文件的相关信息;
open_file_cache max=N[inactive=time];
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的超时时长,在此处指定的时长内未被命中的缓存项即为非活动项;
23、open_file_cache_errors on|off;
是否缓存查找时发生错误的文件一类的信息;open_file_cache的功能是否有效,取决于此处指令;
24、open_file_cache_min_uses number;
缓存项在非活动期限内,最少应该被访问的次数;
非活动项是在open_file_cache中指定的时长内至少要访问多少次,才认为是活动项,少于此处指定的次数才认为是非活动项;
25、open_file_cache_valid time;
缓存项有效性的检查频率;默认为60秒;
ngx_http_access_module模块:访问控制模块
实现基于客户端ip的访问控制功能;
26、allow address|CIDR|unix:|all;
27、deny address|CIDR|unix:|all;
ngx_http_auth_basic_module模块;基于用户认证的模块
28、auth_basic string|off;
使用basic机制进行用户认证;用户为虚拟用户,要指明账号、密码的位置;
例如:
location / {
allow 172.18.11.0/24;
deny all;
}
29、auth_basic_user_file file;
认证用的账号密码文件;
文件格式:
name:password:comment
密码格式:
htpasswd命令
例如:
location /www/ {
root /web/var/;
index page.html;
auth_basic "Admin page";
auth_basic_user_file /web/var/.passwd;
}
]# htpasswd -c -m /etc/nginx/.nginxpasswd tom
输入:tom的密码
ngx_http_stub_status_module模块;用于输出nginx的基本状态信息
30、stub_status;
显示状态信息:
Active connections: 2
server accepts handled requests
19 19 44
Reading: 0 Writing: 1 Waiting: 1
表示意义:
Active connecttions:处于活动状态的客户端连接的数量;(包括等待客户端发来请求、开始建立连接的客户端但已经处于等待客户端发请求、或正在处理客户端请求、正在给客户端发响应报文)
accepts:服务器已经接受客户端请求的总数;(包括已经处理完、正在处理)
handled:已经处理完成的客户端请求的总数;(接收的大于处理完成的数量;)
requests:客户端已经发来的请求总数;(包含拒绝的请求)
Reading:正处于读取客户端请求报文首部的连接数量;
Writing:正处于向客户端发送响应报文过程中的连接数;
Waiting:正处于等待客户端发出请求的空闲连接数;如果启用保持连接功能,客户端请求资源后没再请求就处于空闲状态;如果waiting状态数量很多,表示大量客户端处于空闲状态,有可能是keep allive timeout设置时间太长所导致;
例如:
location /status {
stub_status;
}
ngx_http_referer_module模块;基于引用做访问控制;表示从哪个链接跳转到当前页面;
31、valid_refers none|blocked|server_names|string...;
定义合法的referer数据;可实现防盗链拒绝访问,拒绝来自某链接到本网页等功能;
none:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:其值是主机名;一般是自己的域名;
string:有2种
arbitrary string:直接字符串,可以使用*通配符;
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头;
ngx_http_ssl_module模块;
32、ssl on|off;
是否启用当前虚拟主机的ssl;手动测试时,可临时关闭;
33、ssl_certificate file;
当前虚拟主机使用的PEM格式的证书文件;
34、ssl_certificate_key file;
指明私钥文件;当前虚拟主机使用的证书文件中的公钥配对儿的私钥文件路径,PEM格式;
35、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
指明使用的ssl协议版本;最好使用TLSv1以上的版本;
36、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
指明ssl会话的缓存机制;
off:禁止使用会话;坚决禁止;
none:禁止使用会话;温和禁止;告诉客户端会话有可能被重用,但并不保证;
builtin:使用openssl(加密的库)内建的缓存机制,此为各worker独占;
shared:相对于builtin而言,ssl缓存是由各worker共享的缓存;缓存空间需要定义name,size等;
name:缓存空间的名称;
size:字节为单位的缓存空间的大小,每1MB内存空间可缓存4000个会话;10M空间就可缓存4万个会话;
37、
ssl_verify_client on | off | optional | optional_no_ca;
是否验证客户端证书;一般不会验证客户端证书;
ssl_ciphers ciphers;
加密算法,必须是Openssl所支持的加密算法才可以;
38、ssl_session_timeout;
ssl会话超时时长,指ssl会话缓存中缓存条目的有效时长(即非活动期限的有效时长);默认是5分钟;
39、ssl_prefer_server_ciphers on | off;
当使用SSLv3和TLS协议时,优先使用服务器端的加密算法;
例如:
ngx_http_log_module模块;用于实现以指定格式记录用户请求日志;
40、access_log path[format[buffer=size[flush=time]][if=condition]];
path:可指明日志文件路径;
format:日志格式;
buffer=size日志缓存大小;
flush=time:多长时间从内存刷写至磁盘上一次;
41、
access_log path format gzip[=leve][buffer=size][flush=time][if=condition];
指明日志文件压缩存放时的gzip压缩比
access_log syslog:server=address[,parameter=value] [format[if=condition]];
向指定的日志服务器发送日志;
access_log off;
关闭访问日志;
42、log_format name string...;
定义日志格式,指明名称和字符串;与httpd定义略有区别,在httpd中使用%u等宏定义,而对nginx则使用内建的变量来定义格式;
nginx的内置变量:在ngx_http_core_module模块文档中可查看到;
$bytes_sent:发送的字节数;the number of bytes sent to a client
$connection:连接的序列号;
$connection_requests:连接请求;
$msec:毫秒;
$pipe:p表示基于管道,.表示otherwise;
$request_length:请求报文的长度;
$request_time:请求时间;
$status:响应码;
$time_iso8601:时间格式;
$time_local:本地时间;
43、
open_log_file_cache max=N[inactive=time][min_uses=N][valid=time];
定义缓存空间,用来存储文件描述符;
open_log_file_cace off;
关闭此功能
max=N:最大缓存条数,默认10个;
inactive=time:非活动时长;缓存下来在指定时间没有用过,或者使用次数少于设定的次数,默认为10秒钟,就认为是非活动状态,可基于LRU算法换出;
min_uses=N:最少使用次数;缓存下来后在指定时间内默认10秒,最少使用多少次,默认1次;即如果默认在10秒,使用少于1次就标记为非活动状态;判断非活动除了使用时长还有使用次数;
valid:验证缓存条目有效性的频率;检查缓存文件的路径有效性,默认60秒;
ngx_http_rewrite_module模块;
用于实现将用户请求的URI基于正则式转换为其它URI机制;并且以重定向方式默认返回给客户端,让客户端对新的URI重新再次发起请求;
44、rewrit regex replacement[flag];
用于实现重写操作;
把用户请求的URI基于regex做检查,匹配到时,这个URI将替换为replacement指定的字符串;
在同一location中存在多个rewrite规则会自上而下逐个被检查(循环);可使用flag控制此循环功能;
如果replacement是以http://或https://开头,则替换结果会直接以重定向方式返回给客户端;
[flag]: 标志位,用来查找替换工作过程
last:重写完成后,停止对当前URI在当前location中的后续其它重写操作,改为对新URI的新一轮处理;类似于提前结束本轮循环,进入下一轮;理解为continue;重新匹配可能匹配到其它location中;
break:重写完成后,停止对当前URI在当前location中的后续其它重写操作;
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端对新URL进行请求;(重定向响应码302)
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端对新URL进行请求;(重定向响应码301)
例如:
location / {
root /web/var/www;
index index.html;
rewrite (.*)\.jpg$ $1.html redirect;
}
表示:访问为前缀.jpg的资源,就重定至/web/var/www/目录下的资源为前缀.html;
45、rewrite_log on | off;
是否启用重写日志;启用时,日志信息被发往错误日志;
46、if(condition){...}
条件判断机制,在条件满足时,执行配置块中的配置;引入了一个新的配置上下文;通常对nginx的变量做判断;
condition:条件比较表达式:等值比较和不等值比较: ==,!=
~:模式匹配,左侧字符串是否能被右侧模式匹配,区分字母大小写;
~*:模式匹配,左侧字符串是否能被右侧模式匹配,不区分字符大小写;
!~:模式不匹配,左侧字符串是否不能被右侧模式匹配,区分字符大小写;
!~*:模式不匹配,左侧字符串是否不能被右侧模式匹配,不区分字符大小写;
文件及目录存在性判断:
-f|!-f:存在且类型为文件,叹号表示取反;
-d|!d:判断为目录;
-e|!-e:判断存在;
-x|!-x:判断执行权限;
47、return:返回客户端,停止处理,直接用返回响应码给客户端;
return code [text]; 只返回响应状态码+一个文本
return code URL; 返回响应状态码+一个URL
return URL; 只返回一个URL
48、set $variable value;
用户自定义变量;在nginx中变量无论在定义还是引用都要使用$符号;
ngx_http_gzip_module模块;
过滤器,对指定类型的资源压缩传输以节约带宽;但消耗了cpu资源;
49、gzip on|off;
是否启用gzip压缩响应报文;不是所有浏览器都支持压缩机制;
50、gzip_comp_level level;
指定压缩比,1-9,默认为1;数越大压缩比越大;
51、gzip_disable regex ...;
regex是匹配客户端浏览器类型的模式,表示对所有匹配到的浏览器不执行压缩响应;因为有些浏览器类型不支持压缩;
52、gzip_min_length length;
触发启用压缩功能的响应报文的最小长度;
53、gzip_http_version 1.0|1.1;
设定启用压缩响应功能时,协议的最小版本;向下兼容原则;
54、gzip_types mime-type ...;
指定仅执行压缩的资源内容类型;默认为text/html;
55、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
对代理的请求基于哪种属性判断其是否应该启用压缩功能;
off:所有代理请求都压缩;
expired:如果响应报文首部包含expired字段并有值,其值即是有有效期的但过期了,因为禁用了缓存机制,则启用压缩;
其余几项后面介绍;
ngx_http_fastcgi_module模块
nginx基于Fastcgi方式与php-fpm通信;nginx编译时只支持fastcgi模块,因此php也只能使用php-fpm机制;
56、fastcgi_pass address;
指明后端php-fpm服务器的address;是fpm服务器监听的地址和端口;
57、fastcgi_index name;
定义fastcgi应用的主页名称;可以是多个;
58、fastcgi_param parameter value [if_not_empty];
指明向后端传递的参数,传递给fpm服务器的参数及其值;有可能调用的nginx变量的值;
例如:
nginx主机:172.18.11.111
在php主机:172.18.11.112
在php主机提供php测试页并设置php-fpm:
]# mkdir /php
]# vim /php/index.php
<?php
phpinfo();
?>
在nginx上配置:
浏览器测试:
59、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
定义缓存空间的名称;
path:文件系统路径,用于存放缓存的文件数据;在此目录下分多级目录;
max_size=size:定义此路径下多大空间用于存储缓存数据;
levels=#[:#[:#]]:缓存目录的层级定义;一般为1或2;
keys_zone=name:size:定义内存中用于缓存k/v映射关系的空间名称及大小;
inactive=time:定义非活动时间;
60、fastcgi_cache zone|off;
是否启用cache功能,如果启用,要提前定义缓存空间的名字,此处调用;默认为off不缓存;
61、fastcgi_cache_key string;
定义要使用的缓存键;
62、fastcgi_cache_methods GET | HEAD | POST ...;
缓存哪些类型的请求的相关数据;是请求方法;
63、fastcgi_cache_min_uses number;
缓存最少使用次数;在指定时长内,如果小于此值就为非活动;
64、fastcgi_cache_valid [code ...] time;
缓存数据时,对不同响应码设定其可缓存的时长;
注意:调用缓存时,至少应该制定3个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
例如:
nginx配置缓存:
注意:要在http配置段的上下文中定义缓存路径;
浏览器网页刷新后,可查看缓存文件已经生成:
ngx_http_proxy_module反代模块
用于反代用户请求到后端主机,同时又支持缓存功能;工作方式同fastcgi使用fastcgi_pass指令一样;
65、proxy_pass URL;
可实现动静分离;
能够实现将请求发给后端URL指定的主机地址,这里之所以使用URL可以完成URL映射;例如前端的url为bbs,后端url可以是forum;
应用在location, if in location, limit_except的上下文;
例如:
proxy_pass http://localhost:8000/uri/;
这个uri可以不带,如果后面没有url时,proxy_pass会将location的url传递给后端主机;proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass后端主机的uri;如果location定义其uri时使用了正则式表达模式匹配机制,则proxy_pass后的路径必须不能使用uri;否则有语法错误;
例如:location /uri/ {
proxy_pass http://HOST;
}
前端访问是:http://www.magedu.com/bbs --> 转给真正访问后端时:http://172.18.11.111/bbs
注意:HOST决不能带/;
如果是proxy_pass http://HOST/;
则:
前端访问是:http://www.magedu.com/bbs --> http://172.18.11.111/
例如:
location / {
# root /usr/share/nginx/html;
proxy_pass http://192.168.1.3;
index index.html index.htm;
}
location ~* \.php$ {
proxy_pass http://192.168.1.4;
}
例如:nginx当反代服务器
后端主机172.18.11.112:为php服务器
后端主机172.18.211.113:为web服务器
分别提供好相应的测验页。
nginx配置:
设置反代缓存时,方法类似nginx本地缓存;也必须在http上下文中定义,且也是先定义缓存名称,然后在location中调用,创建缓存目录等步骤;
在后端web主机172.18.11.113上,设置日志格式,调用在nginx中设置的头部信息:
在浏览器刷新测试后,可查看web主机日志:
记录了客户端主机和代理主机的ip地址;
访问php页面被传到后端php服务器响应:
访问html页面传到后端web服务器响应:
nginx使用这种为后端服务器做代理方式,可实现动静资源分离;
内置变量的调用,向客户端展示缓存命中与否;
add_header X-Cache $upstream_cache_status;
66、proxy_set_header field value;
设定向后端主机发送的请求报文的首部及其值;或是在原有首部后添加新值;用在http, server, location上下文; 能抓取终端用户IP地址,field可自定义;默认为$proxy_host代理主机的IP地址;可以设定任何首部的值;
例如:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwared_for;
67、proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size];
跟nginx缓存相关的选项(缓存要先定义,后调用),只能用于http上下文;
可选项:
[loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]
keys_zone=name:size 指明内存空间名称和大小;
path 磁盘上缓存的文件系统路径;
levels=levels 缓存目录层级,最多有3级,每级最多2个字符(目录);
use_temp_path=on|off 是否启用临时文件路径;
inactive=time 缓存中缓存项(k/v数据)的非活动时间;默认10分钟;
max_size=size 缓存文件系统路径的大小;一旦存满了基于LRU(最近最少使用)算法做清理;
68、proxy_cache zone | off;
调用缓存,默认为off;
69、proxy_cache_key string;
定义缓存键;
例如:
proxy_cache_key $request_uri
proxy_cache_key $scheme$proxy_host$request_uri
多个变量的值作为一个字符串使用,这样,即便访问的是同一url,如果使用的协议不同,对应的缓存项也不一样;因此,key就决定了两个缓存项是否为同一个;
70、proxy_cache_valid [code ...] time;
为不同的响应码设定其缓存的时长;
例如:
proxy_cache_valid 200 303 10m;
proxy_cache_valid 404 1m;
响应码没定义的表示不缓存;
71、proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
指明在什么情况下是否使用过期缓存;当代理服务器后后端主机通信发生错误时,在哪种错误情况下可以使用缓存中的内容,直接响应给客户端;
其实代理可使用的选项非常多:
proxy_cache_min_uses 最少使用次数;
proxy_cache_methods 为哪些请求方法缓存,默认只为get缓存;
proxy_cache_bypass 绕过缓存;
proxy_cache_purge 对缓存进行修剪
72、 proxy_cache_revalidate 重新校验;
跟nginx连接相关的指令
73、proxy_connect_timeout time;
与后端服务器建立连接的超时时长,默认为60秒,最长为75秒;
74、proxy_read_timeout time;
等待后端主机发送响应报文的超时时长,默认为60秒;此处定义的时长指的是连续两次响应报文等待之间的时长;很有可能需要调整;两个等待后端响应报文的时长;
75、proxy_send_timeout time;
向后端服务器发送请求报文的超时时长,默认为60秒,指的是连续两次请求报文(写操作)之间的时长,不是整个请求本身;两个请求报文发送后端的时长;
ngx_http_headers_module模块
用于在响应给客户端的报文中添加首部值;
76、add_header name value [always];
向响应给客户端的报文添加自定义首部,并赋值;
例如:
add_header X-Via $server_addr;
77、expires [modified] time;
expires epoch | max | off;
控制与缓存相关的首部;用于添加Expire及Cache-Control首部或修改首部的值;后面讲到缓存服务时具体讲缓存细节,这里不做过多介绍;当响应码为200, 201, 204, 206, 301, 302, 303, 304, or 307添加一个首部,或修改一个值;就是控制如何缓存,包括缓存时间;
Module ngx_http_upstream_module模块
将多个后端主机定义为服务器组,而后可由proxy_pass,fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass等进行引用;用于定义服务器组,用一组服务器可由代理服务器向外发布服务接收、请求;这组服务器可基于某种方式定义调度算法(如ip_hash,least_conn),来实现所谓的负载均衡调度;
此模块才是真正能把nginx当做反向代理负载均衡器的模块,定义成组不光能被proxy_pass使用,还可被fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass使用;
78、upstream name { ... }
定义后端服务器组;只需指定组名,引入新的上下文,上下文就叫upstream上下文;只能用于http上下文;
79、server address [parameters];
添加服务器,定义服务器的地址和相关参数;默认为80端口;
address地址格式:
IP[:port] 指定后端主机IP地址和端口
HOSTNAME[:port] 指定后端主机的某虚拟主机,要在前端代理的hosts文件中定义代理的虚拟主机名对应的ip地址是什么,避免dns挂了不能被访问;
unix://PATH/TO/SOME_SOCK_FILE 开头是unix的路径;
parameters参数:
weight=number 服务器主机的权重值;在最少连接和轮询调度时,默认的意义是加权轮询或加权最少连接;
max_fails=number 最大失败尝试次数(与后端服务器连接最大不成功尝试次数)
fail_timeout=time 设置服务器被识别为不可用的超时时长;
backup 备用主机,相当于定义为sorry server;所有后端主机都不可用时才生效;
down 手动标记为下线(不再处理任何用户请求),维护时使用;
例如后端如果是商城程序的应用程序服务器时,当要进行新版本程序发布,一般在晚上进行,设置要应用此设置;在摘除前确保本服务器没有会话保持,可用session服务器做会话保持,这样即便摘除,客户访问时再次刷新会重新调度到在线服务器上;
就在前端代理服务器对应的server上添加down,标记为下线,就可摘除后端服务器进行升级等操作,完成后再接入系统中,把down标记删除即可;观察一段时间后没有问题,就可以此方法,对其它服务器进行升级操作,这种机制就称灰度发布模型;数量多时可一批一批进行,有能力会写脚本自动完成;但是脚本完成比较麻烦,可使用python程序完成;
一般先标记为down,然后重载nginx,就不会有新的请求进来,但是老的请求还在,因为是平滑摘除的;一个请求对服务器最长不能超过5秒钟;5秒钟以后,就可把后端服务停掉了
80、ip_hash;
原地址哈希调度算法;只能用于upstream上下文;能够使来自于同一个客户端请求始终到同一个RS;哈希的是客户端ip,相当于lvs中的sh算法,哈希表中的key是客户端ip,位于同一个nat服务器后面的所有客户端(内网用户),会始终被调度到一个服务器响应,调度粒度过于粗糙;
81、least_conn;
如果weight有值且不相同,就相当于加权最少连接调度算法;只能用于upstream上下文;考虑后端服务器当前负载进行调度;计算方法跟lvs中很相似,活动数连接/权重;有可能结果不是很对称,这跟超时时间有关;
82、keepalive connections;
设置保持连接个数;可节约套接字和端口;激活后端服务器组缓存,主要设置保持连接时长(实际是连接个数);超出连接的个数时,最近最少使用的连接LRU被关闭;通常,在前端反代服务器与后端服务器间打开保持连接功能,可节约前端反代服务器的端口(套接字);
83、health_check [parameters];
定义后端主机的健康状态检测机制;只能用于location上下文;如果不定义此处,默认在定义server时也会有最大失败尝试次数,失败的超时时长等,已经有一定意义的健康状态检测机制;要使用match判断匹配健康机制;
parameters可用参数:
interval=time 检测的频度,默认为5秒;
fails=number 判定为失败的检测次数;判断服务器不可用的检测次数;默认1次,尽量使用3次;
passes=number 判定为成功的检测次数;判断服务器为可用的检测次数;默认1次;
uri=uri 执行健康状态检测时试图请求的uri;不指明默认为主页/;表明在请求这个url时,其响应结果必须是在match中匹配的
match=name 基于哪个match做检测结果为成功或失败的判定;用谁进行评估检测结果;指明调用哪个macth(做健康检测判断)判断成功或失败;
port=number 指明向服务器的哪个端口发起健康状态检测请求;
服务器可监听在2个端口,例如用8080端口用来接收健康状态检测,80端口向外提供服务;这样可以把8080端口做一个虚拟主机,而后对这个内容不记录在访问日志中;所以作为健康状态检测,有可能对于后端主机要关闭日志功能;
84、match name{...}
只用于http上下文,对后端主机做健康状态检测时,定义其结果判断标准;
专用指令:
status:期望的响应码:
status CODE
status ! CODE
status CODE-CODE
header:基于响应首部进行判断
header HEADER=VALUE
header HEADER!=VALUE
header [!]HEADER
header HEADER ~ VALUE
body:期望的响应报文的主体部分应该有的内容;
body ~ "CONTENT"
body !~ "CONTENT"
85、sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path];
启用session绑定,基于cookie(会话)的绑定机制;只用于upstream上下文;比ip_hash更为精细的精细会话保持绑定;
参数选项:
cookie name 定义server id
expires=time 定义cookie有效时长,即会话绑定时长;
domain=domain 定义cookie应用在哪个域上;
httponly 定义cookie仅用在http协议上;
secure 给cookie添加安全首部
path=path 指定某个域中的某个路径下哪些内容做cookie绑定
86、hash key [consistent];
定义调度方法,可自定义基于何种信息(key)进行绑定;如nginx可基于cookie、用户请求的host首部、用户请求的uri绑定;
例如:
hash $remote_addr 基于请求的客户端地址进行绑定;相当于ip_hash;
hash $request_uri 客户端请求的url
hash $cookie_username 来自同一用户账号进行绑定
内建变量可查看官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky_cookie_insert
其中内置变量:
$upstream_addr upstream服务器自己的地址
$upstream_cache_status 缓存命中与否,引用后可知道是从缓存中响应的,还是从后端服务器响应的;
注意:只要能进行哈希的值都可作为绑定对象;
补充:内置变量的调用,向客户端展示缓存命中与否;
add_header X-Cache $upstream_cache_status;
注意:nginx也可实现更高级的基于方法的分离,get,put叫读写分离等;
例如:
nginx作为nginx作为前端调度器,反代负载均衡后端服务器:
web服务器主机组:
RS1:172.18.11.11
RS2:172.18.11.12
php服务器主组:
RS1:172.18.11.111
RS2:172.18.11.113
在server上下文配置:
在http上下文配置: