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                  

 

Error_Page


在浏览器输入: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

download


在本机测试:

]# 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的密码

nginx 基础总结_第1张图片

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;

    }

nginx 基础总结_第2张图片


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协议时,优先使用服务器端的加密算法;


例如:

nginx 基础总结_第3张图片

nginx 基础总结_第4张图片

nginx 基础总结_第5张图片



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

phpinfo();

?>

nginx 基础总结_第6张图片

在nginx上配置:

nginx 基础总结_第7张图片

浏览器测试:

nginx 基础总结_第8张图片


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配置缓存:

nginx 基础总结_第9张图片注意:要在http配置段的上下文中定义缓存路径;

wKioL1dFjWfjPO2MAAA14bII6Eo227.png


浏览器网页刷新后,可查看缓存文件已经生成:

nginx 基础总结_第10张图片

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 基础总结_第11张图片

设置反代缓存时,方法类似nginx本地缓存;也必须在http上下文中定义,且也是先定义缓存名称,然后在location中调用,创建缓存目录等步骤;

wKioL1dFkD2iHh03AAAeNDWjZ6c384.png


在后端web主机172.18.11.113上,设置日志格式,调用在nginx中设置的头部信息:

wKiom1dFj2nCJytjAABBot-kEis525.pngwKiom1dFj4nD0CgUAABBot-kEis804.png



在浏览器刷新测试后,可查看web主机日志:

记录了客户端主机和代理主机的ip地址;

nginx 基础总结_第12张图片


访问php页面被传到后端php服务器响应:

nginx 基础总结_第13张图片


访问html页面传到后端web服务器响应:

nginx 基础总结_第14张图片



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上下文配置:

nginx 基础总结_第15张图片

在http上下文配置:

nginx 基础总结_第16张图片