engineX = Nginx,nginx是一个高性能的http和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
http协议:html,文本,MIME
major/minor:text/plain,text/html,image/jpeg
web资源:URL(scheme://server:port/path/to/source)
方法:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS
http事务:request<-->reponse
request:
response
Status:
1xx:信息类
2xx:成功类,200
3xx:重定向,301,302,304
4xx:客户端类错误,403,401,404
5xx:服务端错误,502
页面:多个资源
请求资源:是入口
HREF:80,40
认证:
基于ip
基于用户
Bassic
Digest
Httpd:MPM
Prefork,worker,event
C10k问题:
网络服务在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10k问题
I/O类型:
同步和异步:synchronous,asyncrhonous
关注的是消息通知机制
同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;
异步:调用发出之后,被调用方立即返回消息,但返回的非最终结果;被调用者通过状态、通知机制来通知调用者,或通过回调函数来处理结果;
阻塞和非阻塞:block,noblock
关注的是调用等等调用结果(消息、返回值)时的状态
阻塞:调用结果返回之前,调用者(调用线程)会被挂起;调用者只有在得到结果之后才会返回;
非阻塞:调用结果返回之前,,调用不会阻塞当前进程;
5种I/O模型:
blocking IO :阻塞型
nonblocking IO:非阻塞型;
IO multiplexing:复用型;
Signal driven IO:事件驱动型;
Asysncrhonous IO:异步
一个read操作:
1) 等数据准备好;
2) 从内核向进程复制数据;
Select() , poll()
水平触发,边缘触发
五种I/O模型过程比较:
Nginx的特性:
模块化设计、较好的扩展性
高可靠性
Master à worker
低内存消耗
10000个keep-alive连接在nginx仅消耗2.5Mb
支持热部署
不停机而更新配置文件、更换日志文件、更新服务器程序版本
基本功能:
静态资源的web服务器,能缓存打开的文件,描述符;
http,smtp,pop3协议的反向代理服务器,缓存、负载均衡;
支持fasecgi(fpm)
模块化,非DSO机制,过滤器zip,SSI及图像大小调整;
支持SSL
扩展功能:
基于名称和IP的虚拟主机;
支持keepalive
支持平滑升级
定制访问日志,支持使用日志缓冲区提高日志存储性能
支持url rewrite
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制;
Nginx基本架构:
一个master进程,生成一个或多个worker
事件驱动:epoll,kqueue,/dev/poll(event ports)
消息通知:select,poll,rt signals
支持sendfile,sendfile64
支持AIO
支持mmap
Nginx:非阻塞、时间驱动、一个master生成一个或多个worker,每个worker响应n个请求
模块类型:
核心模块
Standard http modules
Optional http modules
Mail modules
3rd party modules
Nginx的安装配置:
1. 创建组和用户,并解压缩源码;
2. 编译安装;
# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
# make && make install
Note:如果需要调试,定位问题,必须安装时启用--with-debug选项
3. 启动nginx;
4. 测试;
配置文件:
主配置文件:/etc/nginx/nginx.conf
Fastcgi的配置文件:/etc/nginx/fastcgi_params /etc/nginx/uwsgi_params
配置指令(必须以分号结尾):
Directive value1 [value2…];
支持使用变量:
内置变量:由模块引入;
自定义变量:
set variable value;
引用变量:$variable
配置文件的组织结构
main block
event {
…
}
http {
…
}
http配置段:
http{
…
server{
…
server_name
root
alias
location /url/ {
}
…
}
server {
…
}
}
Main配置段:
类别:
正常运行必备的配置;
优化性能相关的配置;
用于调试、定位问题的配置;
正常运行必备的配置:
1. user USERNAME [GROUPNAMEJ];
指定运行worker进程的用户和组,例如;
user nginx nginx;
2. pid /path/to/pid_file;
指定nginx的pid文件;
3. worker_rlimit_nofile #;
指定一个worker进程所能够打开的最大文件句柄数;
4. worker_rlimit_sigpending #;
指定每个用户能够发往worker的信号的数量;
优化性能相关的配置:
1. worker_processes #;
worker线程的个数;通常应该为物理cpu核心个数减1;
2. worker_cpu_affinity cpumask …;
绑定worker进程至指定的cpu上;
CPUMASK
0001
0010
0100
1000
例如:
Worker_cpu_affinity 00000001 00000010 00000100;
3. timer_resolution t;
计时器解析度:降低此值,可减少gettimeofday()系统调用的次数
4. worker_priority nice;
指明worker进程的nice值;
-20,19
事件相关的配置;
1. accept_mutex [on|off]
内部调用用户
请求至各worker时用的负载均衡锁;打开时表示能让多个worker轮流地、序列化地与响应新请求;
2. lock_file /path/to/lock_file;
accept_mutex用到的锁文件的路径;
3. accept_mutexz-delay #ms;=
4. use [epoll|rgsis|select|poll]
定义使用的时间模型;建议让Nginx自动选择;
5. worker_connections #;
每个worker进程所能够响应的最大并发请求数;
用于调试、定位问题:
1. daemon [off|on]
是否以守护进程方式启动nginx
2. master_process on|off;
是否以master/worker模型来运行nginx
3. error_log /path/to/error_log level;
错误日志文件及其级别;处于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用 --with-debug选项才有效;
Nginx作为web服务器时使用的配置:
配置框架:
http: {
upstream{
…
}
Server {
listen IP:PORT;
location URL {
root“/path/to/somedir”;
…
} #类似于httpd中的
location URL {
if … {
…
}
}
} #每个server类似于httpd中的一个
Server {
…
}
}
虚拟主机的相关配置:
1. server {}
定义一个虚拟主机;
示例:
浏览器访问:
2. listen
监听的端口
完整格式:listen address[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Listen address[:port] [default_server] ssl
Backlog=number:指明tcp协议backlog队列的大小。默认为-1,表示不设置;
rcvbuf=size:设定监听句柄的SO_RCVBUF
3. server_name name […];
后可跟多个主机:名称还可以使用正则表达式(~)或通配符;
1) 先做精确匹配:www.claude.com
2) 左侧通配符匹配,例如:*.claude.com;
3) 右侧通配符匹配,例如:www.*;
4) 正则表达式匹配,例如:~^.*\.claude\.com$;
5) Default_server
示例:server{
server_name www.claude.com
}
server{
server_name *.claude.com
}
server{
server_name www.*
}
4. location [=|~|~*|^~] /uri {...}
location @name
功能:允许根据用户请求的URL来匹配定义的各location,匹配到时,次请求将被相应的location块中的配置所处理;
=:精确匹配检查;
~:正则表达式匹配,区分字符大小写;
~*:正则表达式模式匹配,不区分字符大小写;
^~:URL的前半部分匹配,不检查正则表达式;
匹配优先级:精确匹配(=)、^~、~和~*、由不带符号的URL进行左侧匹配;
示例:
1) 编辑配置文件,将虚拟主机写成如下内容;
2) 创建相关文件;
3) 浏览器访问测试;
a. 访问http://192.168.19.139:8080/a.txt网址;
b. 访问http://192.168.19.139:8080/images/a.txt
Note:因为此网址匹配到location中第二个location,所以会到/vhosts/text目录下寻找images/a.txt,所以寻找不到;
5. root
设置web资源路径映射,用于指明请求的URL所对应的文档的根目录路径;
6. alias path
用于location配置段,定义路径别名
1) 编辑配置文件;
2) 创建相关目录和文件;
3) 访问浏览器测试;
7. index file
默认主页面
index index.html
8. error_page code […] [=code] URI | @name
根据http状态码重定向错误页面;
Error_page 404 /404.html
[=code]:以指定的响应码进行响应;省略code表示以新资源的响应码为响应码
9. 基于ip的访问控制
allow IP/Network;
deny IP/Network;
1) 编辑配置文件;
2) 用ip地址为192.168.19.134主机访问测试;
3) 用其他主机访问测试;
10. 基于用户的访问控制
Basic ,digest
auth_basic “”;
auth_basic_user_file “/path/to/password_file”
账号密码文件建议使用htpasswd来创建;
1) 编辑配置文件;
2) 创建用户和密码;
3) 浏览器访问测试;
输入用户名和密码后即可访问;
11. https服务
生成私钥,生成证书请求,并获得证书;
示例:CA主机和nginx主机为同一台主机;
1) 构建私有CA;
2) 将nginx主机生成私钥,生成证书请求,并由CA主机签署证书;
3) 编辑配置文件;
检查配置文件并重载;
4) 浏览器测试;
导入证书;
再次访问,不再有安全提示;
12. stub_status {on |off};
仅能用于location上下文;
location /status {
stub_status on;
allow 192.168.19.0/24;
deny all;
}
结果示例:
Active connections:1 # 当前所有处于打开状态的连接数;
Server accepts handled requests
2 2 2
1) 已经接受过的连接数;
2) 已经处理过的连接数;
3) 已经处理过的请求数:在“保持连接”模式下,请求数量可能会多于连接数量;
Reading:0 Writing:1 Wating:0
Reading:正处于接收请求状态的连接数;
Writing:请求已经接收完成,正处于处理请求或发送响应过程中的连接数;
Wating:保持连接模式,且处于活动状态的连接数;
13. url rewrite
rewrite regex replacement flag
例如:
…
Rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
Rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;
…
flag:
last:一旦此rewrite负责重写完成后,就不再被后面其他的rewrite规则进行处理;而是由user agent重新对重写后的url再一次发起请求,并从头开始执行类似的过程;
break:一旦此rewrite规则重写完成后,由user agent对新的url重庆发起请求,且不再会被当前的location内的任何rewrite规则所检查;
redirect:以302响应码(临时重定向)返回新的url;
permanent:以301响应码(永久重定向)返回新的url;
示例:
1) 编辑配置文件;
2) 创建相关目录文件;
3) 浏览器访问测试;
访问网址http://192.168.19.139:8080/images/a.txt:
访问网址http://192.168.19.139:8080/imgs/a.txt:
可以看出,访问上面的网址,被自动重写,变成了访问下面的网址;
14. If
语法:if (condition){…}
应用环境:server,location
condition:
1) 变量名:
变量值为空串,或者以“0”开始,则为false;其他的均为true
2) 以变量为操作数构成的比较表达式
可使用=,!=类似的比较操作符进行测试;
3) 正则表达式的模式匹配操作
~:区分大小写的模式匹配检查
~*:不区分大小写的模式匹配检查;
!~和!~*:对上面的两种测试取反
4) 测试路径为文件可能性:-f,!-f
5) 测试指定路径为目录可能性:-d,!-d
6) 测试文件的存在性;-e,!-e
7) 检查文件是否有执行权限:-x,!-x
例如:
If($http_user_agent ~* MSIE){
Rewrite ^(.*)$ /msie/$1 break;
}
15. 防盗链
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referer none blocked www.claude.com;
if ($valid_referer) {
rewrite ^/ http://www.claude.com/403.html;
}
}
16. 定制日志访问格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
note:此处可用变量为nginx的內建变量;
http核心模块的内置变量:
$uri:当前请求的uri,不带参数;
$request_uri:请求的uri,带参数;
$host:http请求报文中的host首部;如果请求中没有host首部,则以处理此请求的虚拟主机的主机名代替;
$hostname:nginx服务运行在的主机的主机名;
$remote_addr:客户端ip
$remote_port:客户端port
$remote_user:使用用户认证时客户端用户输入的用户名;
$request_filename:用户请求中的URI经过本地root或alias转换后映射的本地的文件路径;
$request_method:请求方法
$server_addr:服务器地址
$server_name:服务器名称
$server_port:服务器端口
$server_protocol:服务器向客户端发送响应时的协议,如http/1.1,http/1.0
$scheme:在请求中使用scheme,如https://www.claude.com/中的https
$http_HEADER:匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部
$sent_http_HEADER:匹配响应报文中指定的HEADER,例如$http_content_type匹配响应报文中的centent-type首部;
$document_root:当前请求映射到的root配置;
网络连接相关的配置:
1. keepalive_timeout time;
保持连接的超时时长,默认为75s
2. keepalive——requests #;
在一次保持连接上允许承载最大资源请求数;
3. keepalive_disable [msie6|safari|none]
为指定类型的浏览器禁用长连接;
4. tcp_nodelay on|off
对长连接是否使用tcp_nodelay选项;
5. client_header_timeout time;
读取http请求报文首部的超时时长;
6. client_body_timeout time;
读取http请求报文body部分的超时时长;
7. send_timeout time
发送响应报文的超时时长;
对客户端请求进行限制:
1. limit_except METHOD {…}
指定对范围之外的其它方法的访问控制;
limit_except GET{
allow 192.168.19.0/24;
deny all
}
2. client_body_max_size SIZE;
限制请求报文中body部分的上限;通过检测请求报文首部中的“content_length”来判定;
3. limit_rate speed
限制客户端每秒钟传输的字节数,默认为0,表示无限制;
文件操作优化相关的配置:
1. sendfile on|off
2. aio on|off;
3. direction size|off
4. open_file_cache max=N[inactive=time] | off;
nginx可以缓存以下三种信息:
1) 文件句柄、文件大小和最近一次的修改时间;
2) 打开目录的目录结构;
3) 没有找到的或者没有权限操作的文件的相关信息;
max=N表示可缓存的最大条目上限:一旦到达上限,则会使用LRU从缓存中删除最近最少使用的条目;
inactive=time:在inactive指定的时长内没有被访问过的缓存条目就会淘汰;
5. Open_file_cache_errors on|off
是否缓存在文件缓存中缓存打开文件时出现找不到路径,没有权限等的错误信息;
6. Open_file_cachez_min_users time;
每隔多久检查一次缓存中缓存条目的有效性:默认为60s;
重点关注:server{}, location{}, listen, server_name, root, alias, keepalive_timeout, keepalive_requests, error_page