Nginx
提供web服务,也是工作在应用层的负载均衡器,拥有强大的缓存能力。
本章主要学习,web server、web reverse proxy(http)和cache
缓存服务器使用较多的是varnish+squid:
任何缓存都是反向代理,但是varnish反向代理能力还是与nginx有很大差距。所以,varnish还是做缓存服务,而nginx做web代理
与nginx同一级别的反向代理服务器还有haproxy:基于tcp reverse proxy能够反向代理mysql服务。也支持http的反向代理。是nginx的竞争对手。
nginx服务于静态内容的能力上比httpd强大很多。
engine X = Nginx
http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy
NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server . C10K(10K Connections). 二次发型版 阿里Tengine, OpenResty. 解决10000个并发服务、大并发
http协议:
URL:shceme://username:password@host:port/path;params?query#frag
http事务:
request: <method> <URL> <VERSION> HEADERS <body> reponse: <VERSION> <STATUS> <REASON-PHRASE> HEADERS <body> Method:GET/HEAD/POST, PUT/DELETE, TRACES, OPTIONS Status Code: 1xx: 2xx:成功类响应码,200 3xx:重定向类的响应码,301, 302, 304 4xx:客户端错误,403,404 5xx:服务器端错误,502 认证: 基于ip认证 基于用户认证 httpd MPM: prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责响应一个请求; worker:线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求; event:主进程master负责生成子进程,每个子进程响应多个请求;
I/O模型:
用户空间进程发起系统调用,要读取硬盘上的数据。内核代为执行,内核要将数据读取并转交给用户空间进程,也必须先从硬盘上读取,将数据载 入内核的内存空间,之后再将内核内存中的数据复制到用户空间进程的空间中。 用户空间进程–发起系统调用–内核从硬盘上读取数据–读取到内核的空间–将内核空间的数据复制给用户进程的内存空间中。
进程运行中,感知不到其他进程的存在,只是知道内核,和自己 用户空间进程,运行在线性内存中。
每一次IO分为两步,先将数据读取到内核内存,再将数据复制给客户空间进程 单只从内核内存复制到,进程空空间的这个阶段才是IO发生的过程。
nginx 支持事件驱动异步IO,内存映射
阻塞型、非阻塞型、复用型、信号驱动型、异步
同步/异步: 关注消息通知机制; 消息通知: 同步:等待对方返回消息; 异步:被调用者通过状态、通知或回调机制通知调用者-被调用者的运行状态;(也就上是不用等待,有消息了会告诉你) 回调,将进程调度回来 通知,仅仅是通知。告诉你饭好了。 有一个公共显示屏显示,调用的结果。 只是在显示屏上显示一次(边缘触发) 如果发了一次,调用者还是没有回来,就再发一次(水平触发) 使用电子公告牌的好处是,进程要了多个系统调用,但是进程是阻塞在哪个上好呢,显然阻塞在哪个上也不合适 所以阻塞在电子公告牌上比较合适,阻塞一个上就可以兼顾多个调用了。 阻塞/非阻塞: 关注调用者在等待结果返回之前所处的状态; 阻塞:blocking,调用结果返回之前,调用者被挂起;(处于不可中断睡眠状态) 非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起; 当内核去读取硬盘上的数据时,进程是不被阻塞的,处于忙等待状态。当内核往进程内存中写入数据时才被阻塞(但是相对第一阶段的时间会短的多,因为内核要用进程的空间进程被阻塞) 一次IO请求,都会由两阶段组成: 第一步:等待数据,即数据从磁盘到内核内存; 第二步:复制数据,即数据内核内存到进程内存;
复用型IO调用:
不被一个系统调用而阻塞在IO上,使用电子公告牌的功能。而是阻塞在电子公告牌上。 nginx使用的是异步非阻塞IO(非阻塞+复用IO调用) nginx事件驱动非阻塞
解决方案
prefork机制 select():1024 poll(): event-driven: epoll(Linux):libevent Kqueue(BSD): Solaris:/dev/poll NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. NGINX is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption. NGINX is one of a handful of servers written to address the C10K problem. Unlike traditional servers, NGINX doesn’t rely on threads to handle requests. Instead it uses a much more scalable event-driven (asynchronous) architecture. This architecture uses small, but more importantly, predictable amounts of memory under load. Even if you don’t expect to handle thousands of simultaneous requests, you can still benefit from NGINX’s high-performance and small memory footprint. NGINX scales in all directions: from the smallest VPS all the way up to large clusters of servers. NGINX powers several high-visibility sites, such as Netflix, Hulu, Pinterest, CloudFlare, Airbnb, WordPress.com, GitHub, SoundCloud, Zynga, Eventbrite, Zappos, Media Temple, Heroku, RightScale, Engine Yard, MaxCDN and many others.
Nginx的程序架构:
master/worker 一个master进程: 负载加载配置文件、管理worker进程、平滑升级 一个或多个worker进程(一般等于CPU核心数) 处理并响应用户请求 缓存相关的进程: cache loader:载入缓存对象 cache manager:管理缓存对象 特性:异步、事件驱动和非阻塞 并发请求处理:通过kevent/epoll/select 文件IO:高级IO sendfile(资源部发送给调用者,直接封装成报文发出),异步,mmapne内存映射(将磁盘上的资源,直接映射进调用者的内容。不需要内核读取再复制给调用者)
nginx高度模块块:高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载;
模块分类: 核心模块:core module 标准模块: Standard HTTP modules Optional HTTP modules Mail modules Stream modules tcp/udp协议的反代;可以反向代理mysql服务 3rd party modules nginx的功用: 静态的web资源服务器; 结合FastCGI/uwSGI/SCGI等协议反代动态资源请求; 具有缓存功能。将动态资源缓存在本地 http/https协议的反向代理; imap4/pop3协议的反向代理; tcp/udp协议的反代;可以反向代理mysql服务
nginx的安装配置:
官方的预制包: http://nginx.org/packages/centos/7/x86_64/RPMS/ 编译安装: ~]# yum install pcre-devel openssl-devel zlib-devel ~]# useradd -r nginx ~]# ./configure --prefix=/usr/local/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/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio # make && make install
配置:
配置文件的组成部分: 主配置文件:nginx.conf include conf.d/*.conf fastcgi, uwsgi,scgi等协议相关的配置文件 mime.types:支持的mime类型 主配置文件的配置指令: directive value [value2 ...]; 注意: (1) 指令必须以分号结尾; (2) 支持使用配置变量; 内建变量:由Nginx模块引入,可直接引用; 自定义变量:由用户使用set命令定义; set variable_name value; 引用变量:$variable_name
主配置文件结构:
main block:主配置段,也即全局配置段; event { ... }:事件驱动相关的配置; http { ... }:http/https 协议相关的配置段; mail { ... } stream { ... }
http协议相关的配置结构
http { ... ...:各server的公共配置 server { ... }:每个server用于定义一个虚拟主机; server { ... server_name #服务器主机名 root #服务器根,与httpd下的documentroot一样 alias #别名 location [OPERATOR] URL { #定义不同url该如何映射 ... if CONDITION { ... } } } }
main配置段常见的配置指令:Core functionality
分类: 正常运行必备的配置 优化性能相关的配置 用于调试及定位问题相关的配置 事件驱动相关的配置
正常 运行必备的配置:
1、user Syntax: user user [group]; Default: user nobody nobody; Context: main Defines user and group credentials used by worker processes. If group is omitted, a group whose name equals that of user is used. 2、pid /PATH/TO/PID_FILE; 指定存储nginx主进程进程号码的文件路径; 3、include file | mask; 指明包含进来的其它配置文件片断; 4、load_module file; 指明要装载的动态模块; 5、thread_pool 定义线程池,定义名称 线程个数,队列长度,超出队列的用户则无法访问。 有的请求被因为各种原因,网络,磁盘IO等... 被阻塞,但是为了不影响其他客户请求,将其放入线程池中,继续处理其他请求。
性能优化相关的配置:
1、worker_processes number | auto; worker进程的数量;通常应该为当前主机的cpu的物理核心数; 2、worker_cpu_affinity cpumask ...; worker_cpu_affinity auto [cpumask]; worker与CPU的姻亲关系,绑定在一起。不进行cpu切换。 CPU MASK: 00000001:0号CPU 00000010:1号CPU ... ... [root@localhost nginx-1.11.5]# watch -n1 "ps axo pid,comm,psr |grep nginx" #测试cpu切换 3、worker_priority number; 指定worker进程的nice值,设定worker进程优先级;负数优先级高[-20,20] 4、worker_rlimit_nofile number; worker进程所能够打开的文件数量上限; 很重要的设定,worker的并发数量高了,这个数值也要调高。
调试、定位问题:
1、daemon on|off; 是否以守护进程方式运行Nignx; centos6可以不以守护进程方式运行,调试信息会输出到屏幕。 但是centos7,使用systemd不适用 2、master_process on|off; 是否以master/worker模型运行nginx;默认为on; 以单级架构运行。只对开发人员有用。 3、error_log file [level]; #可以定义在main, http, mail, stream, server, location
事件驱动相关的配置: 并发响应,有请求就响应 events { … }
1、worker_connections number; 每个worker进程所能够打开的最大并发连接数数量; worker_processes * worker_connections是nginx服务的最大并发连接数 2、use method; 指明并发连接请求的处理方法;默认使用epool use epoll; 3、accept_mutex on | off; 处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程; 互斥锁,保证一个资源在某一时刻只能被一个线程所使用。 有读锁和写锁,写锁其他进程不能读取和写入,读锁其他进程可以读,但是不能写 if volume of new connections is low, some of the worker processes may just waste system resources.系统负载较低时建议打开,防止系统资源浪费。
你把这粒粮食直接扔到小鸡中间,一百只小鸡一起上来抢,最终只有一只小鸡能得手,其它九十九只小鸡只能铩羽而归。这就相当于关闭了acceptmutex。 你主动抓一只小鸡过来,把这粒粮食塞到它嘴里,其它九十九只小鸡对此浑然不知,该睡觉睡觉。这就相当于激活了acceptmutex。
一盆粮食不知何年何月才能喂完,大家可以设想一下几十只小鸡排队等着喂食时那种翘首以盼的情景。此时更好的方法是把这盆粮食直接撒到小鸡中间,让它们自己去抢,虽然这可能会造成一定程度的混乱,但是整体的效率无疑大大增强了。
Nginx缺省激活了accept_mutex,是一种保守的选择。如果关闭了它,可能会引起一定程度的惊群问题,表现为上下文切换增多(sar -w)或者负载上升,但是如果你的网站访问量比较大,为了系统的吞吐量,我还是建议大家关闭它。
http协议的相关配置:ngxhttpcore_module
http { ... ... ##server的公共配置 server { ... server_name root location [OPERATOR] /uri/ { ... } } server { ... } } 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] 3、server_name name ...; 指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串; 支持*通配任意长度的任意字符;server_name *.magedu.com 支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+\.magedu\.com$ 匹配机制: (1) 首先是字符串精确匹配; (2) 左侧*通配符; (3) 右侧*通配符; (4) 正则表达式; 练习:定义四个虚拟主机,混合使用三种类型的虚拟主机; 仅开放给来自于本地网络中的主机访问;
回顾:IO模型 、nginx
IO模型: 阻塞型 非阻塞型 复用型(select, poll) 信号驱动型(epoll, kqueue, /dev/poll) AIO 阶段:等待数据准备完成,复制数据; nginx:master/worker master worker(work_connections) cache loader cache manager 模块类别:核心模块、标准模块(http标准模块、http可选模块、mail模块、stream模块)、3rd模块 nginx.conf main block event { ... } http { ... server { ... server_name listen root location /uri/ { ... } } server { ... } } stream { }
Nginx(2)
http协议的相关配置: http { ... ... server { ... server_name root location [OPERATOR] /uri/ { ... } } server { ... } }
与套接字相关的配置(2)
4、tcp_nodelay on | off; 在keepalived模式下的连接是否启用TCP_NODELAY选项; keeplive模式下,nginx默认将用户请求的非常小的资源延迟发送。在长连接还没有断开时,再有其他资源请求,随其他请求一起发送。 tcp_nodelay on 就是不开启,只要用户有请求,不延时直接发送。 建议直接发送 默认值on即可 5、sendfile on | off; 是否启用sendfile功能; 在内核级别直接封装用户请求的资源。
定义路径相关的配置:
6、root path; 设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http, server, location, if in location; 用在http中,为所有虚拟主机提供默认配置的,但是所有的虚拟主机server也可以配置,server中的配置覆盖http中的配置。 nginx中的root 与location中的 / 是一个意义。也就root就是rul的根,location中使用的 / 是一个意思。 root /var/www/html 的意思等于 location /
实例:1 root 和location中 / d 关系
server { root /var/www/html } 与 在location中 server { location / { root /var/www/html } } 上面两种写法的效果是一样的。
实例2 location /admin/ 容器中定义了root
server { server_name www.magedu.com; root /var/www/html/; location /admin/ { root /webapps/app1/data/; } } 意义:虚拟机主机的根为 /var/www/html/下 http://wwww.magedu.com/的根是/var/www/html/ location中/admin/ 指的是http://wwww.magedu.com/admin/ 资源路径 /webapps/app1/data/路径下的admin目录
实例3 location /admin/ 没有定义root
server { root /var/www/html/; server_name www.magedu.com; location /admin/ { ... } } 意义:location中定义的/admin/ 指的是/var/www/html/admin/ http://wwww.magedu.com/admin/ 资源路径/var/www/html/admin
7、location
location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
Context:server, location 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置; httpd中的location和director分别是站在url和文件系统角度的。 nginx中location也是站在url的角度的。 =:对URI做精确匹配;例如, http://www.magedu.com/, http://www.magedu.com/index.html location = / { ... } ~:对URI做正则表达式模式匹配,区分字符大小写; ~*:对URI做正则表达式模式匹配,不区分字符大小写; ^~:对URI的左半部分做匹配检查,不区分字符大小写; 不带符号:匹配起始于此uri的所有的url; 匹配优先级:=, ^~, ~/~*,不带符号;
官方文档是咧
Let’s illustrate the above by an example: location = / { ###精确匹配整个url [ configuration A ] } location / { [ configuration B ] } ##访问http://magedu.com和访问http://magedu.com/index.html 效果是不一样的。 ------------------------------------------------------------------------ location /documents/ { [ configuration C ] } location ^~ /images/ { ###the “/images/1.gif” request will match configuration D [ configuration D ] ###匹配请求资源的资源的左侧的url } location ~* \.(gif|jpg|jpeg)$ { ###匹配以.(gif|jpg|jpeg)结尾的url [ configuration E ] } The “/” request will match configuration A, the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E.
alias path; 只能用于location中
定义路径别名,文档映射的另一种机制;仅能用于location上下文; 注意:location中使用root指令和alias指令的意义不同; (a) root,给定的路径对应于location中的/uri/左侧的/; 资源位置是root定义目录下的uri目录 (b) alias,给定的路径对应于location中的/uri/右侧的/; /uri/的根 资源映射位置是别名指定的位置
index file …;
是由一个独立的模块提供的指令。ngx_http_index_module 标准模块 Syntax: index file ...; ##可以根多个文件名,定义默认主页 Default: index index.html; Context: http, server, location 默认资源;http, server, location;
error_page code … [=[response]] uri;
定义显示给用户的错误页面显示。
Syntax: error_page code ... [=[response]] uri; Default: — Context: http, server, location, if in location =[response 自定义错误响应码,例如可以将200设置成响应码。 Defines the URI that will be shown for the specified errors.
11、try_files file … uri;
定义客户端请求的相关配置
12、keepalive_timeout timeout [header_timeout]; 设定保持连接的超时时长,0表示禁止长连接;默认为75s; 13、keepalive_requests number; 在一次长连接上所允许请求的资源的最大数量,默认为100; 14、keepalive_disable none | browser ...; 对哪种浏览器禁用长连接; 15、send_timeout time; Syntax: send_timeout time; Default: send_timeout 60s; Context: http, server, location 向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长; 这里的写是指对nginx监听的套接字的写,想用户发送信息。 服务端已经发出了第一个报文,超过了60秒客户端还是没有接收到就断开连接。 16、client_body_buffer_size size; #内存中的缓存 Context: http, server, location 用于接收客户端请求报文的body部分的缓冲区大小;默认64位系统为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置; 如果客户端通过post等方式发送过来的数据较大,就得先缓存下来在响应。 17、client_body_temp_path path [level1 [level2 [level3]]]; Syntax: client_body_temp_path path [level1 [level2 [level3]]]; Default: client_body_temp_path client_body_temp; Context: http, server, location 设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;定义索引的层级 16进制的数字; client_body_temp_path path /var/tmp/client_body 1 2 2 表示16个一级子目录, 每个一级子目录有256个二级子目录,每个二级子目录下有256个三级子目录 数字表示几个十六进制数字。2个16进制表示265个(0-255) FF=255 设置的目录nginx要有读写权限。
对客户端进行限制的相关配置:
18、limit_rate rate; 限制响应给客户端的传输速率,单位是bytes/second,0表示无限制; 19、limit_except method ... { ... } 限制对指定的请求方法之外的其它方法的使用客户端; limit_except GET { allow 192.168.1.0/32; deny all; } 除了get之外的其他方法仅允许192.168.1.0/32这个网络访问。
文件操作优化的配置
20、aio on | off | threads[=pool]; 是否启用aio功能;异步IO模型 21、directio size | off; 在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;大于4m的直接读取发往进程,或直接写入磁盘,这样的数据不适用缓存或缓冲区。
22、openfilecache off; 打开文件缓存
Context: http, server, location open_file_cache max=N [inactive=time]; nginx可以缓存以下三种信息: (1) 文件的描述符、文件大小和最近一次的修改时间; (2) 打开的目录结构; (3) 没有找到的或者没有权限访问的文件的相关信息; max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理; inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_users指令所指定的次数的缓存项即为非活动项; 通过用户自定定义超时时间(指定时间没有访问过)和非活动状态(少于用户定义的访问次数) 23、open_file_cache_valid time; 缓存项有效性的检查频率;默认为60s; 24、open_file_cache_min_uses number; 在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项; 25、open_file_cache_errors on | off; 是否缓存查找时发生错误的文件一类的信息;
ngxhttpaccess_module模块:
通常在location中使用,实现基于ip的访问控制功能 allow address | CIDR | unix: | all; deny address | CIDR | unix: | all; http, server, location, limit_except
ngxhttpauthbasicmodule模块
实现基于用户的访问控制,使用basic机制进行用户认证; 28、auth_basic string | off; 29、auth_basic_user_file file; location /admin/ { alias /webapps/app1/data/; auth_basic "Admin Area"; #弹出对话框的提示信息 auth_basic_user_file /etc/nginx/.ngxpasswd; } 注意:htpasswd命令由httpd-tools所提供; [root@localhost ~]# htpasswd -c -m ./test tom New password: Re-type new password: Adding password for user tom [root@localhost ~]# htpasswd -m ./test jery New password: Re-type new password: Adding password for user jery [root@localhost ~]# cat test tom:$apr1$O0R/I7.P$9cvGp1HCdLhITaJYCPsVm/ jery:$apr1$WYavczT5$ADlzWUjawkT7WskfDs21L/
ngxhttpstubstatusmodule模块
用于输出nginx的基本状态信息; Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106 Active connections: 活动状态的连接数; accepts:已经接受的客户端请求的总数; handled:已经处理完成的客户端请求的总数; requests:客户端发来的总的请求数; Reading:处于读取客户端请求报文首部的连接的连接数; Writing:处于向客户端发送响应报文过程中的连接数; Waiting:处于等待客户端发出请求的空闲连接数;
这些信息可以导入到zibx中,监控nginx。通常需要自己写脚本将信息导入到zibx中。
30、stub_status; 配置示例: location /basic_status { stub_status; }
ngxhttplog_module模块
he ngx_http_log_module module writes request logs in the specified format. 可以单独定义某开个location或server中,记录或不记录日志。 31、log_format name string ...; string可以使用nginx核心模块及其它模块内嵌的变量; 定义combine格式 32、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; fomat 指的是log_format定义定name access_log off; ##可以单独定义某开个location或server中,记录或不记录日志。 访问日志文件路径,格式及相关的缓冲的配置; buffer=size flush=time 每隔多长时间同步一次数据到磁盘上。 33、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off; 缓存各日志文件相关的元数据信息; nginx用户大量访问,或调试日志开启,会产生大量日志,方便用产看日志信息。 max:缓存的最大文件描述符数量; min_users:在inactive指定的时长内访问大于等于此值方可被当作活动项; inactive:非活动时长; valid:验正缓存中各缓存项是否为活动项的时间间隔;
课外作业:为nginx定义使用类似于httpd的combined格式的访问日志;
回顾: nginx.conf配置文件: http { … server { … location /URI/ { … } … } … }
ngx_http_core_module模块: limit_rate, limit_except, aio, directio, open_file_cache, send_timeout, client_body_buffer_size, client_body_temp_path, ... ngx_http_access_module: allow, deny ngx_http_auth_basic_module: auth_basic auth_basic_user_file ngx_http_log_module: log_format access_log open_log_file_cache ngx_http_stub_status_module: stub_status
Nginx(3)
ngxhttprewrite_module模块:
The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations. 将用户请求的URI基于regex所描述的模式进行检查,而后完成替换;
1、rewrite regex replacement [flag]
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI; 注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制; 如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端; 301:永久重定向; [flag]: last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环; break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环; redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头; permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;
2、return
return code [text]; return code URL; return URL; Stops processing and returns the specified code to a client.
3、 rewrite_log on | off;
是否开启重写日志;
4、 if (condition) { … }
引入一个新的配置上下文 ;条件满足时,执行配置块中的配置指令;server, location; condition: 比较操作符: == != ~:模式匹配,区分字符大小写; ~*:模式匹配,不区分字符大小写; !~:模式不匹配,区分字符大小写; !~*:模式不匹配,不区分字符大小写; 文件及目录存在性判断: -e, !-e -f, !-f -d, !-d -x, !-x
5、set $variable value;
用户自定义变量 ;
ngxhttpgzip_module:
The ngx_http_gzip_module module is a filter that compresses responses using the “gzip” method. This often helps to reduce the size of transmitted data by half or even more. 1、gzip on | off; Enables or disables gzipping of responses. 2、gzip_comp_level level; Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9. 3、 gzip_disable regex ...; Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions. 4、 gzip_min_length length; 启用压缩功能的响应报文大小阈值; 5、gzip_buffers number size; 支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小; 6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的; off:对代理的请求不启用 no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能; 7、gzip_types mime-type ...; 压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能;
ngxhttpfastcgi_module模块:
The ngx_http_fastcgi_module module allows passing requests to a FastCGI server. 1、fastcgi_pass address; address为fastcgi server的地址; location, if in location; 2、fastcgi_index name; fastcgi默认的主页资源; 3、fastcgi_param parameter value [if_not_empty]; Sets a parameter that should be passed to the FastCGI server. The value can contain text, variables, and their combination. 配置示例1: 前提:配置好fpm server和mariadb-server服务; location ~* \.php$ { root /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; include fastcgi_params; } 配置示例2:通过/pm_status和/ping来获取fpm server状态信息; location ~* ^/(pm_status|ping)$ { include fastcgi_params; fastcgi_pass 127.0.0.1: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]; 定义fastcgi的缓存;缓存位置为磁盘上的文件系统,由path所指定路径来定义; levels=levels:缓存目录的层级数量,以及每一级的目录数量;levels=ONE:TWO:THREE leves=1:2:2 keys_zone=name:size k/v映射的内存空间的名称及大小 inactive=time 非活动时长 max_size=size 磁盘上用于缓存数据的缓存空间上限 5、fastcgi_cache zone | off; 调用指定的缓存空间来缓存数据;http, server, location 6、fastcgi_cache_key string; 定义用作缓存项的key的字符串; 7、fastcgi_cache_methods GET | HEAD | POST ...; 为哪些请求方法使用缓存; 8、fastcgi_cache_min_uses number; 缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认作活动项; 9、fastcgi_cache_valid [code ...] time; 不同的响应码各自的缓存时长;
示例: http { … fastcgicachepath /var/cache/nginx/fastcgicache levels=1:2:1 keyszone=fcgi:20m inactive=120s; … server { … location ~* .php$ { … fastcgicache fcgi; fastcgicachekey $requesturi; fastcgicachevalid 200 302 10m; fastcgicachevalid 301 1h; fastcgicachevalid any 1m; … } … } … }
10、fastcgikeepconn on | off;
By default, a FastCGI server will close a connection right after sending the response. However, when this directive is set to the value on, nginx will instruct a FastCGI server to keep connections open.
ngxhttpssl_module模块:
1、 ssl on | off; Enables the HTTPS protocol for the given virtual server. 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]; builtin[:size]:使用OpenSSL内建的缓存,此缓存为每worker进程私有; [shared:name:size]:在各worker之间使用一个共享的缓存; 6、ssl_session_timeout time; 客户端一侧的连接可以复用ssl session cache中缓存 的ssl参数的有效时长; 配置示例: server { listen 443 ssl; server_name www.magedu.com; root /vhosts/ssl/htdocs; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_cache shared:sslcache:20m; }
ngxhttpreferer_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. 1、valid_referers none | blocked | server_names | string ...; 定义referer首部的合法可用值; none:请求报文首部没有referer首部; blocked:请求报文的referer首部没有值; server_names:参数,其可以有值作为主机名或主机名模式; arbitrary_string:直接字符串,但可使用*作通配符; regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~.*\.magedu\.com; 配置示例: valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.; if($invalid_referer) { return 403; } 博客作业:以上所有内容; 练习:实现lnmp,提供多个虚拟主机; (1) http, 提供wordpress; (2) https, 提供pma;
回顾: Nginx: gzip、ssl、fastcgi、referer、…
LB Cluster:lvs 硬件:F5 BIG-IP,Citrix NetScaler,A10 A10 软件:lvs, nginx, haproxy, pound, ats, perlbal 传输层:lvs, nginx(stream), haproxy(mode tcp) 应用层:nginx(upstream),harproxy(mode http), httpd(balancer), ats, perlbal, pound, mysql-proxy, ... lvs: 静态方法:rr, wrr, sh, dh 动态方法:lc, wlc, sed, nq, lblc, lblcr session保持: session sticky session replication session server(memcached, redis)
Nginx(4)
LB Cluster: 传输层:lvs、nginx、haproxy 应用层:nginx(http, https, smtp, pop, imap), haproxy(http), httpd(http/https), ats, perlbal, pound, ... nginx load balancer: tcp/udp nginx proxy: reverse proxy: 应用程序发布: 灰度模型: (1) 如果存在用户会话; 从服务器上拆除会话; (2) 新版本应用程序存在bug; 回滚;
正向代理类似于DNAT,反向代理类似SNAT
ngxhttpproxy_module #http的反代模块 首先是代理其次才是缓存 透传式代理才有缓存功能,类似DNS的递归查询 客户端是看不到后端服务的。代理服务器首先是代理,其次才是缓存服务器。代理服务器先找自己的缓存,没有才找后端主机请求。 代理服务器不一定都有缓存
旁挂式或旁路式缓存,请求者先找缓存,没有的话才找真实服务器 客户端先访问缓存服务器,缓存服务器没有才找真实服务器。
(1) proxy_pass URL; location, if in location, limit_except 注意:proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机; location /uri/ { proxy_pass http://HOST; } proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri; location /uri/ { proxy_pass http://HOST/new_uri/; } 如果location定义其uri时使用正则表达式的模式,则proxy_pass之后必须不能使用uri; location ~|~* PATTERN { proxy_pass http://HOST; } (2) proxy_set_header field value; 设定发往后端主机的请求报文的请求首部的值; 示例: proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for (3) proxy_cache_path proxy_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]; (4) proxy_cache zone | off; 调用的缓存的名称,或禁用缓存; (5) proxy_cache_key string; 缓存条目的键; (6) proxy_cache_valid [code ...] time; 对各类响应码的缓存时长; 使用示例: 定义在http{}中: proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:1 keys_zone=pcache:10m max_size=1g; 定义在server{}及其内部的组件中: proxy_cache pcache; proxy_cache_key $request_uri; proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; (7) proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...; (8) proxy_connect_timeout proxy_read_timeout proxy_send_timeout (9) proxy_buffer_size proxy_buffering proxy_buffers
ngxhttpheaders_module
The ngx_http_headers_module module allows adding the “Expires” and “Cache-Control” header fields, and arbitrary fields, to a response header. (1) add_header name value [always]; 向响应报文中添加自定义首部; 可用上下文:http, server, location, if in location add_header X-Via $server_addr; add_header X-Accel $server_name; (2) expires [modified] time; expires epoch | max | off; 用于定义Expire或Cache-Control首部的值,或添加其它自定义首部;
回顾: nginx: web server http/https reverse proxy tcp/udp upstream server
ngx_http_proxy_module proxy_pass proxy_set_header proxy_cache_path proxy_cache proxy_cache_key proxy_cache_valid proxy_connect_timeout, proxy_read_timeout, proxy_send_timeout ngx_http_headers_module add_header
Nginx(5)
ngxhttpupstream_module模块
The ngx_http_upstream_module module is used to define groups of servers that can be referenced by the proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass directives. 1、upstream name { ... } 定义后端服务器组,会引入一个新的上下文;Context: http upstream httpdsrvs { server ... server... ... } 2、server address [parameters]; 在upstream上下文中server成员,以及相关的参数;Context: upstream address的表示格式: unix:/PATH/TO/SOME_SOCK_FILE IP[:PORT] HOSTNAME[:PORT] parameters: weight=number 权重,默认为1; max_fails=number 失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用; fail_timeout=time 设置将服务器标记为不可用状态的超时时长; max_conns 当前的服务器的最大并发连接数; backup 将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用; down 标记为“不可用”; 3、least_conn; 最少连接调度算法,当server拥有不同的权重时其为wlc; 4、 ip_hash; 源地址hash调度方法; 5、hash key [consistent]; 基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合; 作用:将请求分类,同一类请求将发往同一个upstream server; If the consistent parameter is specified the ketama consistent hashing method will be used instead. 示例: hash $request_uri consistent; hash $remote_addr; 6、keepalive connections; 为每个worker进程保留的空闲的长连接数量; nginx的其它的二次发行版: tengine OpenResty
ngxstreamcore_module模块
模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器; 1、stream { ... } 定义stream相关的服务;Context:main stream { upstream sshsrvs { server 192.168.22.2:22; server 192.168.22.3:22; least_conn; } server { listen 10.1.0.6:22022; proxy_pass sshsrvs; } } 2、listen listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; 博客作业:以上所有内容; 思考: (1) 动态资源存储一组服务器、图片资源存在一组服务器、静态的文本类资源存储在一组服务器;如何分别调度? (2) 动态资源基于fastcgi或http协议(ap)? lnamp
原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/56568