nginx 基础总结

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

时间: 2024-10-12 19:06:16

nginx 基础总结的相关文章

Nginx基础笔记

Nginx基础笔记 资源 安装 ubuntu下 编译安装 基本操作 HTTP基本配置 配置说明 配置文件目录结构 配置文件结构 模块 模块化 index模块 Log模块 Real IP模块 Access模块 Rewrite模块 Proxy模块 upstream模块 其他 配置静态化目录 负载均衡 控制页面缓存 nginx的内置变量 nginx小结 资源 资源 Nginx 官网 Nginx 官方下载地址 Nginx最佳实践配置项目 地址 Nginx Configuration wiki 教程 ag

【Nginx】Nginx基础架构

一.Nginx的架构设计 1)优秀的模块化设计 2)事件驱动架构 事件驱动架构是指由一些事件发生源来产生事件,由一个或多个事件收集器来收集.分发事件,然后许多事件处理器会注册自己感兴趣的事件,同时会消费这些事件. 对于Nginx而言,一般会由网卡.磁盘产生事件,事件模块将负责事件的收集.分发操作,而所有的模块都可能是事件消费者. Nginx采用完全的事件驱动架构来处理业务.对于传统web服务器而言,事件驱动往往局限在TCP链接建立.关闭事件上,一个连接建立以后,在其关闭之前的所有操作逗不再是事件

nginx基础及其相关配置

nginx基础 Nginx的基本架构 一个master主进程,生成一个或多个worker子进程 事件驱动 epoll(边缘触发),用于Linux kqueue:用于BSD /dev/poll: IO复用器:select.poll.rt signal 支持sendfile及sendfile64 支持AIO 支持mmap 名词解释: sendfile机制:正常响应报文路径"内核空间-->用户空间-->内核空间-->客户端",如果报文在用户空间不做任何改变时,路径不再经由用

手把手教你nginx基础安装配置

手把手教你nginx基础安装配置! 一.Nginx安装及简单配置: 安装环境和依赖的包: #yum groupinstall "developmenttools" "server platform development" # yum -yinstall pcre-devel #yum install openssl-devel 下载相关nginx源码包: #wgethttp://nginx.org/download/nginx-1.6.2.tar.gz 解压缩源码

Nginx基础教程PPT

Nginx基础教程PPT By 马冬亮(凝霜  Loki) 一个人的战争(http://blog.csdn.net/MDL13412) pdf版本下载 Nginx基础教程PPT

NGINX基础(一)

NGINX基础 ============================================================================ 概述: Nginx介绍 ★engineX = Nginx NGINX is a free, open-source,high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxyserver. (NGINX是一个免费.开源.高性能的HTT

nginx基础知识

参考博客: http://www.2cto.com/os/201212/176520.html http://os.51cto.com/art/201111/304611.htm http://www.cnblogs.com/xiaogangqq123/archive/2011/03/02/1969006.html Nginx.conf学习 #定义Nginx运行的用户和用户组 user www www: #nginx进程数,建议设置为等于CPU总核心数 worker_processes 8; #

Nginx基础整理

目录结构如下: Nginx基础知识 Nginx HTTP服务器的特色及优点 Nginx的主要企业功能 Nginx作为web服务器的主要应用场景包括: Nginx的安装 安装环境 快速安装命令集合 各个命令解释 脚本 注意 安装故障总结 故障一:没有安装pcre或pcre-devel 故障二:没有安装openssl和openssl-devel 常用的Nginx http功能模块 Nginx的目录结构 Nginx最重要的配置文件nginx.conf详解 生产中常见的网站状态码 Nginx基础知识:

[Nginx] – 基础安全优化 【一】

Nginx基础安全1,Nginx版本号信息隐藏所有软件都在更新迭代,但是线上环境最主要的还是稳定,所以我们不会盲目最新,更愿意选择一个持续维护的稳定版,但没个版本都会有漏洞,如果不更新软件,又让黑客知道了我们使用的版本,就等于把我们的漏洞,都告诉给他们了,这样非常危险.故此,要修改Nginx的版本信息,或隐藏,给敌人一种假象: [[email protected] ~]# vim /application/nginx/conf/nginx.conf http{ server_tokens off

nginx基础http协议

Nginx基础Http Http协议介绍 http全称HyperText Transfer Protocol中文名为超文本传输协议 1.什么是超文本? 包含有超链接(Link)和各种多媒体元素标记的文本.这些超文本文件彼此链接,形成网状(Web),因此又被称为网页(Web Page).这些链接使用URL表示.最常见的超文本格式是超文本标记语言HTML. 2.什么是URL 3.什么是超文本传输协议HTTP? 是一种按照URL指示,将超文本文档从一台主机(Web服务器)传输到另一台主机(浏览器)的应