nginx
nginx(web server , web reverse proxy):
http协议:80/tcp, HyperText Iransfer Procotol
html:HypreText Mark Language(超文本标记语言)
文本:HTTP/1.0 MIME
MIME:Multipurpose Internet Mail Extension
major/minor
text/plain
image/jpeg
URL:scheme://server[:port]/path/to/source
http事务:request <--> response
request
<method><URL><version>
<HEADERS>
<body>
response
<version><status><reason phrase>
<HEADERS>
<body>
协议格式:文本、二进制
method
GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS
status
1xx:信息类
2xx:成功类
3xx:重定向类
4xx:客户端错误类
5xx:服务器端错误
HEADER
通用首部
请求首部
响应首部
实体首部
扩展首部
web页面:多个资源
入口:资源引用:
认证:
基于IP认证:
基于用户访问:
basic
digest
资源映射:
Alias
DocumentRoot
httpd:MPM(多路处理模块)
prefork ,worker ,event(第一种是进程模型,后两种是线程模型)
prefork:主进程,生成多个子进程,每个子进程处理一个进程
worker:主进程,生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求
event:主进程,生成多个子进程,每个子进程响应多个请求
I/O类型
同步和异步:
关注的是消息通知机制
同步:调用发出之后不会立即返回,但一返回,则返回的即是最终结果
异步:调用发出之后,被调用方立即返回消息,但返回的并非最终结果:被调用者通过状态,通知机制等来通知调用者,或通过回调函数来处理结果:
阻塞和非阻塞
关注的是调用者等待被调用者返回调用结果时的状态
阻塞:调用结果返回之前,调用者会被挂起,调用者只有在得到返回结果之后才能继续
非阻塞:调用者在结果返回之前,不会被挂起,即调用不会阻塞调用者
I/O模型:
blocking IO 阻塞式IO
nonblocking IO 非阻塞式IO
IO multiplexing 复用性IO
select():最多不能超1024个并发,poll():profork、worker
singnal driven IO 事件驱动型IO:event
增加了通知机制
水平触发:多次通知
边缘通知:只通知一次
asynchronous IO: 异步型IO
eopll
例如:一次read操作
(1)等待数据准备好,从磁盘到内核内存
(2)从内核内存复制到进程内存
nginx
Nginx:engine X
Tngine
Registry
libevent:高性能的网络库
epoll()
Nginx特性
模块化设计,较好的扩展性
高可靠
master --> worker
低内存消耗
10000个keep-alive模式下的connection,仅需要2.5MB内存
支持热部署
不停机而更新配置文件,日志文件滚动,升级程序版本
支持事件驱动、AIO、mmap
基本功能
静态资源的web服务器,能缓存打开的文件描述符
http、smtp、pop3 协议的反向代理服务器
支持缓存加速,负载均衡机制
支持FastCGI(fpm,LNMP),uWSGI(python)等
模块化(非DSO机制)、过滤器zip,SSI及图像的大小调整
支持SSL
扩展功能
基于名称和IP的虚拟主机
支持keeplive
支持平滑升级
定制访问日志,支持使用日志缓冲区提供日志存储性能
支持url rewrite
支持路径别名
支持基于IP和用户的访问控制
支持速率限制,支持并发数限制
Nginx的基本架构
一个master进程,生成一个或多个worker进程
事件驱动,epoll(边缘触发),kqueue:BSD系统,/dev/poll
复用器:select,poll,rt signal
支持sendfile,sendfile64
支持AIO
支持mmap
nginx的工作模式:非阻塞,时间驱动,有一个master进程生成多个worker线程,每个worker响应N个请求
worker * n
模块类型
核心模块
Standard HTTP modules
Optional HTTP modules
Mail modules
3rd party modules
安装方法:
源码:编译安装
编译安装: ./configure --help(查看帮助)
配置文件:
main配置段:全局配置段
event:定义event模型工作特性
http{}:定义http协议的相关配置
配置指令:要以分号结尾,语法格式:
directive value1[value2 ...]
支持使用变量
内置变量
模块会提供几建变量定义
自定义变量
set var_name value
主配置段指令
用于调试、定位问题
正常运行必备的配置
优化性能的配置
事件相关的配置
nginx:非阻塞、事件驱动、异步
主配置段的指令
正常运行的必备配置
1、user USERNAME[GROUPNAME]
指定运行worker进程的用户和组
2、pid /path/to/pid_file
指定nginx守护进程的pid文件
3、worker_rlimit_nofile # ;
指定所有worker进程所能够打开的最大文件句柄数
性能优化的相关配置
1、worker_processes #
所能打开的worker进程的个数:通常应该略少于cpu物理核心数
2、worker_cpu_affinity cpumask...
优点:提升缓存的命中率
context switch (进程切换):会产生cpu的不必要的消耗
cpumask:
0000 0000
0000 0001
0000 0010
0000 0100
0000 1000
worker_cpu_affinity 00000001 00000010 00000100 (绑定前三颗cpu)
3、time_resolution
计时器解析度:降低此值,可减少gettimeofday()系统调用的次数
4、work_priority number;
指明worker进程的nice值,nice值越小,优先值越高
-20 19
100 139
事件相关的配置
1、accept_mutex {off|on};
master调度用户请求至各worker进程时使用的负载均衡锁:on表示能让多个worker轮流的,序列化的去响应新请求;
2、lock_file file:
accept_mutex用到的锁文件路径
3、use [epoll|rtsig|select|poll]
指明使用的事件模型:建议让nginx自行选择
4、worker_connection #;
设定单个worker进程所能够处理的最大并发连接数
worker_connection (51200)* worker_processes
用于调试,定位问题,(解码时,要加上这个包 --with-debug)
1、daemon {on|off}
是否已守护进程方式,来运行nginx:调试时应设置为off
2、master_process {on|off}
是否以master/worker模型来运行nginx;调试时可以调试为off
3、error_log 位置 级别;
若要使用debug级别,需要在编译nginx时使用了 --with-debug选项
nginx作为web服务器时使用的配置:
http{}:由ngx_http_core_module模块所引入:
配置框架:
http{
upstream{
..
}
server{
location URL{
...
}#类似于httpd中的<location>,用于定义URL与本地文件系统的映射关系:
location URL {
if...{
}
}
...
}#每个server类似于httpd中的一个<VirtualHost>
}
注意:与http相关的指令仅能够放置于http、server、location、upstream、if上下文,但有些指令仅用于这五种上下文中的某些中:
配置指令;
1、server{}
定义一个虚拟主机的
2、listen
指定监听的端口和地址
3、server_name NAME [...]
后可跟多个主机;名称还可以使用正则表达式(~)或通配符;
(1)先做精确匹配检查;
(2)左侧通配符匹配检查
(3)右侧通配符匹配检查
(4)正则表达式匹配检查
(5)default_server
4、root path:
设置资源路径映射;用于指明请求的URL所对应的资源所在的文件系统上的起始路径
5、location
功能:允许根据请求的URL来匹配定义的各location。匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
= :精确匹配检查
~:正则表达式模式匹配检查,区分字符大小写
~*:正则表达式模块匹配检查,不区分字符大小写
^~: URL的前半部分匹配,不支持正则表达式
匹配优先级:= > ^~ > ~ > ~* > 不带任何符号的
6、alias path;
用于location配置段,定义路径别名
注意:root表示指明路径为对应的location"/"URL; alias 表示路径映射,即location指令后定义的URL是相对于alias所知名的路径而言
7、 index file;
默认主页面:
index index.php index.html;
8、error_page code [...] [=code] URL | @name
根据http响应状态码来指明待用的错误页面:
error_page 404 [= 200]/404_customed.html
[=code]: 以指定的响应码进行响应,而不是默认的原来的响应码:默认表示以新资源的响应码为其响应码:
9、基于IP的访问控制机制
allow IP/network
deny IP/network
10、基于用户的访问控制
basic,digest
auth_basic "" ;
auth_basic_user_file "/PATH/TO/PASSWORD_FILE
账号密码文件建议使用htpasswd来创建
11、https服务
生成私钥,生成证书签署请求,并获得证书
server {
listen 443 ssl;
server_name www.baidu.com
ssl_certificate /etc/nginx/ssl/nginx.crt
ssl_cretificate_key /etc/nginx/ssl/nginx.crt
ssl_session_cache shsred:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MDS
ssl_prefer_server_ciphers on;
location / {
root /data/web
index index.html index.htm
}
}
12、stub_ststus {on|off}
仅能用于location上下文
location /ststus {
stub_status on;
}
13、rewrite regex replacement flag;
例如:
rewrite ^/images/(.*\.jpg)$ /imgs/$ break;
flag:
last:一旦此rewrite规则重写完成后,就不再被后面其他的rewrite规则进行处理,而是由User Agent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程
break;一旦此rewrite规则重写完成后,由User Agent对新的URL重写发起请求,且不再会被当前location内的任何rewrite规则所检查
redirect:以302响应码(临时重定向)返回新的URL
permanent:以301响应码(永久重定向)返回新的URL
14、if
语法:if(condition){...}
应用语法: server , location
condtion:
(1)变量名:
变量值为空串,或者以“0”开始,则为false,其他均为true
(2)以变量为操作数构成的比较表达式
可使用=,!= 类似的比较操作符进行测试
(3)正则表达式的模式匹配操作
~:区分大小写
~*:不区分大小写
!~和!~*:对上面两种测试取反
(4)测试文件存在性:-f,!-f
(5)测试指定路径为目录的可能性:-d ,!-d
(6)测试文件存在性:-e,!-e
(7)检查文件是否有执行权限:-x,!-x
15、防盗链
location ~*\.(jpg|gif|jpeg|png)$ {
valid_referer none blocked www.baidu.com;
if ($invialid_referer) {
rewrite ^/ http://www.baidu.com/403.html
}
}
16、定制访问日志格式
log_format
网络连接相关的配置
1、keeplive_timeout #
长连接的超时时长,默认75秒
2、keeplive_requests #
在一个长连接上所能够允许请求的最大资源数
3、keeplive_disable [msie6|safari|none]
为指定类型的User Agent禁用长连接
4、tcp_nodelay on|off
是否对长连接使用TCP_NODELAY选项;(如想提升用户体验,使用on)
5、client_header_timeout #;
读取http请求报文首部的超时时长
6、client_body_timeout #;
读取http请求报文body部分的超时时长
7、send_timeout #;
发送响应报文的超时时长
fastcgi的相关配置
lnmp:php要启用fpm模型
原文地址:http://blog.51cto.com/13214087/2132974