nginx配置
===========================================
Nginx官网:http://nginx.org/
Nginx官网下载地址(选择 Stable version 稳定版):http://nginx.org/en/download.html
官网安装介绍:http://nginx.org/en/linux_packages.html
一:安装
nginx 显示目录
http {
autoindex on; # 自动显示目录
autoindex_exact_size off; # 人性化方式显示文件大小否则以byte显示
autoindex_localtime on; # 按服务器时间显示,否则以gmt时间显示
}
二:配置
2.1:
2.2:
配置:
配置文件 的组成部分:
主配置文件:nginx.conf
include conf.d/*.conf
facscgi, scgi, uwscgi的相关配置
mime.types
配置指令(必须以分号结尾):
directive value1 [value2...];
支持使用变量:
内置变量:由模块引入,可直接引用;
自定义变量:set variable_name value;
引用变量:$variable_name
配置文件结构:
main block:全局配置;
event {
...
}:事件驱动的相关配置;
http {
...
}:http协议的相关配置
mail {
...
}:mail相关的配置;
http相关的配置:
http {
...
...
server {
...
server_name
root
alias
location /uri/ {
...
}
...
}
server {
...
...
}
}
main block:
配置指令的类别:
正常运行必备的配置;
优化性能的配置;
用于调试、定位问题的配置;
正常运行必备的配置:
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进程所能够打开的最大文件数;
性能优化相关的配置:
1、 worker_processes number | auto;
worker的进程数;通常应该为CPU的核心数减1;
2、worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
CPUMASK:
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
...
3、worker_priority nice;
[-20,19]
100-139
调试、定位问题:
1、daemon on | off;
是否以守护进程方式启动nginx进程;
2、master_process on | off;
是否以master/worker模型启动nignx进程;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
错误日志文件的记录方式,及其日志级别:
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:发送到错误输出;
syslog:server=address[,parameter=value]:发送给syslog服务器;
memory:size
日志级别:
debug依赖于configure时的--with-debug选项;
回顾:IO模型、nginx
IO模型:
阻塞式
非阻塞式
IO复用(select, poll)
信号驱动的IO(epoll, kqueue, /dev/poll)
AIO
阶段:等待数据准备完成,复制数据(从内核缓冲区到进程的地址空间)
nginx:master/worker
master
worker()
cache loader
cache manager
模块类别:核心模块、标准模块(http标准模块,http可选模块,mail模块)、3rd模块
nginx.conf
main block
event {
...
}
http {
...
server {
...
server_name
root
location /uri/ {
...
}
}
server {
...
}
}
Nginx(2)
nginx.conf:
main block
events {
...
}
1、worker_connections number;
每个worker进程所能够并发打开的最大连接数;
worker_processes * worker_connections
2、use method;
指明并发连接请求处理时使用的方法;
use epoll;
3、accept_mutex on | off;
启用时,表示用于让多个worker轮流地、序列化地响应新请求;
http {
...
}
定义套接字相关功能
1、server { ... }
配置一个虚拟主机;
server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
...
}
注意:
(1) 基于port的虚拟主机:
listen指令要使用不同的端口;
(2) 基于Hostname的虚拟主机;
server_name指令指向不同的主机名;
(3) 基于ip的虚拟主机:
listen IP:PORT;
2、listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl] ;
default_server:默认虚拟主机;
ssl:限制只能通过ssl连接提供服务;
backlog:后缓队列的长度;
rcvbuf:接收缓冲大小;
sndbuf:发送缓冲区大小;
3、server_name name ...;
指明当前server的主机名;后可跟一个或空白字符分隔的多个主机;
支持使用*任意长度的任意字符;
支持~起始的正则表达式模式字符串;
应用策略:
(1) 首先精确匹配;
(2) 左则*通配符匹配;
(3) 右侧*通配符匹配;
(4) 正则表达式模式匹配;
server_name www.magedu.com;
server_name *.magedu.com;
server_name www.magedu.*;
server_name ~^.*\.magedu\..*$;
mail.magedu.com, www.magedu.com
4、tcp_nodelay on|off;
对keepalived模式下的连接是否启用TCP_NODELAY选项;
5、sendfile on | off;
是否启用sendfile功能;
定义路径相关配置
6、root path;
设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;
可用上下文:http, server, location, if
7、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
根据用户请求的URI来匹配定义的location,匹配到时,此请求将被相应的location块中的指令所处理;
server {
...
location {
}
location {
...
}
}
=:URI精确匹配;
~:做正则表达式模式匹配,区分字符大小写;
~*:做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;
匹配优先级:=、^~、~/~*、不带符号;
8、alias path;
定义路径别名,文档映射的一种机制;仅能用于location上下文;
alias /bbs/ /web/forum/
http://www.magedu.com/bbs/a.jpg
location /bbs/ {
alias /web/forum/;
}
/web/forum/a.jpg
location /bbs/ {
root /web/forum/;
}
/web/forum/bbs/a.jpg
注意:
root指令:给定的路径对应于location中的/uri/左侧的/;
alias指令:给定的路径对应于location中的/uri/右侧的/;
9、index file ...;
可用位置:http, server, location
默认主面;
10、error_page code ... [=[response]] uri;
根据用户请求的资源的http响应的状态码实现错误页重定向;
http://www.magedu.com/hello.html --> 因为资源不存在而被改为对
http://www.magedu.com/404.html
11、
定义客户端请求的相关配置
12、keepalive_timeout timeout [header_timeout];
设定保持连接的超时时长,0表示禁止长连接 ;默认为75s;
13、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100;
14、keepalive_disable none | browser ...;
对哪种浏览器禁用长连接;
15、send_timeout time;
向客户端发送响应报文的超时时长; 特别地,是指两次写操作之间的间隔时长;
16、client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超时此大小时,其将被暂存到磁盘上;
17、client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
/var/tmp/body 2 1 2
00-ff
对客户的请求进行限制的相关配置:
18、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
19、limit_except method ... { ... };
限制对指定的请求方法之外的其它方法的使用客户端;
limit_except GET POST {
allow 172.18.0.0/16;
deny all;
}
表示除了GET和POST之外的其它方法仅允许172.18.0.0/16中的主机使用;
文件操作优化的配置:
20、aio on | off | threads[=pool];
是否启用aio功能;
21、directio size | off;
22、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录的结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的超时时长,在此处指定的时长内未被命中的缓存项即为非活动项;
23、open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息;
24、open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少命中此处指定的次数方可不被归类到非活动项;
25、open_file_cache_valid time;
缓存项有效性的检查频率;默认是60s;
ngx_http_access_module模块:
实现基于ip的访问控制功能;
26、allow address | CIDR | unix: | all;
27、deny address | CIDR | unix: | all;
可用上下文:http, server, location, limit_except
ngx_http_auth_basic_module模块:
28、auth_basic string | off;
使用basic机制进行用户认证;
29、auth_basic_user_file file;
认证用的账号密码文件;
文件格式:
name:password:commet
密码格式:
htpasswd命令;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
ngx_http_stub_status_module模块:
用于输出nginx的基本状态信息;
Active connections: 1
server accepts handled requests
155 155 298
Reading: 0 Writing: 1 Waiting: 0
Active connections: 处于活动状态的客户端连接的数量;
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数;
ngx_http_referer_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.
30、valid_referers none | blocked | server_names | string ...;
定义合法的referer数据;
none:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:其值是主机名;
arbitrary string:直接字符串,可以使用*作为通配符;
regular expression:被指定的正则表达式模式匹配到的字符串;要使用~起始;
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
回顾:
master/worker
nginx.conf:
main block
events {
...
}
http {
...
server {
...
listen
server_name
location [=|^~|~|~*] /uri/ {
root
...
}
...
}
Nginx(3)
ngx_http_ssl_module
ssl on | off;
是否启用当前虚拟主机的ssl功能;
ssl_certificate file;
当前虚拟主机使用的PEM格式的证书文件;
ssl_certificate_key file;
当前虚拟机使用的证书文件中的公钥配对儿的私钥文件路径,PEM格式;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
SSL协议的版本;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
指明ssl会话的缓存机制;
builtin:使用openssl内建的缓存机制,此为各worker独有;
shared:由各worker共享的缓存;
name:缓存空间的名称;
size:字节为单位的缓存空间的大小;每1MB内存空间可缓存4000个会话;
ssl_session_timeout time;
ssl会话超时时长,指ssl session cache中缓存条目有效时长;
ngx_http_log_module
The ngx_http_log_module module writes request logs in the specified format.
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
access_log off;
log_format name string ...;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
max:最大缓存条目;
inactive=time:非活动时长;
min_uses:最少使用次数;
valid:验正缓存条目有效性的频率;
ngx_http_rewrite_module
rewrite regex replacement [flag];
把用户请求的URI基于regex做检查,匹配到时将替换为replacement指定的字符串;
在同一个location中存在的多个rewrite规则会自上而下逐个被检查(循环);可以使用flag控制此循环功能;
如果replacement是以http://或https://开头,则替换结果会直接以重定向方式返回给客户端;
[flag]:
last:重写完成后停止对当前uri在当前location中的后续其它重写操作,改为对新uri的新一轮处理;
break:重写完成后停止对当前uri在当前location中的后续其它重写操作;
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(302)
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(301)
rewrite_log on | off;
是否启用重写日志;启用时,日志信息被发往错误日志;
if (condition) { ... }:
条件判断机制,在条件满足时,执行配置块中的配置;
引入了一个新的配置上下文;
condition:
比较表达式:
==, !=
~:模式匹配,区分字母大小写;
~*:模式匹配,不区分字符大小写;
!~:模式不匹配,区分字母大小写;
!~*:模式不匹配,不区分字母大小写;
文件及目录存在性判断:
-f, !-f:文件
-d, !-d:目录
-e, !-e:存在
-x, !-x:执行
return:
return code [text];
return code URL;
return URL;
set $variable value;
用户自定义变量;
ngx_http_gzip_module
过滤器,对指定类型的资源压缩传输以节约带宽;
gzip on | off;
启用或禁用gzip压缩响应报文;
gzip_comp_level level;
指定压缩比,1-9,默认为1;
gzip_disable regex ...;
regex是匹配客户端浏览器类型的模式,表示对所有匹配到的浏览器不执行压缩响应;
gzip_min_length length;
触发启用压缩功能的响应报文的最小长度;
gzip_http_version 1.0 | 1.1;
设定启用压缩响应功能时,协议的最小版本;
gzip_types mime-type ...;
指定仅执行压缩的资源内容类型;默认为text/html;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
对代理的请求基于何种属性判断其是否应该启用压缩功能;
示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
ngx_http_fastcgi_module
LAMP:
httpd+php:
modules
cgi
fastcgi
proxy_fastcgi_module
LNMP:
nginx+php:
fastcgi
php:编译时,支持fpm;
./configure ... --enable-fpm ...
php-fpm工作方式(类似于httpd的prefork):
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic | static
pm.start_servers:启动fpm进程时启动的工作进程数量;
pm.min_spare_servers:最少空闲进程数;
pm.max_spare_servers:最大空闲进程数;
pm.max_children:最大工作进程数;
user = USERNAME
group = GROUPNAME
fastcgi模块指令:
fastcgi_pass address;
address是fpm服务器监听的地址和端口;
示例: fastcgi 127.0.0.1:9000;
fastcgi_index name;
fastcgi应用的主页名称;
fastcgi_param parameter value [if_not_empty];
传递给fpm服务器的参数及其值;
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=#[:#[:#]]:缓存目录层级定义;
levels=1:2
keys_zone=name:size
内存中用于缓存k/v映射关系的空间名称及大小;
inactive=time
注意:只能定义在http上下文 ;
fastcgi_cache zone | off;
是否启用cache,如果启用,数据缓存于哪个cache中;
fastcgi_cache_key string;
定义要使用的缓存键;
例如: fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST ...;
缓存哪些类型的请求的相关数据;
fastcgi_cache_min_uses number;
fastcgi_cache_valid [code ...] time;
对不同响应码设定其可缓存时长;
注意:调用缓存时,至少应该 指定三个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
Nginx:
web服务器:http协议;
http协议:html,MIME(多用途互联网邮件扩展)
major/minor:
text/html, text/plain, image/jpeg, ...
web资源:URL (scheme://server:port/path/to/source)
方法:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,...
WEBDAV
http事务:request <--> response
request:
<method> <URL> <version>
<HEADERS>
...
<body>
response:
<version> <status> <reason phrase>
<HEADERS>
...
<body>
status:
1xx:信息类
2xx:成功类,200
3xx:重定向,301, 302, 304
4xx:错误类,客户端错误,404,403
5xx:错误类,服务器端错误,502
认证:basic, digest
httpd:MPM
prefork, worker, event
I/O模型:
同步/异步:
关注的是消息通知机制
同步:synchronous,
异步:asynchronous,
消息通知:
同步:等待对方返回消息;
异步:被调用者通过状态、通知或回调通知调用者
状态:调用者每隔一段时间就需要检查一次;
通知:
回调:
阻塞/非阻塞
关注调用者等等结果返回之前所处的状态;
阻塞:block,调用结果返回之前,调用者会被挂起;
非阻塞:nonblock,调用结果返回之前,调用者不会被挂起;
I/O:
网络IO:本质是socket读取;
磁盘IO:流;
每次IO,都会经由两个阶段:
第一步:数据先加载至内核内存空间(缓冲区);
第二步:数据从内核缓冲区复制到用户空间的进程的内存中去;
等待数据准备完成;
数据内核复制到进程;
I/O模型:
同步阻塞:
同步非阻塞:
IO multipexing:select, poll
Signal Driven IO:
Asynchronous IO:
Nginx:
C10k, http://nginx.org/
engin X: nginx
二次开发版:tengine, openresty
Nginx的特性:
模块化设计,较好的扩展性;
高可靠性
master/worker
支持热部署
不停机更新配置文件、更换日志文件、更新服务器程序版本;
低内存消耗
10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存;
event-driven, aio, mmap
基本功能:
静态资源的web服务器;
http协议反向代理服务器;
pop3/imap4协议反射代理服务器;
FastCGI(lnmp), uWSGI等协议;
模块化(非DSO),著名有zip, SSL, ...;
web服务器相关的功能:
虚拟主机、keepalive、访问日志、url rewrite、路径别名、基于ip及用户的访问控制、支付速率限制及并发数限制,...;
Nginx的程序架构:
master/worker
一个master进程,可生成一个或多个worker进程;
master:加载配置文件、管理worker进程、平滑升级、...
worker:http服务、http代理、fastcgi代理、...
模块类型:
核心模块: core module
标准模块:
Standard HTTP modules
Optional HTTP modules
Mail modules
3rd party modules:
nginx用来做什么?
静态资源的web服务器
http协议反向代理
nginx的安装:
# yum -y install pcre-devel openssl-devel zlib-devel
# ./configure \
--prefix=/usr/local
--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/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_realip_module
--with-http_addition_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_stub_status_module
--with-http_auth_request_module
--with-threads
--with-stream
--with-stream_ssl_module
--with-http_slice_module
--with-file-aio
--with-http_v2_module
# make && make install
配置:
配置文件 的组成部分:
主配置文件:nginx.conf
include conf.d/*.conf
facscgi, scgi, uwscgi的相关配置
mime.types
配置指令(必须以分号结尾):
directive value1 [value2...];
支持使用变量:
内置变量:由模块引入,可直接引用;
自定义变量:set variable_name value;
引用变量:$variable_name
配置文件结构:
main block:全局配置;
event {
...
}:事件驱动的相关配置;
http {
...
}:http协议的相关配置
mail {
...
}:mail相关的配置;
http相关的配置:
http {
...
...
server {
...
server_name
root
alias
location /uri/ {
...
}
...
}
server {
...
...
}
}
main block:
配置指令的类别:
正常运行必备的配置;
优化性能的配置;
用于调试、定位问题的配置;
正常运行必备的配置:
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进程所能够打开的最大文件数;
性能优化相关的配置:
1、 worker_processes number | auto;
worker的进程数;通常应该为CPU的核心数减1;
2、worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
CPUMASK:
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
...
3、worker_priority nice;
[-20,19]
100-139
调试、定位问题:
1、daemon on | off;
是否以守护进程方式启动nginx进程;
2、master_process on | off;
是否以master/worker模型启动nignx进程;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
错误日志文件的记录方式,及其日志级别:
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:发送到错误输出;
syslog:server=address[,parameter=value]:发送给syslog服务器;
memory:size
日志级别:
debug依赖于configure时的--with-debug选项;
回顾:IO模型、nginx
IO模型:
阻塞式
非阻塞式
IO复用(select, poll)
信号驱动的IO(epoll, kqueue, /dev/poll)
AIO
阶段:等待数据准备完成,复制数据(从内核缓冲区到进程的地址空间)
nginx:master/worker
master
worker()
cache loader
cache manager
模块类别:核心模块、标准模块(http标准模块,http可选模块,mail模块)、3rd模块
nginx.conf
main block
event {
...
}
http {
...
server {
...
server_name
root
location /uri/ {
...
}
}
server {
...
}
}
Nginx(2)
nginx.conf:
main block
events {
...
}
1、worker_connections number;
每个worker进程所能够并发打开的最大连接数;
worker_processes * worker_connections
2、use method;
指明并发连接请求处理时使用的方法;
use epoll;
3、accept_mutex on | off;
启用时,表示用于让多个worker轮流地、序列化地响应新请求;
http {
...
}
定义套接字相关功能
1、server { ... }
配置一个虚拟主机;
server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
...
}
注意:
(1) 基于port的虚拟主机:
listen指令要使用不同的端口;
(2) 基于Hostname的虚拟主机;
server_name指令指向不同的主机名;
(3) 基于ip的虚拟主机:
listen IP:PORT;
2、listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl] ;
default_server:默认虚拟主机;
ssl:限制只能通过ssl连接提供服务;
backlog:后缓队列的长度;
rcvbuf:接收缓冲大小;
sndbuf:发送缓冲区大小;
3、server_name name ...;
指明当前server的主机名;后可跟一个或空白字符分隔的多个主机;
支持使用*任意长度的任意字符;
支持~起始的正则表达式模式字符串;
应用策略:
(1) 首先精确匹配;
(2) 左则*通配符匹配;
(3) 右侧*通配符匹配;
(4) 正则表达式模式匹配;
server_name www.magedu.com;
server_name *.magedu.com;
server_name www.magedu.*;
server_name ~^.*\.magedu\..*$;
mail.magedu.com, www.magedu.com
4、tcp_nodelay on|off;
对keepalived模式下的连接是否启用TCP_NODELAY选项;
5、sendfile on | off;
是否启用sendfile功能;
定义路径相关配置
6、root path;
设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;
可用上下文:http, server, location, if
7、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
根据用户请求的URI来匹配定义的location,匹配到时,此请求将被相应的location块中的指令所处理;
server {
...
location {
}
location {
...
}
}
=:URI精确匹配;
~:做正则表达式模式匹配,区分字符大小写;
~*:做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;
匹配优先级:=、^~、~/~*、不带符号;
8、alias path;
定义路径别名,文档映射的一种机制;仅能用于location上下文;
alias /bbs/ /web/forum/
http://www.magedu.com/bbs/a.jpg
location /bbs/ {
alias /web/forum/;
}
/web/forum/a.jpg
location /bbs/ {
root /web/forum/;
}
/web/forum/bbs/a.jpg
注意:
root指令:给定的路径对应于location中的/uri/左侧的/;
alias指令:给定的路径对应于location中的/uri/右侧的/;
9、index file ...;
可用位置:http, server, location
默认主面;
10、error_page code ... [=[response]] uri;
根据用户请求的资源的http响应的状态码实现错误页重定向;
http://www.magedu.com/hello.html --> 因为资源不存在而被改为对
http://www.magedu.com/404.html
11、
定义客户端请求的相关配置
12、keepalive_timeout timeout [header_timeout];
设定保持连接的超时时长,0表示禁止长连接 ;默认为75s;
13、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100;
14、keepalive_disable none | browser ...;
对哪种浏览器禁用长连接;
15、send_timeout time;
向客户端发送响应报文的超时时长; 特别地,是指两次写操作之间的间隔时长;
16、client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超时此大小时,其将被暂存到磁盘上;
17、client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
/var/tmp/body 2 1 2
00-ff
对客户的请求进行限制的相关配置:
18、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
19、limit_except method ... { ... };
限制对指定的请求方法之外的其它方法的使用客户端;
limit_except GET POST {
allow 172.18.0.0/16;
deny all;
}
表示除了GET和POST之外的其它方法仅允许172.18.0.0/16中的主机使用;
文件操作优化的配置:
20、aio on | off | threads[=pool];
是否启用aio功能;
21、directio size | off;
22、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录的结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的超时时长,在此处指定的时长内未被命中的缓存项即为非活动项;
23、open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息;
24、open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少命中此处指定的次数方可不被归类到非活动项;
25、open_file_cache_valid time;
缓存项有效性的检查频率;默认是60s;
ngx_http_access_module模块:
实现基于ip的访问控制功能;
26、allow address | CIDR | unix: | all;
27、deny address | CIDR | unix: | all;
可用上下文:http, server, location, limit_except
ngx_http_auth_basic_module模块:
28、auth_basic string | off;
使用basic机制进行用户认证;
29、auth_basic_user_file file;
认证用的账号密码文件;
文件格式:
name:password:commet
密码格式:
htpasswd命令;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
ngx_http_stub_status_module模块:
用于输出nginx的基本状态信息;
Active connections: 1
server accepts handled requests
155 155 298
Reading: 0 Writing: 1 Waiting: 0
Active connections: 处于活动状态的客户端连接的数量;
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数;
ngx_http_referer_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.
30、valid_referers none | blocked | server_names | string ...;
定义合法的referer数据;
none:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:其值是主机名;
arbitrary string:直接字符串,可以使用*作为通配符;
regular expression:被指定的正则表达式模式匹配到的字符串;要使用~起始;
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
回顾:
master/worker
nginx.conf:
main block
events {
...
}
http {
...
server {
...
listen
server_name
location [=|^~|~|~*] /uri/ {
root
...
}
...
}
Nginx(3)
ngx_http_ssl_module
ssl on | off;
是否启用当前虚拟主机的ssl功能;
ssl_certificate file;
当前虚拟主机使用的PEM格式的证书文件;
ssl_certificate_key file;
当前虚拟机使用的证书文件中的公钥配对儿的私钥文件路径,PEM格式;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
SSL协议的版本;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
指明ssl会话的缓存机制;
builtin:使用openssl内建的缓存机制,此为各worker独有;
shared:由各worker共享的缓存;
name:缓存空间的名称;
size:字节为单位的缓存空间的大小;每1MB内存空间可缓存4000个会话;
ssl_session_timeout time;
ssl会话超时时长,指ssl session cache中缓存条目有效时长;
ngx_http_log_module
The ngx_http_log_module module writes request logs in the specified format.
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
access_log off;
log_format name string ...;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
max:最大缓存条目;
inactive=time:非活动时长;
min_uses:最少使用次数;
valid:验正缓存条目有效性的频率;
ngx_http_rewrite_module
rewrite regex replacement [flag];
把用户请求的URI基于regex做检查,匹配到时将替换为replacement指定的字符串;
在同一个location中存在的多个rewrite规则会自上而下逐个被检查(循环);可以使用flag控制此循环功能;
如果replacement是以http://或https://开头,则替换结果会直接以重定向方式返回给客户端;
[flag]:
last:重写完成后停止对当前uri在当前location中的后续其它重写操作,改为对新uri的新一轮处理;
break:重写完成后停止对当前uri在当前location中的后续其它重写操作;
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(302)
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(301)
rewrite_log on | off;
是否启用重写日志;启用时,日志信息被发往错误日志;
if (condition) { ... }:
条件判断机制,在条件满足时,执行配置块中的配置;
引入了一个新的配置上下文;
condition:
比较表达式:
==, !=
~:模式匹配,区分字母大小写;
~*:模式匹配,不区分字符大小写;
!~:模式不匹配,区分字母大小写;
!~*:模式不匹配,不区分字母大小写;
文件及目录存在性判断:
-f, !-f:文件
-d, !-d:目录
-e, !-e:存在
-x, !-x:执行
return:
return code [text];
return code URL;
return URL;
set $variable value;
用户自定义变量;
ngx_http_gzip_module
过滤器,对指定类型的资源压缩传输以节约带宽;
gzip on | off;
启用或禁用gzip压缩响应报文;
gzip_comp_level level;
指定压缩比,1-9,默认为1;
gzip_disable regex ...;
regex是匹配客户端浏览器类型的模式,表示对所有匹配到的浏览器不执行压缩响应;
gzip_min_length length;
触发启用压缩功能的响应报文的最小长度;
gzip_http_version 1.0 | 1.1;
设定启用压缩响应功能时,协议的最小版本;
gzip_types mime-type ...;
指定仅执行压缩的资源内容类型;默认为text/html;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
对代理的请求基于何种属性判断其是否应该启用压缩功能;
示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
ngx_http_fastcgi_module
LAMP:
httpd+php:
modules
cgi
fastcgi
proxy_fastcgi_module
LNMP:
nginx+php:
fastcgi
php:编译时,支持fpm;
./configure ... --enable-fpm ...
php-fpm工作方式(类似于httpd的prefork):
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic | static
pm.start_servers:启动fpm进程时启动的工作进程数量;
pm.min_spare_servers:最少空闲进程数;
pm.max_spare_servers:最大空闲进程数;
pm.max_children:最大工作进程数;
user = USERNAME
group = GROUPNAME
fastcgi模块指令:
fastcgi_pass address;
address是fpm服务器监听的地址和端口;
示例: fastcgi 127.0.0.1:9000;
fastcgi_index name;
fastcgi应用的主页名称;
fastcgi_param parameter value [if_not_empty];
传递给fpm服务器的参数及其值;
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=#[:#[:#]]:缓存目录层级定义;
levels=1:2
keys_zone=name:size
内存中用于缓存k/v映射关系的空间名称及大小;
inactive=time
注意:只能定义在http上下文 ;
fastcgi_cache zone | off;
是否启用cache,如果启用,数据缓存于哪个cache中;
fastcgi_cache_key string;
定义要使用的缓存键;
例如: fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST ...;
缓存哪些类型的请求的相关数据;
fastcgi_cache_min_uses number;
fastcgi_cache_valid [code ...] time;
对不同响应码设定其可缓存时长;
注意:调用缓存时,至少应该 指定三个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
Nginx(5)
ngx_http_proxy_module
(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;
}
http://www.magedu.com/bbs/ --> http://172.16.100.7/bbs/
http://www.magedu.com/bbs/ --> http://172.16.100.7/
(2) proxy_set_header
proxy_set_header field value;
设定向后端主机发送的请求报文的首部及其值;
示例:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwared_for;
缓存相关的选项(缓存要先定义,后调用)
(3) proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] ;
用于http上下文 ;
(4) proxy_cache zone | off;
调用缓存,默认为off;
(5) proxy_cache_key string;
定义缓存键;
proxy_cache_key $request_uri
proxy_cache_key $scheme$proxy_host$request_uri
(6) proxy_cache_valid [code ...] time;
为不同的响应码设定其缓存的时长;
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
(7) proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
Determines in which cases a stale cached response can be used when an error occurs during communication with the proxied server.
回顾:
nginx:proxy
正向代理
反向代理
ngx_http_proxy_module:
proxy_pass
proxy_set_header
proxy_cache_path (http)
proxy_cache
proxy_cache_key
proxy_cache_valid
proxy_cache_use_stale
Nginx(6)
ngx_http_proxy_module模块
跟连接相关的指令
(8) proxy_connect_timeout time;
与后端服务器建立连接的超时时长,默认为60s,最长为75s;
(9) proxy_read_timeout time;
等待后端主机发送响应报文的超时时长,默认为60s;
(10) proxy_send_timeout time;
向后端服务发送请求报文的超时时长,默认为60s;
ngx_http_headers_module
用于在响应给客户端的报文中添加首部;
(1) add_header name value [always];
向响应报文添加自定义首部,并赋值;
http, server, location, if in location
add_header X-Via $server_addr;
(2) expires [modified] time;
expires epoch | max | off;
用于添加Expire及Cache-Control首部或修改首部的值;
ngx_http_upstream_module
将多个后端主机定义为服务器组,而后可由proxy_pass, fastcgi_pass, memcached_pass等进行引用;
(1) upstream name { ... }
定义后端服务器组;引入新的上下文;只能用于http上下文;
name:名称,直接字符串;
(2) server
server address [parameters];
定义服务器的地址和相关的参数;
地址格式:
IP[:port]
HOSTNAME[:port]
unix:/PATH/TO/SOME_SOCK_FILE
参数:
weight=number:服务器权重;
max_fails=number:最大失败尝试次数;
fail_timeout=time:设置服务器不可用超时时长;
backup:备用主机;
down:手动标记其不再处理任何用户请求;
(3) ip_hash
源地址哈希调度算法;
(4) least_conn
最少连接调度算法;
(5) health_check [parameters];
定义后端主机的健康状态检测机制;只能用于location上下文;
可用参数:
interval=#:检测的频度,默认为5秒;
fails=number:判定为失败的检测次数;
passes=number:判定为成功的检测次数;
uri=uri:执行健康状态检测时请求的uri;
match=name:基于哪个match做检测结果为“成功”或“失败”的判定;
port=number:向服务器的哪个端口发起健康状态检测请求;
(6) 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"
(7) hash key [consistent];
定义调度方法,可自定义基于何种信息(key)进行绑定;
hash $remote_addr
hash $request_uri
hash $cookie_username
补充:内置变量的调用,向客户端展示缓存命令与否:
add_header X-Cache $upstream_cache_status;
课外作业:尝试使用tengine实现此前的讲到的所有内容;
博客作业:nginx的所有内容,重点实现:
url rewrite, gzip, https, upstream, fastcgi
memcached:
数据结构模型:
结构化数据:关系型数据库;
半结构化数据:xml, json, ... (NoSQL);
非结构化数据:文件系统;
k/v:
memcached:存储于内存中;
redis:存储于内存中,周期性地将数据同于辅存上;
memcached:
LiveJournal旗下的Danga Interactive
特性:
k/v缓存:可序列化数据;存储项:key, value, flag, expire time;
功能的实现一半依赖于服务端,一半依赖客户端;
分布式缓存:互不通信的分布式集群;
O(1)的执行效率;
清理过期数据:LRU
缓存项过期
缓存空间用尽
缓存系统的种类:
代理式缓存;
旁路式缓存;
分布式系统主机路由:
取模法
一致性hash;
memcached:
11211/tcp, 11211/udp
主程序:memcached
环境配置文件:/etc/sysconfig/memcached
协议格式
文本协议
二进制协议
命令:
统计类:stats,stats items, stats slabs, stats sizes
存储类:set, add, replace, append, prepend
获取数据类:get, delete, incr/decr
清空:flush_all
memcached程序的常用选项:
-l <ip_addr>: 监听的地址;
-m <num>:缓存空间大小,单位为MB;默认为64;
-c <num>:最大并发连接数,默认为1024;
-p <num>:Listen on TCP port <num>, the default is port 11211.
-U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.
-M:缓存空间耗尽时,向请求者返回错误信息,而不是基于LRU算法进行缓存清理;
-f <factor>:growth factor,增长因子;
-t <threads>:处理用于请求的线程数;
memcached默认没有认证机制,但可借助于SASL进行认证;
php连接memcached服务的模块:
memcache:php-pecl-memcache
memcached:php-pecl-memcached
可提供工具程序的程序包:libmemcached;
LB Cluster保持会话的方法:
session sticky
session cluster
session server
博客作业:
nginx负载均衡用户请求至后端多个ammp主机,php的会话保存于memcached中;
===========================================
Nginx官网:http://nginx.org/
Nginx官网下载地址(选择 Stable version 稳定版):http://nginx.org/en/download.html
官网安装介绍:http://nginx.org/en/linux_packages.html
一:安装
nginx 显示目录
http {
autoindex on; # 自动显示目录
autoindex_exact_size off; # 人性化方式显示文件大小否则以byte显示
autoindex_localtime on; # 按服务器时间显示,否则以gmt时间显示
}
二:配置
2.1:
2.2:
配置:
配置文件 的组成部分:
主配置文件:nginx.conf
include conf.d/*.conf
facscgi, scgi, uwscgi的相关配置
mime.types
配置指令(必须以分号结尾):
directive value1 [value2...];
支持使用变量:
内置变量:由模块引入,可直接引用;
自定义变量:set variable_name value;
引用变量:$variable_name
配置文件结构:
main block:全局配置;
event {
...
}:事件驱动的相关配置;
http {
...
}:http协议的相关配置
mail {
...
}:mail相关的配置;
http相关的配置:
http {
...
...
server {
...
server_name
root
alias
location /uri/ {
...
}
...
}
server {
...
...
}
}
main block:
配置指令的类别:
正常运行必备的配置;
优化性能的配置;
用于调试、定位问题的配置;
正常运行必备的配置:
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进程所能够打开的最大文件数;
性能优化相关的配置:
1、 worker_processes number | auto;
worker的进程数;通常应该为CPU的核心数减1;
2、worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
CPUMASK:
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
...
3、worker_priority nice;
[-20,19]
100-139
调试、定位问题:
1、daemon on | off;
是否以守护进程方式启动nginx进程;
2、master_process on | off;
是否以master/worker模型启动nignx进程;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
错误日志文件的记录方式,及其日志级别:
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:发送到错误输出;
syslog:server=address[,parameter=value]:发送给syslog服务器;
memory:size
日志级别:
debug依赖于configure时的--with-debug选项;
回顾:IO模型、nginx
IO模型:
阻塞式
非阻塞式
IO复用(select, poll)
信号驱动的IO(epoll, kqueue, /dev/poll)
AIO
阶段:等待数据准备完成,复制数据(从内核缓冲区到进程的地址空间)
nginx:master/worker
master
worker()
cache loader
cache manager
模块类别:核心模块、标准模块(http标准模块,http可选模块,mail模块)、3rd模块
nginx.conf
main block
event {
...
}
http {
...
server {
...
server_name
root
location /uri/ {
...
}
}
server {
...
}
}
Nginx(2)
nginx.conf:
main block
events {
...
}
1、worker_connections number;
每个worker进程所能够并发打开的最大连接数;
worker_processes * worker_connections
2、use method;
指明并发连接请求处理时使用的方法;
use epoll;
3、accept_mutex on | off;
启用时,表示用于让多个worker轮流地、序列化地响应新请求;
http {
...
}
定义套接字相关功能
1、server { ... }
配置一个虚拟主机;
server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
...
}
注意:
(1) 基于port的虚拟主机:
listen指令要使用不同的端口;
(2) 基于Hostname的虚拟主机;
server_name指令指向不同的主机名;
(3) 基于ip的虚拟主机:
listen IP:PORT;
2、listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl] ;
default_server:默认虚拟主机;
ssl:限制只能通过ssl连接提供服务;
backlog:后缓队列的长度;
rcvbuf:接收缓冲大小;
sndbuf:发送缓冲区大小;
3、server_name name ...;
指明当前server的主机名;后可跟一个或空白字符分隔的多个主机;
支持使用*任意长度的任意字符;
支持~起始的正则表达式模式字符串;
应用策略:
(1) 首先精确匹配;
(2) 左则*通配符匹配;
(3) 右侧*通配符匹配;
(4) 正则表达式模式匹配;
server_name www.magedu.com;
server_name *.magedu.com;
server_name www.magedu.*;
server_name ~^.*\.magedu\..*$;
mail.magedu.com, www.magedu.com
4、tcp_nodelay on|off;
对keepalived模式下的连接是否启用TCP_NODELAY选项;
5、sendfile on | off;
是否启用sendfile功能;
定义路径相关配置
6、root path;
设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;
可用上下文:http, server, location, if
7、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
根据用户请求的URI来匹配定义的location,匹配到时,此请求将被相应的location块中的指令所处理;
server {
...
location {
}
location {
...
}
}
=:URI精确匹配;
~:做正则表达式模式匹配,区分字符大小写;
~*:做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;
匹配优先级:=、^~、~/~*、不带符号;
8、alias path;
定义路径别名,文档映射的一种机制;仅能用于location上下文;
alias /bbs/ /web/forum/
http://www.magedu.com/bbs/a.jpg
location /bbs/ {
alias /web/forum/;
}
/web/forum/a.jpg
location /bbs/ {
root /web/forum/;
}
/web/forum/bbs/a.jpg
注意:
root指令:给定的路径对应于location中的/uri/左侧的/;
alias指令:给定的路径对应于location中的/uri/右侧的/;
9、index file ...;
可用位置:http, server, location
默认主面;
10、error_page code ... [=[response]] uri;
根据用户请求的资源的http响应的状态码实现错误页重定向;
http://www.magedu.com/hello.html --> 因为资源不存在而被改为对
http://www.magedu.com/404.html
11、
定义客户端请求的相关配置
12、keepalive_timeout timeout [header_timeout];
设定保持连接的超时时长,0表示禁止长连接 ;默认为75s;
13、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100;
14、keepalive_disable none | browser ...;
对哪种浏览器禁用长连接;
15、send_timeout time;
向客户端发送响应报文的超时时长; 特别地,是指两次写操作之间的间隔时长;
16、client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超时此大小时,其将被暂存到磁盘上;
17、client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
/var/tmp/body 2 1 2
00-ff
对客户的请求进行限制的相关配置:
18、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
19、limit_except method ... { ... };
限制对指定的请求方法之外的其它方法的使用客户端;
limit_except GET POST {
allow 172.18.0.0/16;
deny all;
}
表示除了GET和POST之外的其它方法仅允许172.18.0.0/16中的主机使用;
文件操作优化的配置:
20、aio on | off | threads[=pool];
是否启用aio功能;
21、directio size | off;
22、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录的结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的超时时长,在此处指定的时长内未被命中的缓存项即为非活动项;
23、open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息;
24、open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少命中此处指定的次数方可不被归类到非活动项;
25、open_file_cache_valid time;
缓存项有效性的检查频率;默认是60s;
ngx_http_access_module模块:
实现基于ip的访问控制功能;
26、allow address | CIDR | unix: | all;
27、deny address | CIDR | unix: | all;
可用上下文:http, server, location, limit_except
ngx_http_auth_basic_module模块:
28、auth_basic string | off;
使用basic机制进行用户认证;
29、auth_basic_user_file file;
认证用的账号密码文件;
文件格式:
name:password:commet
密码格式:
htpasswd命令;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
ngx_http_stub_status_module模块:
用于输出nginx的基本状态信息;
Active connections: 1
server accepts handled requests
155 155 298
Reading: 0 Writing: 1 Waiting: 0
Active connections: 处于活动状态的客户端连接的数量;
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数;
ngx_http_referer_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.
30、valid_referers none | blocked | server_names | string ...;
定义合法的referer数据;
none:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:其值是主机名;
arbitrary string:直接字符串,可以使用*作为通配符;
regular expression:被指定的正则表达式模式匹配到的字符串;要使用~起始;
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
回顾:
master/worker
nginx.conf:
main block
events {
...
}
http {
...
server {
...
listen
server_name
location [=|^~|~|~*] /uri/ {
root
...
}
...
}
Nginx(3)
ngx_http_ssl_module
ssl on | off;
是否启用当前虚拟主机的ssl功能;
ssl_certificate file;
当前虚拟主机使用的PEM格式的证书文件;
ssl_certificate_key file;
当前虚拟机使用的证书文件中的公钥配对儿的私钥文件路径,PEM格式;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
SSL协议的版本;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
指明ssl会话的缓存机制;
builtin:使用openssl内建的缓存机制,此为各worker独有;
shared:由各worker共享的缓存;
name:缓存空间的名称;
size:字节为单位的缓存空间的大小;每1MB内存空间可缓存4000个会话;
ssl_session_timeout time;
ssl会话超时时长,指ssl session cache中缓存条目有效时长;
ngx_http_log_module
The ngx_http_log_module module writes request logs in the specified format.
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
access_log off;
log_format name string ...;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
max:最大缓存条目;
inactive=time:非活动时长;
min_uses:最少使用次数;
valid:验正缓存条目有效性的频率;
ngx_http_rewrite_module
rewrite regex replacement [flag];
把用户请求的URI基于regex做检查,匹配到时将替换为replacement指定的字符串;
在同一个location中存在的多个rewrite规则会自上而下逐个被检查(循环);可以使用flag控制此循环功能;
如果replacement是以http://或https://开头,则替换结果会直接以重定向方式返回给客户端;
[flag]:
last:重写完成后停止对当前uri在当前location中的后续其它重写操作,改为对新uri的新一轮处理;
break:重写完成后停止对当前uri在当前location中的后续其它重写操作;
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(302)
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(301)
rewrite_log on | off;
是否启用重写日志;启用时,日志信息被发往错误日志;
if (condition) { ... }:
条件判断机制,在条件满足时,执行配置块中的配置;
引入了一个新的配置上下文;
condition:
比较表达式:
==, !=
~:模式匹配,区分字母大小写;
~*:模式匹配,不区分字符大小写;
!~:模式不匹配,区分字母大小写;
!~*:模式不匹配,不区分字母大小写;
文件及目录存在性判断:
-f, !-f:文件
-d, !-d:目录
-e, !-e:存在
-x, !-x:执行
return:
return code [text];
return code URL;
return URL;
set $variable value;
用户自定义变量;
ngx_http_gzip_module
过滤器,对指定类型的资源压缩传输以节约带宽;
gzip on | off;
启用或禁用gzip压缩响应报文;
gzip_comp_level level;
指定压缩比,1-9,默认为1;
gzip_disable regex ...;
regex是匹配客户端浏览器类型的模式,表示对所有匹配到的浏览器不执行压缩响应;
gzip_min_length length;
触发启用压缩功能的响应报文的最小长度;
gzip_http_version 1.0 | 1.1;
设定启用压缩响应功能时,协议的最小版本;
gzip_types mime-type ...;
指定仅执行压缩的资源内容类型;默认为text/html;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
对代理的请求基于何种属性判断其是否应该启用压缩功能;
示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
ngx_http_fastcgi_module
LAMP:
httpd+php:
modules
cgi
fastcgi
proxy_fastcgi_module
LNMP:
nginx+php:
fastcgi
php:编译时,支持fpm;
./configure ... --enable-fpm ...
php-fpm工作方式(类似于httpd的prefork):
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic | static
pm.start_servers:启动fpm进程时启动的工作进程数量;
pm.min_spare_servers:最少空闲进程数;
pm.max_spare_servers:最大空闲进程数;
pm.max_children:最大工作进程数;
user = USERNAME
group = GROUPNAME
fastcgi模块指令:
fastcgi_pass address;
address是fpm服务器监听的地址和端口;
示例: fastcgi 127.0.0.1:9000;
fastcgi_index name;
fastcgi应用的主页名称;
fastcgi_param parameter value [if_not_empty];
传递给fpm服务器的参数及其值;
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=#[:#[:#]]:缓存目录层级定义;
levels=1:2
keys_zone=name:size
内存中用于缓存k/v映射关系的空间名称及大小;
inactive=time
注意:只能定义在http上下文 ;
fastcgi_cache zone | off;
是否启用cache,如果启用,数据缓存于哪个cache中;
fastcgi_cache_key string;
定义要使用的缓存键;
例如: fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST ...;
缓存哪些类型的请求的相关数据;
fastcgi_cache_min_uses number;
fastcgi_cache_valid [code ...] time;
对不同响应码设定其可缓存时长;
注意:调用缓存时,至少应该 指定三个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
Nginx:
web服务器:http协议;
http协议:html,MIME(多用途互联网邮件扩展)
major/minor:
text/html, text/plain, image/jpeg, ...
web资源:URL (scheme://server:port/path/to/source)
方法:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,...
WEBDAV
http事务:request <--> response
request:
<method> <URL> <version>
<HEADERS>
...
<body>
response:
<version> <status> <reason phrase>
<HEADERS>
...
<body>
status:
1xx:信息类
2xx:成功类,200
3xx:重定向,301, 302, 304
4xx:错误类,客户端错误,404,403
5xx:错误类,服务器端错误,502
认证:basic, digest
httpd:MPM
prefork, worker, event
I/O模型:
同步/异步:
关注的是消息通知机制
同步:synchronous,
异步:asynchronous,
消息通知:
同步:等待对方返回消息;
异步:被调用者通过状态、通知或回调通知调用者
状态:调用者每隔一段时间就需要检查一次;
通知:
回调:
阻塞/非阻塞
关注调用者等等结果返回之前所处的状态;
阻塞:block,调用结果返回之前,调用者会被挂起;
非阻塞:nonblock,调用结果返回之前,调用者不会被挂起;
I/O:
网络IO:本质是socket读取;
磁盘IO:流;
每次IO,都会经由两个阶段:
第一步:数据先加载至内核内存空间(缓冲区);
第二步:数据从内核缓冲区复制到用户空间的进程的内存中去;
等待数据准备完成;
数据内核复制到进程;
I/O模型:
同步阻塞:
同步非阻塞:
IO multipexing:select, poll
Signal Driven IO:
Asynchronous IO:
Nginx:
C10k, http://nginx.org/
engin X: nginx
二次开发版:tengine, openresty
Nginx的特性:
模块化设计,较好的扩展性;
高可靠性
master/worker
支持热部署
不停机更新配置文件、更换日志文件、更新服务器程序版本;
低内存消耗
10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存;
event-driven, aio, mmap
基本功能:
静态资源的web服务器;
http协议反向代理服务器;
pop3/imap4协议反射代理服务器;
FastCGI(lnmp), uWSGI等协议;
模块化(非DSO),著名有zip, SSL, ...;
web服务器相关的功能:
虚拟主机、keepalive、访问日志、url rewrite、路径别名、基于ip及用户的访问控制、支付速率限制及并发数限制,...;
Nginx的程序架构:
master/worker
一个master进程,可生成一个或多个worker进程;
master:加载配置文件、管理worker进程、平滑升级、...
worker:http服务、http代理、fastcgi代理、...
模块类型:
核心模块: core module
标准模块:
Standard HTTP modules
Optional HTTP modules
Mail modules
3rd party modules:
nginx用来做什么?
静态资源的web服务器
http协议反向代理
nginx的安装:
# yum -y install pcre-devel openssl-devel zlib-devel
# ./configure \
--prefix=/usr/local
--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/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_realip_module
--with-http_addition_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_stub_status_module
--with-http_auth_request_module
--with-threads
--with-stream
--with-stream_ssl_module
--with-http_slice_module
--with-file-aio
--with-http_v2_module
# make && make install
配置:
配置文件 的组成部分:
主配置文件:nginx.conf
include conf.d/*.conf
facscgi, scgi, uwscgi的相关配置
mime.types
配置指令(必须以分号结尾):
directive value1 [value2...];
支持使用变量:
内置变量:由模块引入,可直接引用;
自定义变量:set variable_name value;
引用变量:$variable_name
配置文件结构:
main block:全局配置;
event {
...
}:事件驱动的相关配置;
http {
...
}:http协议的相关配置
mail {
...
}:mail相关的配置;
http相关的配置:
http {
...
...
server {
...
server_name
root
alias
location /uri/ {
...
}
...
}
server {
...
...
}
}
main block:
配置指令的类别:
正常运行必备的配置;
优化性能的配置;
用于调试、定位问题的配置;
正常运行必备的配置:
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进程所能够打开的最大文件数;
性能优化相关的配置:
1、 worker_processes number | auto;
worker的进程数;通常应该为CPU的核心数减1;
2、worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
CPUMASK:
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
...
3、worker_priority nice;
[-20,19]
100-139
调试、定位问题:
1、daemon on | off;
是否以守护进程方式启动nginx进程;
2、master_process on | off;
是否以master/worker模型启动nignx进程;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
错误日志文件的记录方式,及其日志级别:
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:发送到错误输出;
syslog:server=address[,parameter=value]:发送给syslog服务器;
memory:size
日志级别:
debug依赖于configure时的--with-debug选项;
回顾:IO模型、nginx
IO模型:
阻塞式
非阻塞式
IO复用(select, poll)
信号驱动的IO(epoll, kqueue, /dev/poll)
AIO
阶段:等待数据准备完成,复制数据(从内核缓冲区到进程的地址空间)
nginx:master/worker
master
worker()
cache loader
cache manager
模块类别:核心模块、标准模块(http标准模块,http可选模块,mail模块)、3rd模块
nginx.conf
main block
event {
...
}
http {
...
server {
...
server_name
root
location /uri/ {
...
}
}
server {
...
}
}
Nginx(2)
nginx.conf:
main block
events {
...
}
1、worker_connections number;
每个worker进程所能够并发打开的最大连接数;
worker_processes * worker_connections
2、use method;
指明并发连接请求处理时使用的方法;
use epoll;
3、accept_mutex on | off;
启用时,表示用于让多个worker轮流地、序列化地响应新请求;
http {
...
}
定义套接字相关功能
1、server { ... }
配置一个虚拟主机;
server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
...
}
注意:
(1) 基于port的虚拟主机:
listen指令要使用不同的端口;
(2) 基于Hostname的虚拟主机;
server_name指令指向不同的主机名;
(3) 基于ip的虚拟主机:
listen IP:PORT;
2、listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl] ;
default_server:默认虚拟主机;
ssl:限制只能通过ssl连接提供服务;
backlog:后缓队列的长度;
rcvbuf:接收缓冲大小;
sndbuf:发送缓冲区大小;
3、server_name name ...;
指明当前server的主机名;后可跟一个或空白字符分隔的多个主机;
支持使用*任意长度的任意字符;
支持~起始的正则表达式模式字符串;
应用策略:
(1) 首先精确匹配;
(2) 左则*通配符匹配;
(3) 右侧*通配符匹配;
(4) 正则表达式模式匹配;
server_name www.magedu.com;
server_name *.magedu.com;
server_name www.magedu.*;
server_name ~^.*\.magedu\..*$;
mail.magedu.com, www.magedu.com
4、tcp_nodelay on|off;
对keepalived模式下的连接是否启用TCP_NODELAY选项;
5、sendfile on | off;
是否启用sendfile功能;
定义路径相关配置
6、root path;
设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;
可用上下文:http, server, location, if
7、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
根据用户请求的URI来匹配定义的location,匹配到时,此请求将被相应的location块中的指令所处理;
server {
...
location {
}
location {
...
}
}
=:URI精确匹配;
~:做正则表达式模式匹配,区分字符大小写;
~*:做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;
匹配优先级:=、^~、~/~*、不带符号;
8、alias path;
定义路径别名,文档映射的一种机制;仅能用于location上下文;
alias /bbs/ /web/forum/
http://www.magedu.com/bbs/a.jpg
location /bbs/ {
alias /web/forum/;
}
/web/forum/a.jpg
location /bbs/ {
root /web/forum/;
}
/web/forum/bbs/a.jpg
注意:
root指令:给定的路径对应于location中的/uri/左侧的/;
alias指令:给定的路径对应于location中的/uri/右侧的/;
9、index file ...;
可用位置:http, server, location
默认主面;
10、error_page code ... [=[response]] uri;
根据用户请求的资源的http响应的状态码实现错误页重定向;
http://www.magedu.com/hello.html --> 因为资源不存在而被改为对
http://www.magedu.com/404.html
11、
定义客户端请求的相关配置
12、keepalive_timeout timeout [header_timeout];
设定保持连接的超时时长,0表示禁止长连接 ;默认为75s;
13、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100;
14、keepalive_disable none | browser ...;
对哪种浏览器禁用长连接;
15、send_timeout time;
向客户端发送响应报文的超时时长; 特别地,是指两次写操作之间的间隔时长;
16、client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超时此大小时,其将被暂存到磁盘上;
17、client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
/var/tmp/body 2 1 2
00-ff
对客户的请求进行限制的相关配置:
18、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
19、limit_except method ... { ... };
限制对指定的请求方法之外的其它方法的使用客户端;
limit_except GET POST {
allow 172.18.0.0/16;
deny all;
}
表示除了GET和POST之外的其它方法仅允许172.18.0.0/16中的主机使用;
文件操作优化的配置:
20、aio on | off | threads[=pool];
是否启用aio功能;
21、directio size | off;
22、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录的结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的超时时长,在此处指定的时长内未被命中的缓存项即为非活动项;
23、open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息;
24、open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少命中此处指定的次数方可不被归类到非活动项;
25、open_file_cache_valid time;
缓存项有效性的检查频率;默认是60s;
ngx_http_access_module模块:
实现基于ip的访问控制功能;
26、allow address | CIDR | unix: | all;
27、deny address | CIDR | unix: | all;
可用上下文:http, server, location, limit_except
ngx_http_auth_basic_module模块:
28、auth_basic string | off;
使用basic机制进行用户认证;
29、auth_basic_user_file file;
认证用的账号密码文件;
文件格式:
name:password:commet
密码格式:
htpasswd命令;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
ngx_http_stub_status_module模块:
用于输出nginx的基本状态信息;
Active connections: 1
server accepts handled requests
155 155 298
Reading: 0 Writing: 1 Waiting: 0
Active connections: 处于活动状态的客户端连接的数量;
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数;
ngx_http_referer_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.
30、valid_referers none | blocked | server_names | string ...;
定义合法的referer数据;
none:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:其值是主机名;
arbitrary string:直接字符串,可以使用*作为通配符;
regular expression:被指定的正则表达式模式匹配到的字符串;要使用~起始;
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
回顾:
master/worker
nginx.conf:
main block
events {
...
}
http {
...
server {
...
listen
server_name
location [=|^~|~|~*] /uri/ {
root
...
}
...
}
Nginx(3)
ngx_http_ssl_module
ssl on | off;
是否启用当前虚拟主机的ssl功能;
ssl_certificate file;
当前虚拟主机使用的PEM格式的证书文件;
ssl_certificate_key file;
当前虚拟机使用的证书文件中的公钥配对儿的私钥文件路径,PEM格式;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
SSL协议的版本;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
指明ssl会话的缓存机制;
builtin:使用openssl内建的缓存机制,此为各worker独有;
shared:由各worker共享的缓存;
name:缓存空间的名称;
size:字节为单位的缓存空间的大小;每1MB内存空间可缓存4000个会话;
ssl_session_timeout time;
ssl会话超时时长,指ssl session cache中缓存条目有效时长;
ngx_http_log_module
The ngx_http_log_module module writes request logs in the specified format.
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
access_log off;
log_format name string ...;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
max:最大缓存条目;
inactive=time:非活动时长;
min_uses:最少使用次数;
valid:验正缓存条目有效性的频率;
ngx_http_rewrite_module
rewrite regex replacement [flag];
把用户请求的URI基于regex做检查,匹配到时将替换为replacement指定的字符串;
在同一个location中存在的多个rewrite规则会自上而下逐个被检查(循环);可以使用flag控制此循环功能;
如果replacement是以http://或https://开头,则替换结果会直接以重定向方式返回给客户端;
[flag]:
last:重写完成后停止对当前uri在当前location中的后续其它重写操作,改为对新uri的新一轮处理;
break:重写完成后停止对当前uri在当前location中的后续其它重写操作;
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(302)
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(301)
rewrite_log on | off;
是否启用重写日志;启用时,日志信息被发往错误日志;
if (condition) { ... }:
条件判断机制,在条件满足时,执行配置块中的配置;
引入了一个新的配置上下文;
condition:
比较表达式:
==, !=
~:模式匹配,区分字母大小写;
~*:模式匹配,不区分字符大小写;
!~:模式不匹配,区分字母大小写;
!~*:模式不匹配,不区分字母大小写;
文件及目录存在性判断:
-f, !-f:文件
-d, !-d:目录
-e, !-e:存在
-x, !-x:执行
return:
return code [text];
return code URL;
return URL;
set $variable value;
用户自定义变量;
ngx_http_gzip_module
过滤器,对指定类型的资源压缩传输以节约带宽;
gzip on | off;
启用或禁用gzip压缩响应报文;
gzip_comp_level level;
指定压缩比,1-9,默认为1;
gzip_disable regex ...;
regex是匹配客户端浏览器类型的模式,表示对所有匹配到的浏览器不执行压缩响应;
gzip_min_length length;
触发启用压缩功能的响应报文的最小长度;
gzip_http_version 1.0 | 1.1;
设定启用压缩响应功能时,协议的最小版本;
gzip_types mime-type ...;
指定仅执行压缩的资源内容类型;默认为text/html;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
对代理的请求基于何种属性判断其是否应该启用压缩功能;
示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
ngx_http_fastcgi_module
LAMP:
httpd+php:
modules
cgi
fastcgi
proxy_fastcgi_module
LNMP:
nginx+php:
fastcgi
php:编译时,支持fpm;
./configure ... --enable-fpm ...
php-fpm工作方式(类似于httpd的prefork):
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic | static
pm.start_servers:启动fpm进程时启动的工作进程数量;
pm.min_spare_servers:最少空闲进程数;
pm.max_spare_servers:最大空闲进程数;
pm.max_children:最大工作进程数;
user = USERNAME
group = GROUPNAME
fastcgi模块指令:
fastcgi_pass address;
address是fpm服务器监听的地址和端口;
示例: fastcgi 127.0.0.1:9000;
fastcgi_index name;
fastcgi应用的主页名称;
fastcgi_param parameter value [if_not_empty];
传递给fpm服务器的参数及其值;
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=#[:#[:#]]:缓存目录层级定义;
levels=1:2
keys_zone=name:size
内存中用于缓存k/v映射关系的空间名称及大小;
inactive=time
注意:只能定义在http上下文 ;
fastcgi_cache zone | off;
是否启用cache,如果启用,数据缓存于哪个cache中;
fastcgi_cache_key string;
定义要使用的缓存键;
例如: fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST ...;
缓存哪些类型的请求的相关数据;
fastcgi_cache_min_uses number;
fastcgi_cache_valid [code ...] time;
对不同响应码设定其可缓存时长;
注意:调用缓存时,至少应该 指定三个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
Nginx(5)
ngx_http_proxy_module
(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;
}
http://www.magedu.com/bbs/ --> http://172.16.100.7/bbs/
http://www.magedu.com/bbs/ --> http://172.16.100.7/
(2) proxy_set_header
proxy_set_header field value;
设定向后端主机发送的请求报文的首部及其值;
示例:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwared_for;
缓存相关的选项(缓存要先定义,后调用)
(3) proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] ;
用于http上下文 ;
(4) proxy_cache zone | off;
调用缓存,默认为off;
(5) proxy_cache_key string;
定义缓存键;
proxy_cache_key $request_uri
proxy_cache_key $scheme$proxy_host$request_uri
(6) proxy_cache_valid [code ...] time;
为不同的响应码设定其缓存的时长;
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
(7) proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
Determines in which cases a stale cached response can be used when an error occurs during communication with the proxied server.
回顾:
nginx:proxy
正向代理
反向代理
ngx_http_proxy_module:
proxy_pass
proxy_set_header
proxy_cache_path (http)
proxy_cache
proxy_cache_key
proxy_cache_valid
proxy_cache_use_stale
Nginx(6)
ngx_http_proxy_module模块
跟连接相关的指令
(8) proxy_connect_timeout time;
与后端服务器建立连接的超时时长,默认为60s,最长为75s;
(9) proxy_read_timeout time;
等待后端主机发送响应报文的超时时长,默认为60s;
(10) proxy_send_timeout time;
向后端服务发送请求报文的超时时长,默认为60s;
ngx_http_headers_module
用于在响应给客户端的报文中添加首部;
(1) add_header name value [always];
向响应报文添加自定义首部,并赋值;
http, server, location, if in location
add_header X-Via $server_addr;
(2) expires [modified] time;
expires epoch | max | off;
用于添加Expire及Cache-Control首部或修改首部的值;
ngx_http_upstream_module
将多个后端主机定义为服务器组,而后可由proxy_pass, fastcgi_pass, memcached_pass等进行引用;
(1) upstream name { ... }
定义后端服务器组;引入新的上下文;只能用于http上下文;
name:名称,直接字符串;
(2) server
server address [parameters];
定义服务器的地址和相关的参数;
地址格式:
IP[:port]
HOSTNAME[:port]
unix:/PATH/TO/SOME_SOCK_FILE
参数:
weight=number:服务器权重;
max_fails=number:最大失败尝试次数;
fail_timeout=time:设置服务器不可用超时时长;
backup:备用主机;
down:手动标记其不再处理任何用户请求;
(3) ip_hash
源地址哈希调度算法;
(4) least_conn
最少连接调度算法;
(5) health_check [parameters];
定义后端主机的健康状态检测机制;只能用于location上下文;
可用参数:
interval=#:检测的频度,默认为5秒;
fails=number:判定为失败的检测次数;
passes=number:判定为成功的检测次数;
uri=uri:执行健康状态检测时请求的uri;
match=name:基于哪个match做检测结果为“成功”或“失败”的判定;
port=number:向服务器的哪个端口发起健康状态检测请求;
(6) 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"
(7) hash key [consistent];
定义调度方法,可自定义基于何种信息(key)进行绑定;
hash $remote_addr
hash $request_uri
hash $cookie_username
补充:内置变量的调用,向客户端展示缓存命令与否:
add_header X-Cache $upstream_cache_status;
课外作业:尝试使用tengine实现此前的讲到的所有内容;
博客作业:nginx的所有内容,重点实现:
url rewrite, gzip, https, upstream, fastcgi
memcached:
数据结构模型:
结构化数据:关系型数据库;
半结构化数据:xml, json, ... (NoSQL);
非结构化数据:文件系统;
k/v:
memcached:存储于内存中;
redis:存储于内存中,周期性地将数据同于辅存上;
memcached:
LiveJournal旗下的Danga Interactive
特性:
k/v缓存:可序列化数据;存储项:key, value, flag, expire time;
功能的实现一半依赖于服务端,一半依赖客户端;
分布式缓存:互不通信的分布式集群;
O(1)的执行效率;
清理过期数据:LRU
缓存项过期
缓存空间用尽
缓存系统的种类:
代理式缓存;
旁路式缓存;
分布式系统主机路由:
取模法
一致性hash;
memcached:
11211/tcp, 11211/udp
主程序:memcached
环境配置文件:/etc/sysconfig/memcached
协议格式
文本协议
二进制协议
命令:
统计类:stats,stats items, stats slabs, stats sizes
存储类:set, add, replace, append, prepend
获取数据类:get, delete, incr/decr
清空:flush_all
memcached程序的常用选项:
-l <ip_addr>: 监听的地址;
-m <num>:缓存空间大小,单位为MB;默认为64;
-c <num>:最大并发连接数,默认为1024;
-p <num>:Listen on TCP port <num>, the default is port 11211.
-U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.
-M:缓存空间耗尽时,向请求者返回错误信息,而不是基于LRU算法进行缓存清理;
-f <factor>:growth factor,增长因子;
-t <threads>:处理用于请求的线程数;
memcached默认没有认证机制,但可借助于SASL进行认证;
php连接memcached服务的模块:
memcache:php-pecl-memcache
memcached:php-pecl-memcached
可提供工具程序的程序包:libmemcached;
LB Cluster保持会话的方法:
session sticky
session cluster
session server
博客作业:
nginx负载均衡用户请求至后端多个ammp主机,php的会话保存于memcached中;