Nginx介绍

Nginx介绍

nginx可以做什么?

  1. 可针对静态资源高速高并发访问及缓存。
  2. 可使用反向代理加速,并且可进行数据缓存。
  3. 具有简单负载均衡、节点健康检查和容错功能。
  4. 支持远程FastCGI服务的缓存加速。
  5. 支持FastCGI、Uwsgi、SCGI、Memcached Servers的加速和缓存。
  6. 支持SSL、TLS、SNI。 https
  7. 具有模块化的架构:过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI及图像缩放等功能。在SSI过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理。

作为WEB服务的话支持

  1. 支持基于名字、端口及IP的多虚拟主机站点。
  2. 支持Keep-alive和pipelined连接。
  3. 可进行简单、方便、灵活的配置和管理。
  4. 支持修改Nginx配置,并且在代码上线时,可平滑重启,不中断业务访问。
  5. 可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志。
  6. 可利用信号控制Nginx进程[注释]。
  7. 支持3xx-5xx HTTP状态码重定向。304 ,301,302,404,500,502
  8. 支持rewrite模块,支持URI重写及正则表达式匹配。
  9. 支持基于客户端IP地址和HTTP基本认证的访问控制。
  10. 支持PUT、DELETE、MKCOL、COPY及MOVE等较特殊的HTTP请求方法。
  11. 支持FLV流和MP4流技术产品应用。
  12. 支持HTTP响应速率限制。
  13. 支持同一IP地址的并发连接或请求数限制。
  14. 支持邮件服务代理。

简单点就是支持以下三种应用场景

(1)作为Web服务软件

(2)反向代理或负载均衡服务

(3)前端业务数据缓存服务

优点

  1. 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)。
  2. 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB。
  3. 可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能。
  4. 具备Squid等专业缓存软件等的缓存功能。
  5. 支持异步网络I/O事件模型epoll(Linux 2.6+)。

apache的特点

  1. Apache 2.2版本非常稳定强大,据官方说,Apache 2.4版本性能更强。
  2. Prefork模式取消了进程创建开销,性能很高。
  3. 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在Apache上。
  4. 高并发时消耗系统资源相对多一些。
  5. 基于传统的select模型,高并发能力有限。
  6. 支持扩展库,可通过DSO、apxs方法编译安装额外的插件功能,不需要重新编译Apache。
  7. 功能多,更稳定,更安全,插件也多。
  8. 市场份额在逐年递减。

lighttpd的特点

  1. 基于异步网络I/O模型,性能q、并发都与Nginx相近。
  2. 扩展库是SO模式,比Nginx灵活。3
  3. 目前国内的使用率比较低,安全性没有Apache和Nginx好。
  4. 通过插件(mod_secdownload)可实现文件URL地址加密(优点)。
  5. 社区不活跃,市场份额较低。

图说三个服务器的性能对比

对比

为什么nginx处理并发能力更强?

并发对比

如何选择web服务器?

  1. 静态业务:若是高并发场景,尽量采用Nginx或Lighttpd,二者首选Nginx。
  2. 动态业务:理论上采用Nginx和Apache均可,建议选择Nginx,为了避免相同业务的服务软件多样化,增加额外维护成本。动态业务可以由Nginx兼做前端代理,再根据页面元素的类型或目录,转发到后端相应的服务器进行处理。
  3. 既有静态业务又有动态业务:采用Nginx。

此外,如果并发不是很大,又对Apache很熟悉,采用Apache也是可以的,Apache 2.4版本也很强大,并发连接数也有所增加。总的来说,在满足需求的前提下,首先选择自己最擅长的软件,若发现了更好的软件,可在掌握新软件之后逐步替换。虽然动态和静态业务都倾向于选择Nginx,但是大前提是自己要熟练掌握Nginx。切记,在工作中不要盲目选择软件,这可能最终会导致自己无法控制局面,从而给企业带来灾难性的损失。

nginx功能模块说明

Nginx核心功能模块(Core functionality)

conf

con

access_log的配置

access

location

基本语法

location使用的语法为:

1
2
3
4
5
location [ = | ~ | ~* | ^~ ] uri {

...

}

陪住

匹配这两种特殊字符“~”或“~”的区别为:“~”用于区分大小写(大小写敏感)的匹配;“~”用于不区分大小写的匹配。还可以用逻辑操作符“!”对上面的匹配取反,即“!~”和“!~*”。此外,“^~”的作用是在进行常规的字符串匹配检查之后,不做正则表达式的检查,即如果最明确的那个字符串匹配的location配置中有此前缀,那么不做正则表达式的检查。

示例场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
location = / {
[ configuration A ]
}

location / {
[ configuration B ]
}

location /documents/ {
[ configuration C ]
}

location ^~ /images/ {
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}

图

ss

ss

rewrite

nginx的rewrite规则需要pcre的支持,其实就是正则表达式的扩展使用

rewrite指令语法

指令语法:rewrite regex replacement[flag];
默认值:none
应用位置:server、location、if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。下面是一个简单的URL rewrite跳转的例子:

1
rewrite ^/ (.*) http://www.etiantian.org/$1 permanent ;

regex

sadsa

企业应用

  1. 可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
  2. 为了让搜索引擎收录网站内容,并让用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
  3. 网站换新域名后,让旧域名的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com。
  4. 根据特殊变量、目录、客户端的信息进行URL跳转等。

301跳转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#www virtualhost by oldboy
server {
listen       80;
server_name  etiantian.org;
rewrite ^/ (.*) http://www.etiantian.org/$1 permanent;
#<== 当用户访问 etiantian.org 及下面的任意内容时,都会通过这条 rewrite 跳转到 www.etiantian.org对应的地址
}
server {
listen       80;
server_name  www.etiantian.org;
location / {
root   html/www;
index  index.html index.htm ;
}
access_log logs/access_www.log main gzip buffer=32k flush=5s;
}

不通域名的跳转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen       80;
server_name  blog.etiantian.org;
location / {
root   html/blog;
index  index.html index.htm;
}
if($http_host ~* "^(.*)\.etiantian\.org$")
{
set $domain $1;
rewrite ^(.*) http://www.etiantian.org/$domain/oldboy.html break;
}
}
要配置的规则内容为:
if ($http_host ~* "^ (.*) \.etiantian\.org$")
{
set $domain $1;
rewrite ^ (.*) http: //www.etiantian.org/$domain/oldboy.html break;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#www virtualhost by oldboy
server {
listen       80;
server_name  www.etiantian.org etiantian.org;
location / {
root   html/www;
index  index.html index.htm;
}
access_log logs/access_www.log main gzip buffer=32k flush=5s;
}


if ($host ~* www.findname.cc) {
rewrite ^/(.*)$ http://findname.cc/$1 permanent;
}

帐号密码认证

1
2
3
4
location / {
auth_basic           "closed site";
auth_basic_user_file conf/htpasswd;
}

语法:auth_basic string|off;
默认值:auth_basic off;
使用位置:http、server、location、limit_except
·auth_basic_user_file
语法:auth_basic_user_file file;
默认值:—
使用位置:http、server、location、limit_except
auth_basic_user_file参数后接认证密码文件,file的内容如下:

1
2
3
4
# comment
name1:password1
name2:password2:comment
name3:password3

fastCGI

CGI(通用网关接口)

cgi