Nginx:engine x
Tengine
Registry
nginx调用了libevent。
libevent是一个高性能的网络库,epoll()
nginx特新
模块化设计、较好的扩展性
高可靠性:master--->worker
底内存消耗:1000个keep-alive模式下的connection,仅需2.5MB的内存
支持热部属:可以不停机更新配置文件,日志文件滚动,升级程序版本;
支持事件驱动,AIO(异步IO)
基本功能:
静态资源的web服务器,能缓存打开的文件描述符
http、smtp、pop3协议的反向代理服务器
缓存功能,负载均衡
支持FastCGI(fpm,LNMP)
模块化(非DSO机制)
支持SSL
扩展功能:
支持名称和IP的虚拟主机
支持Keepalived
支持平滑升级
制定访问日志、支持使用日志缓冲区提供日志存储性能;
支持url rewirte
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制
nginx的基本架构
nginx的工作模式: 非阻塞,事件驱动,由一个master进程生成多个worker线程,每个worker线程响应n个请求。所以总的并发数为:worker数量 * n
sendfile是什么:
一般响应用户请求过程:磁盘---->内核----->用户空间----->内核----->客户端
这样有点麻烦,可以这样做:磁盘---->内核---->客户端。这就是sendfile
httpd服务也支持sendfile这种机制
模块类型:
核心模块
Standard HTTP modules
Optional HTTP modules
Mail modules
3rd party modules
前4种模块nginx自带,第三方模块需要我们在编译时指定
配置文件:
main配置端:全局配置段
event{ }:定义event模型工作特性
http{ }:定义http协议相关配置
支持使用变量:
内置变量:模块会提供自建变量定义
自定义变量:set var_name value
nginx主配置段指令:
-
正常运行的必备配置:
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 #;
指定所有worker进程所能打开的最大文件数; -
性能优化相关配置
1、worker_processes #;
worker进程的个数,通常应略少于cpu物理核心数;
2、worker_cpu_affinity cpumask …;
如果主机有多个物理核心,对于非常繁忙的worker进程来说可能会被不停的调度到不同的cpu上,所以每个进程在哪个cpu上都是不确定的。
所以可以将worker进程于cpu绑定,1号绑定在1号cpu上,2号进程绑定在2号cpu上…
所谓的绑定不是1号cpu一定属于1号进程,如果有其他进程需要在1号cpu上运行,1号进程还是会被切出去的,只是说1号进程一定只能在1号cpu上运行。
所以绑定虽然避免不了进程切换,但可以保证绑定的进程的缓存不会失效。
即:假设一个worker进程在某个cpu上运行,该进程加载到了很多数据到cpu的缓存上,如果把该进程调度到其他cpu上,则缓存就失效了。
优点:会提高缓存命中率;
context switch(进程切换):会产生不必要的cpu消耗;
3、worker_priority number;
指明worker进程的nice值;
-20,19
100,139 -
事件相关配置:
1、accept_mutex{off|on};
master调度用户请求至个各worker进程时使用的负载均衡,on表示能让多个worker轮流的,序列化的去响应用户请求;
2、use [epoll|rtsig|select|poll];
指明使用的事件模型,建议让nginx自行选择
3、worker_connections #;
设定单个worker进程所能处理的最大并发连接数量
总的并发连接数:worker_connections * worker_processes
- 用于用户调试、定位问题:
1、deamon {on|off};是否以守护进程运行nginx,调时时应设置为off;
2、master_process {on|off}; 是否以master/worker模型来运行nginx,调时时设置为0ff;
3、error_log file
新改动的配置生效方式: nginx -s reload
nginx作为web服务器所使用的配置:
http {}:由 ngx_http_core_module模块引入;
配置框架:
http {
upstream {
....
}
server {
location URL {
root "/path/to/somefile ;
} #类似于httpd中的<location>,用于定义URL与本地文件系统的映射关系;
location URL {
if ... {
}
}
} #可以有多个server,每个server相当与httpd中的虚拟主机
}
配置指令:
1、server { }
定义一个虚拟主机:基于端口
server {
listen 8080;
server_name www.wtt.com;
root /vhost/web1;
}
2、listen
指定监听的地址和端口
listen address[:port]
listen port
3、server_name NAME1 NAME2 … ;
后可跟多个主机,名称可以使用正则表达式或通配符
(1)先做精确匹配检查;
(2)再做左侧通佩符匹配检查,*.wtt.com
(3)右侧通配符检查:如:mail.*
(5)正则表达式检查:~^.*\.wtt\.com
(6)default_server
4、root path;
设置资源路径映射;用于指明请求的URL对应的资源做在文件系统上的起始路径;
放的容器越大,生效的优先级越低。
例如:放在http{ }中的优先级比server{ }中的优先级低,而server{} 比location { }低。
5、location { }
功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理。例如访问控制等功能。
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
=:精确匹配检查
~:正则表达式模式检查
~*:正则表达式模式检查,不区分大小写
^~:URI的前半部分匹配,不支持正则表达式
匹配优先级:= , ^~ ,~,~*,不带任何符号的location
例如:
server {
listen 80;
server_name www.wtt.com;
location / {
root /vhost/web1;
}
location /image/ {
root /vhost/web2;
}
location ~* \.php$ {
fcgipass;
}
}
访问:http://www.wtt.com/bbs/index.php
由于第一个和第三个都可以匹配到,由于~*的优先级大于不带任何符号的优先级,所以第三个生效。
5、alias path;
用于location段,用于定义路径别名。
注意:root表示指明路径对应的location “/” URL;alias表示路径映射,即location指令后定义的URL是相对于aliase所指明的路径而言。
例如:
location /imsge {
root "/vhosts/web1";
}
访问http://www.wtt.com/image/a.jpg 其实是访问 /vhost/web1/image/a.jpg
location /image {
alias “/www/pictures/“; #注意pictures后一定要加/
}
访问 http://www.wtt.com/image/a.jpg 其实是访问 /www/pictures/a.jpg 。与你定义的location后的路径无关。
6、index file;
默认主页面
index index.php index.html;
7,自定义错误页面
error_page code [...] [=code] URI @name 根据http地响应状态码指明特用的错误页面
例如: error_page 404 /404_customed.html
在location里面定义错误页面
建立如下的错误页面
重载服务后访问一个不存在的页面
8、基于ip的访问控制
allow ip/network;
deny ip/network;
例如:拒绝172.25…44.2这台主机的访问
重载服务后
使用172.25.44.250主机去访问,正常
使用172.25.44.2这台主机去访问,被forbidden了
仅允许172.25.44.0/24这个网段的主机访问
9、基于用户的访问控制
basic、digest
auth_basic "...";
auth_basic_user_file; :帐号密码文件,建议使用htpasswd来创建。
-m表示使用md5加密方式
10、ssl
12、stub_status {on|off}; 仅用于location中
Active connections: 1 #当前所有处于打开状态的连接数
server accepts handled requests
20 20 39 #已经接受的连接 已经处理过的连接 已经处理的请求。(在“保持连接“模式下,请求数可能会多于连接数)
Reading: 0 Writing: 1 Waiting: 0
Reading:处于接收请求状态的连接数
Writing:请求已接首完成,正处于处理请求或发送响应的过程的连接数
Waiting:保持连接模式。且处于活动状态的连接数。
12、rewirte regex repacement flag;
例如:rewirte ^/images/(.*\.jpg)$ /imgs/$1 break;
http://www.wtt.com/images/a/b/c/1.jpg----->http://www.wtt.com/imgs/a/b/c/1.jpg
flag:
last:一旦此rewirte规则重写完成后,就不再被后面其它的rewirte规则进行处理,而是由user agent 重新对重写后的规则发起请求,从头开始执行类似过程
break:一旦此rewirte重写完成后,由user agent对新的url重新发起请求,且不再对当前location内的任意rewirte规则所检查
rewirte ^/images/(.*\.jpg)$ /imgs/$1 break;
rewite ^/imgs/(.*\.jpg)$ /images/$1 break;
类似于这样的循环时会用到break
redirect:以302响应码(临时重定向)返回新的url
permanent:以301响应码返回新的url
举例1:
访问172.25.44.1:8080/bbs/
注意/bbs/最后面的斜线一定要有
举例2:
客户端访问,可以看到响应码为302,location为https://www.wtt.com:
13、if
语法:if condition {...}
应用环境:server ,location
condition:
(1)变量名
变量值为空字符串,或以“0“开始则为false,其它的均为true
(2)以变量为操作数构成的表达式
可以使用=,!=类似的比较操作符进行测试
(3)正则表达式的模式匹配操作
~:区分大小写的模式匹配检查
~*:不区分大小写
!~和!~*:对上面两种匹配模式取反
(4)测试路径为文件可能性:-f,!-f
(5)测试路径为目录的可能性:-d,!-d
(6)测试文件存在的可能性 -e ,!-e
(7)检查文件是否有执行权限-x ,!-x
例如:
(1)if ($http_user_agent ~* MSIE) {
rewrite ^(.*)$ /mise/$1 break;
}
http_user_agen表示获取用户浏览器类型
14、防盗链
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referer none blocked www.wtt.com; #这里定义合法的应用者
if ($invalid_referer) { #如果不合法的引用者存在
rewirte ^/ http://www.wtt.com/403.html;
}
}
15、定制访问日志格式
log_format
$time_local:本地时间
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 /var/log/nginx/access.log main;
16、网络连接相关配置:
keepalive_timeout #; 长连接超时时长,默认75秒;
keepalive_requests #; 在一个长连接上所能够允许请求的最大资源数;
keepalive_disable {msie6|safari|none};为指定的user agent禁用长连接
tcp_nodelay on|off; 是否对长连接使用tcp_nodelay选项
client_header_timeout #;读取http请求报文首部的超时时长
client_body_timeout #; 读取http请求报文body部分的超时时长
send_timeout #;发送响应报文的超时时长
17、fastcgi的相关模块
LNMP:php启用fpm模型