nginx

Nginx:

engine X

c10k


主要功能:

1.web服务器:http/https协议的应用;

2.反向代理服务器:

http reverse server

smtp/pop3/imap4 reverse server

3.负载均衡集群


nginx -- apache -- php -- MariaDB


MIME:

major/minor:

text/html, p_w_picpath/jpeg ,..., application/apx


http事务:request <--> response


web resources

一个html文档

一个图片

一个MP3片段

一个视频片段

一个样式表

一个js脚本

一个动态资源

...


URI: 

URL:

scheme://host[:port]/path/to/resource


Method:

GET,HEAD

POST

PUT,DELETE(WebDAV)

OPTIONS

TRACE


resource cache


cookie, cookie2, session


request packet:

<method> <request-url> <http-version>

<HEADERS>


<body>


response packet:

<http-version> <status-code> <reason-phrase>

<HEADERS>


<body>


status code:

1xx

2xx:成功类响应状态码,200,OK

3xx:重定向类响应状态码,301,302,304

4xx:客户端错误类响应状态码,403,404

5xx:服务器端错误类响应状态码,502,500


basic,digest认证


MPM:

prefork

worker

event


I/O模型:

阻塞/非阻塞:

关注资源调用者在等待结果返回之前所处的状态;


阻塞:Blocking,调用结果返回之前,调用者会被挂起;闲等待;

非阻塞:Nonblocking,调用结果返回之前,调用者不会被挂起,可以继续调用其他资源;忙等待;


同步/异步:

关注资源返回之后的消息通知的机制;


同步:synchronize,调用者一直等待调用结果;

异步:asynchronize,被调用者通过状态描述,通知或回调等方式通知调用者此次调用结果;


I/O模型:阻塞型,非阻塞型,复用型,信号驱动型,异步;


一次IO请求,通常会分成两个阶段:

第一阶段:数据从磁盘被加载到内核空间;

第二阶段:数据从内核空间被复制到应用程序所在的用户空间;


基于事件(信号)回调机制:

SELECT():1024;

POLL():


事件驱动模型的实现:

Linux:epoll,libevent程序包;

FreeBSD:kqueue

Solaris:/dev/poll


Nginx

http://nginx.org


基于nginx的二次开发:tengine,openresty


nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. According to Netcraft, nginx served or proxied 29.38% busiest sites in September 2017. Here are some of the success stories: Dropbox, Netflix, Wordpress.com, FastMail.FM. 


基本http服务特性:

1.支持基于缓存的反向代理;负载均衡和故障倒换;

2.基于FastCGI, uwsgi, SCGI反代,可以将缓存存放于memcached servers;支持负载均衡和故障倒换;

3.模块化结构和强大的过滤器机制;

4.SSL和TLS

5.http/2.0


其他的http服务特性:

1.支持虚拟主机(名称,端口,IP地址(无实际作用));

2.支持长连接;

3.支持URL重写;

4.支持流媒体

5.对客户端响应限速;


详情请见:http://nginx.org/en/


回顾:

IO模型:

阻塞型,非阻塞型,IO复用型,信号驱动型,异步型;


nginx特性:


Nginx(2)

Nginx的程序结构:

master/worker

一个master进程:负责加载配置文件,管理worker进程;

配置的平滑升级

一个或多个worker进程:

处理并响应客户端请求;

cache:

cache loader

cache manager


nginx的功能:

1.静态的web资源服务器;

2.结合FastCGI,uwsgi,SCGI等协议反代动态资源请求;(lnmp, lamt)

3.http/https协议的反向代理;

4.smtp/pop3/imap4协议的反向代理;

5.通用的tcp/udp反向代理;


注意:nginx所有的功能的实现都必须通过模块进行;而nginx可以根据指令或这相关功能,自动加载模块;


nginx的模块类型:

核心模块:core module

标准功能模块:

Standard HTTP modiles

Optional HTTP modules

Mail modules

Stream mudules


third party modules


nginx的安装和配置:

安装:

rpm包:

官方的预制安装包:http://nginx.org/packages/centos/

EPEL源的安装包;


编译:

1.注意需要安装好编译环境;

2.openssl-devel,pcre-devel,libenvent-devel,...

3.~]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-threads --with-file-aio --with-http_stub_status_module

4.make -j 4 && make install


注意:启动服务需要事先创建nginx用户和nginx组;


配置:

配置的组成部分:

主配置文件:/etc/nginx/nginx.conf

片段配置文件:/etc/nginx/conf/*.conf(编译安装的默认没有,可以在主配置文件中指定)


模块配置文件:

与fcgi,uwsgi,SCGI相关的配置文件


mime.types:所有的nginx支持的mime类型;


主配置文件的配置指令:

context:上下文,指令的容器或者是指令的生效范围;

derective:指令,能够发挥nginx功能或特性的配置信息;


注意:

1.所有的指令都必须以";"结尾;

2.所有的上下文都必须使用"{}"括选起来,而且不需要使用";"结尾;

3.在设置指令时可以使用配置变量;

由模块包含并引入:内置变量

由用户引入:自定义变量

定义变量:

set var_name value;

引用变量:

$var_name


获得帮助,参考http://nginx.org/en/docs


主配置文件的结构:

全局配置段,主配置段:

main block


http相关配置

http{

context{ ... }

directive value;

...

}


mail相关配置

mail{

...

}


全局配置段的常用指令和上下文:

user  nginx;

worker_processes 3;

pid /var/run/nginx.pid;

events {

worker_connections 1024;

}


http相关配置的常用指令和上下文:

include /etc/nginx/conf/*.conf;

sendfile on;

keepalive_timeout  65;

keepalive_request 100;

server {

listen 80;

server_name www.qhdlink.com;

include /etc/nginx/conf/*.conf;

root /myweb/vhost1

location {

root html; //相对路径是相对于nginx的安装目录而言的;

alias /bbs/ /forum/

}

}


server {

listen 8080:

server_name web.qhdlink.com;

root /myweb/vhost2;

}


全局配置段常用指令的详解:

正常服务运行必备的配置指令;

1.user user [group];

Context: main


功能:用于指定运行worker子进程的用户和组;


2.pid file;

Context: main


功能:用于指定存放nginx的master进程编号的文件的路径;


3.worker_rlimit_nofile number;

Context:  main


功能:每个worker进程所能打开的文件数量的最大值;

也可以通过修改/etc/security/limits.conf完成此设置;


优化性能相关的配置指令;

4.worker_processes number | auto;

Context: main


功能:worker进程的启动数量;通常不要设置的比cpu核心数多;


5.worker_cpu_affinity cpumask ...;

worker_cpu_affinity auto [cpumask];

Context:  main


功能:设置每个CPU核心和worker进程的亲缘性;


cpumask:0001 0010 0100 1000;


6.worker_priority number;

Context: main


number:[-20,19]


功能:设置每个worker进程启动时候的nice值;


用于调试和定位问题相关的配置指令;

7.daemon on | off;

Context:  main


是否以独立守护进程的方式启动nginx;通常是在开发时选择使用;


8.master_process on | off;

Context:  main


是否以master/worker模型启动nginx进程;


9.error_log file [level];

Context: main, http, mail, stream, server, location


功能:定义错误日志文件的位置和记录日志的日志级别;


10.thread_pool name threads=number [max_queue=number];

Context: main


功能:定义线程池的名称,线程的数量以及每个线程的后援队列长度;

默认有32个线程,队列长度为65536;


回顾:

IO模型:阻塞式,非阻塞式,IO复用,信号驱动式的IO,异步(AIO)


nginx:

master/worker

cache loader/cache manager


模块化架构:

核心模块

标准功能模块

第三方模块


配置文件:

主配置文件:/etc/nginx/nginx.conf

片段配置文件:include file;


主配置文件的结构:

全局配置段,主配置段(main)

events { 

... 

}


Context: main


在events上下文中可以使用的指令:

11.worker_connections number;


功能:每个worker进程所能够打开的并发连接的最大连接数;默认是512;


当前系统中所能够响应的最大并发连接数:

worker_connections * worker_processes


12.use method;

指明并发连接请求处理时使用的方法;epoll


use epoll;


注意:此指令不需要明确指定,因为nginx会选择最有效的方法;


13.accept_mutex on | off;

当此功能启用时,表示可以让多个worker进程依次轮流响应新请求,


http相关配置

http {

...

}


在http上下文中可以用到的指令:

1.定义虚拟主机及套接字相关功能指令:

server {

...

}


server上下文中专用的指令:

1) server_name name ...;


指定虚拟主机名称;后面可以使用空白字符分隔多个主机名;

主机名可以支持使用"*"匹配任意长度的任意字符;

主机名还可以支持使用~起始的正则表达式模式字符串;


2) listen address[:port] [default_server] [ssl] [http2 | spdy]  [backlog=number] [rcvbuf=size] [sndbuf=size]

listen port [default_server] [ssl] [http2 | spdy]

listen unix:path [default_server] [ssl] [http2 | spdy]


default_server:默认虚拟主机的设定;

ssl:支持https;

http2:支持http/2.0;

spdy:支持Google的spdy功能;

backlog=number:设定后援队列的长度;

rcvbuf=size:接收缓冲大小;

sndbuf=size:发送缓冲大小;


示例:

listen 127.0.0.1:8000;

listen 127.0.0.1;

listen 8000;

listen *:8000;

listen localhost:8000;


3) root path;

Context: http, server, location, if in location


功能:设置web资源的路径映射;用于指定用户请求的URL所对应的本地文件系统中的资源所在的目录的路径;


path:可以是绝对路径;也可以是相对路径;

相对路径是相对nginx的安装目录而言的;


4) location [ = | ~ | ~* | ^~ ] uri { ... }

location @name { ... }

Context: server, location


功能:根据用户请求的URI来匹配此处定义的location;当匹配到时,此请求将被响应的location上下文中的指令处理;


=:表示用户请求的URI与此处location定义的URI必须精确匹配;

~:表示用户请求的URI与此处location定义的URI通过指定的正则表达式进行匹配,字母大小写敏感;

~*:表示用户请求的URI与此处location定义的URI通过指定的正则表达式进行匹配,字母大小写不敏感;

^~:对用户请求的URI的左半部分做匹配检查,字母大小写不敏感;


URI:URL中除去主机名的部分:

URL:http://www.qhdlink.com/index.html

URI:/index.html


匹配优先级:= , ^~ , ~/~* , 不带符号;


5) alias path;

Context:  location


功能:定义路径映射的别名,文档资源映射的机制;


root和alias的区别:

用户请求的URL:http://172.16.72.2/p_w_picpaths/1.jpg


location /p_w_picpaths {

root /myweb;

}


被请求资源的服务器文件系统中的存放路径:/myweb/p_w_picpaths/1.jpg;


location /p_w_picpaths {

alias /myweb;

}


被请求资源的服务器文件系统中的存放路径:/myweb/1.jpg;


总结:

root指令:将用户请求的URI追加至root指令所指定的路径之后,作为此次请求的资源所在的文件系统路径;

alias指令:将用户请求的URI用root指令所指定的路径替换,作为此次请求的资源所在的文件系统路径;


注意:在nginx/1.12.1中,URI和root的参数都不能在最后加"/";


6) index file ...;

Context: http, server, location


功能:定义默认主页的文件名;


file:是一个文件名或者由空白字符隔开的多个文件名;


2.error_page code ... [=[response]] uri;

Context: http, server, location, if in location


功能:根据用户请求的资源的http协议的响应状态码实现错误页面的重定向;


示例:

error_page 404 =200 /404.html;

        location = /404.html {

            root  /myweb/error-page;

        }


        3.与长连接相关的指令:

        keepalive_disable none | browser ...;

        Context: http, server, location


        功能:对于某些浏览器禁用长连接功能;


        keepalive_requests number;

        Context: http, server, location


        功能:通过设置最大请求数量的方式管理长连接;即,只要在长连接上接收到的用户请求达到最大限制值,则关闭此长连接;


        keepalive_timeout timeout [header_timeout];

        Context: http, server, location


        功能:通过设置最大空闲时间的方式管理长连接;即,只要该长连接在指定时间内没有收到任何请求,则关闭此长连接;


        4.send_timeout time;

        Context: http, server, location


        功能:向客户端发送响应报文的超时时长;通常指两次成功的写操作之间的间隔时长;如果在此时间内,客户端没有收到响应报文,则关闭连接;


        5.client_body_buffer_size size;

        Context: http, server, location


        功能:用于设置客户端请求报文中的body部分的缓冲区的大小;默认为16K,如果要缓存的body超过了此限制,则会将其临时保存于磁盘的文件中;


        client_body_temp_path path [level1 [level2 [level3]]];

        Context: http, server, location


        功能:用于设定存储客户端请求报文中的body部分的临时存储路径,以及此临时目录中子目录的结构;


        示例:client_body_temp_path /var/tmp/client_body 2 1 2

        按照示例的设置,可以在/var/tmp/client_body目录创建以2位16进制数字命名的256个一级子目录;在所有的256个一级子目录中,还可以随机创建出以一个十六进制数字命名的二级子目录;在所有的二级子目录中,还以随机创建出以2位16进制数字命名的三级子目录;每一个三级子目录中都会存放一个用户请求的body的内容;


        6.limit_rate rate;

        Context: http, server, location, if in location


        功能:限制响应给客户端的传输速率,单位是Bytes/second,0表示无限制;


        location /download {

            root /;

            limit_rate 20480;

        }


        7.limit_except method ... { ... }

        Context: location


        功能:设置可以使用指定的请求方法之外的其他方法的客户端;


        在此上下文中,需要使用allow及deny指令;


        8.allow address | CIDR | unix: | all;

        deny address | CIDR | unix: | all;

        Context: http, server, location, limit_except


        功能:对指定的客户端进行访问控制;


        注意:

        1) 只有放置与limit_except上下文中,才表示是否允许指定客户端使用什么样的HTTP方法;

        2) 如果放置于其他的上下文中,则表示对该上下文所包含的web资源的访问控制;

        3) 规则的匹配顺序:按照书写顺序依次检查,直到第一个匹配项;


        192.168.0.0/16

        172.16.0.0/12

        CIDR: Classless Inter-Domain Routing, 无类域间路由;超网


        9.AIO和DirectIO

        aio on | off | threads[=pool];

        Context: http, server, location


        功能:是否启用aio功能;


        directio size | off;

        Context: http, server, location


        功能:是否启用directio,如果启用,使用多大的空间来定义directio;


        10.文件描述符缓存:

        open_file_cache off;

open_file_cache max=N [inactive=time];


在系统中打开的文件较多的时候,nginx可以缓存以下三种信息来提升系统的性能:

1) 文件描述符、文件大小和最近一次修改的时间;

2) 打开的目录的结构;

3) 没有找到的或者没有权限访问的文件相关信息;


max=N:可缓存的缓存项的数量的上限;当缓存的数量达到上限之后,通常会使用LRU(Least Recently Used)算法实现缓存清理;

inactive=time:缓存项的超时时长,在此处指定的时长内没有被再次使用(命中)的缓存元素,即为非活动项;


open_file_cache_errors on | off;


功能:在查找资源时出错,此类错误信息是否缓存;


open_file_cache_min_uses number;


功能:在open_file_cache指令中的inactive参数所指定的时间范围内,缓存的元素至少要被再次使用(命中)的次数;


open_file_cache_valid time;


功能:缓存有效性检查的频率;默认值是60s;


11.stub_status;

Context: server, location


功能:用于输出nginx的基本状态信息;


location /ngx-status {

            stub_status;

        }


        通过浏览器浏览http://host/ngx-status


        Active connections: 1 

server accepts handled requests

5191 5191 5045 

Reading: 0 Writing: 1 Waiting: 0 


Active connections: 处于活动状态的客户端连接数量,包括waiting状态的连接;

accepts:当前服务器已经接受的客户端请求的总量;

handled:当前服务器已经处理完成的客户端请求的总量;

requests:客户端发送到当前服务器的请求的总量;包括被服务期重定向的

Reading:处于正在被读取报文首部的客户端请求的总量;

Writing:处于正在向客户端发送响应报文过程的连接的总量;

Waiting:处于等待客户端发送请求的空闲连接数;


12.valid_referers none | blocked | server_names | string ...;

Context: server, location


功能:定义合法的Referer数据;


none:在请求报文的首部中没有Referer字段;

blocked:在请求报文的首部中有Referer字段,但没有值;

server_name:在请求报文的首部中的Referer字段的值是主机名;

arbitrary string:任意字符串(直接字符串),其中可以使用"*"做通配符;

regular expression:被指定的正则表达式模式匹配到的字符串,一般要是有"~"起始;


示例:

location / {

valid_referers none blocked server_name *.qhdlink.com ~\.qhlink\.


if ($invalid_referer) {

return 403;

}

}











Nginx(4)

13.ngx_http_ssl_module

1) ssl on | off;

Context: http, server


功能:是否启用给定虚拟主机的https协议;

相当于:listen 443 ssl;


2) ssl_certificate file;

Context: http, server


功能:当前虚拟主机使用的PEM格式的证书文件的路径;


3) ssl_certificate_key file;

Context: http, server


功能:当前虚拟主机上与其证书匹配的私钥文件的路径;


4) ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

Context: http, server


功能:是否开启ssl的会话缓存,如果开启,选择哪种类型及使用多少存储空间;

为了避免内存碎片,建议使用shared类型;


5) ssl_session_timeout time;

Context: http, server


功能:客户端连接可以复用ssl会话缓存中缓存的ssl参数的有效时长;默认5分钟;


6) ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

Context: http, server


功能:nginx服务器能够兼容的协议的版本;默认是[TLSv1] [TLSv1.1] [TLSv1.2];


14.ngx_http_log_module

The ngx_http_log_module module writes request logs in the specified format. 


1) access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

  access_log off;

  Context: http, server, location, if in location, limit_except


  功能:是否记录访问日志;如果记录,以何种格式记录;缓冲区大小的设定,是否压缩存储并指明压缩等级;刷新日志文件的时间;


2) log_format name [escape=default|json] string ...;

Context: http


功能:定义存储访问日志的格式;


combined格式示例:

log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';


3) open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

Context: http, server, location


功能:是否启用访问日志文件的文件描述符缓存机制;


max=N:缓存中缓存的文件描述符的最大数量;

inactive:非活动时长;默认10秒;

min_uses:在inactive的时间内,缓存中的缓存条目最少被命中的次数;默认值1;

valid:验证缓存中的缓存条目是否有效的时间周期;默认60秒;


15.ngx_http_rewrite_module

The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations. 


URL重新就是指:根据PCRE的正则表达式来修改请求的URI,返回重定向信息,并且根据指定的条件选择配置内容;


www.qhdlink.com  -->  www.ql.com


1) rewrite regex replacement [flag];

Context: server, location, if


功能:将用户请求的URI基于regex所描述的模式进行匹配检测,匹配到时将其替换为replacement指定的URI;


注意:

1.在同一上下文中存在多个rewrite规则时,会自上而下逐个检测并匹配;对于客户端发送的每个请求,都要做检查匹配,其中隐藏了一个循环机制;可以利用flag来控制循环的方式;

2.如果replacement是以http://或者https://开头的,替换的结果会直接以重定向的方式返回给客户端;状态码为301;否则,状态码为302;


例子:

http://www.qdhlink.com --> http://www.ql.com


3xx:重定向类的状态码

301:永久重定向

302:临时重定向


[flag]:

last:重写完成后停止对当前的URI在当前的location中后续的其他重写操作后启动新一轮的匹配检查;重启循环;

break:重写完成后,立刻停止对当前location中的rewrite规则的匹配检查,转而执行后续的其他配置;结束循环;

redirect:临时重定向,重写完成后以临时重定向方式向客户端返回重写后的URI,由客户端重新请求;不以http://或https:开头的URI的重写;

permanent:永久重定向,重写完成后以永久重定向方式向客户端返回重写后的URI,由客户端重新请求;以http://或https:开头的URI的重写;


示例:

location / {

          root   html;

          index  index.html index.htm;

          rewrite ^/epel http://172.16.72.101;

          rewrite ^/(.*\.(jpg|jpeg|gif|png))$ http://172.16.72.1/p_w_picpaths/$1;

          rewrite ^/(.*)\.htm$ /$1.html;

        }


        2) return code [text];

return code URL;

return URL;

Context: server, location, if


功能:停止处理所有的后续的请求,直接给客户端返回一个指定的状态码或URL;


3) if (condition) { ... }

Context: server, location


功能:引入一个新的上下文并且在其中完成条件判断;如果条件满足,执行if上下文中的配置指令;


condition:

比较操作符:

==

!=

~:模式匹配,区分字符大小写;

~*:模式匹配,不区分字符大小写;

!~:

!~*


文件及目录的存在性判断:

-e, !-e:存在与否

-f, !-f:存在且是普通文件与否;

-d, !-d:

...

-x, !-x:



16.ngx_http_fastcgi_module


1) fastcgi_pass address;

nginx通过反代机制,将php请求反代至address标明的服务器上;


2) fastcgi_index name;

fastcgi默认反代的主页资源;


3) fastcgi_param parameter value [if_not_empty];

向后端php服务器传递参数;


fastcgi的缓存相关内容:

1) fastcgi_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size]

Context:  http


level:缓存的目录结构及文件数量,最多3级,每级最对2个16进制数字,用":"分隔

1:2:2

keys_zone:内存中缓存空间的名称及大小;

max_size:磁盘上用于缓存数据的缓存空间大小;

inactive:缓存的最大时长;


2) fastcgi_cache zone | off;

调用指定的缓存空间缓存数据;


3) fastcgi_cache_key string;

定义用户缓存项的key的字符串;


4) fastcgi_cache_min_uses number;

用户请求的内容被请求多少次才会加入缓存;


5) fastcgi_cache_valid [code ...] time;

对于不同的响应码的响应数据设置缓存时间;


注意:

设置缓存的时候使用fastcgi_cache_path指令;

调用缓存时,至少应该使用下列几个指令:

fastcgi_cache

fastcgi_cache_key

fastcgi_cache_valid

 

示例:

http上下文的配置:

fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgicache:10m max_size=1g;


location上下文的配置:

       location ~ \.php$ {

           root           html;

           fastcgi_pass   127.0.0.1:9000;

           fastcgi_index  index.php;

           fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html/$fastcgi_script_name;

           include        fastcgi_params;

           fastcgi_cache fcgicache;

           fastcgi_cache_key $request_uri;

           fastcgi_cache_valid 200 5m;

           fastcgi_cache_valid 301 302 1m;

           fastcgi_cache_valid 403 404 1m;

       }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章