Nginx通关攻略

Nginx是什么

没有听过Nginx?没关系,必定听过它的“同行”Apache吧!Nginx同Apache同样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL做为沟通依据,经过HTTP协议提供各类网络服务。
然而,这些服务器在设计之初受到当时环境的局限,例如当时的用户规模,网络带宽,产品特色等局限而且各自的定位和发展都不尽相同。这也使得各个WEB服务器有着各自鲜明的特色。
Apache的发展时期很长,并且是毫无争议的世界第一大服务器。它有着不少有点:稳定、开源、跨平台等等。可是因为它出现的时间太长了。它兴起的年代,互联网产业远比不上如今。因此它被设计为一个重量级的。不支持高并发的服务器。在Apache上运行数以万计的并发访问,会致使服务器消耗大量内存。操做系统对其进行进程或线程间的切换也消耗了大量的CPU资源,致使HTTP请求的平均响应速度下降。
这些都决定了Apache不可能成为高性能WEB服务器,轻量级高并发服务器Nginx和Lighttpd就应运而生了。php

Nginx产生

俄罗斯的工程师Igor Sysoev,他在为Rambler Media工做期间,使用C语言开发了Nginx。Nginx做为WEB服务器一直为Rambler Media提供出色而又稳定的服务。
而后呢,Igor Sysoev将Nginx代码开源,而且赋予自由软件许可证。
因为:html

Nginx使用基于事件驱动架构,使得其能够支持数以百万级别的TCP链接
高度的模块化和自由软件许可证是的第三方模块层出不穷(这是个多么美好的开源时代啊)
Nginx是一个跨平台服务器,能够运行在Linux, FreeBSD, Solaris, AIX, Mac OS, Windows等操做系统上nginx

这些优秀的设计带来的极大的稳定性。
因而,duang的一下。Nginx火了。web

三大WEB服务器对比

lighttpd

Lighttpd是一个具备很是低的内存开销,cpu占用率低,效能好,以及丰富的模块等特色。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。
Lighttpd使用fastcgi方式运行PHP,它会使用不多的PHP进程响应很大的并发量。
Fastcgi的优势在于:算法

从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统能够很轻易的丢弃,而后从新分配新的进程来运行逻辑.
从安全性上看, fastcgi和宿主的server彻底独立, fastcgi怎么down也不会把server搞垮
从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理仍是留给宿主server, 这样宿主server能够一心一意做IO,对于一个普通的动态网页来讲, 逻辑处理可能只有一小部分, 大量的图片等静态IO处理彻底不须要逻辑程序的参与
从扩展性上讲, fastcgi是一个中立的技术标准, 彻底能够支持任何语言写的处理程序php,Java,Pythonapache

Apache

apache是世界排名第一的web服务器, 根据netcraft所做的调查,世界上百分之五十以上的web服务器在使用apache.
1995年4月, 最先的apache(0.6.2版)由apache group公布发行. apache group 是一个彻底经过internet进行运做的非盈利机构, 由它来决定apache web服务器的标准发行版中应该包含哪些内容. 准许任何人修改隐错, 提供新的特征和将它移植到新的平台上, 以及其它的工做. 当新的代码被提交给apache group时, 该团体审核它的具体内容, 进行测试 若是认为满意, 该代码就会被集成到apache的主要发行版中。
apache 的特性:ubuntu

几乎能够运行在全部的计算机平台上
支持最新的http/1.1协议
简单并且强有力的基于文件的配置(httpd.conf)
支持通用网关接口(cgi)
支持虚拟主机
支持http认证
集成perl
集成的代理服务器
能够经过web浏览器监视服务器的状态, 能够自定义日志
支持服务器端包含命令(ssi)
支持安全socket层(ssl)
具备用户会话过程的跟踪能力
支持fastcgi
支持Java后端

Nginx

Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发.
Nginx以事件驱动的方式编写,因此有很是好的性能,同时也是一个很是高效的反向代理、负载平衡。其拥有匹配 Lighttpd的性能,同时尚未Lighttpd的内存泄漏问题,并且Lighttpd的mod_proxy也有一些问题而且好久没有更新。可是Nginx并不支持cgi方式运行,缘由是能够减小所以带来的一些程序上的漏洞。因此必须使用FastCGI方式来执行PHP程序。
nginx作为HTTP服务器,有如下几项基本特性:浏览器

处理静态文件,索引文件以及自动索引;打开文件描述符缓冲
无缓存的反向代理加速,简单的负载均衡和容错
FastCGI,简单的负载均衡和容错
模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。若是由 FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理能够并行运行,而不须要相互等待。缓存

Nginx专为性能优化而开发,性能是其最重要的考量,实现上很是注重效率。它支持内核Poll模型,能经受高负载的考验,有报告代表能支持高达 50,000个并发链接数。

Nginx具备很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速链接时,也极可能会致使服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显很是缓慢了。而Nginx采起了分阶段资源分配技术,使得它的CPU与内存占用率很是低。nginx官方表示保持10,000个没有活动的链接,它只占2.5M内存,因此相似DOS这样的攻击对nginx来讲基本上是毫无用处的。就稳定性而言,nginx比lighthttpd更胜一筹。

Nginx支持热部署。它的启动特别容易, 而且几乎能够作到7*24不间断运行,即便运行数个月也不须要从新启动。你还可以在不间断服务的状况下,对软件版本进行进行升级。

三大服务器比较

server Apache Nginx Lighttpd
Proxy代理 很是好 很是好 通常
Rewriter 很是好 通常
Fcgi 很差 很是好
热部署 不支持 支持 不支持
系统压力比较 很大 很小 比较小
稳定性 很是好 很差
安全性 通常 通常
静态文件处理 通常 很是好
反向代理 通常 很是好 通常

Nginx的安装

模块依赖性Nginx须要依赖下面3个包
1,gzip 模块须要 zlib 库 点击下载
2,rewrite 模块须要 pcre 库 点击下载
3,ssl 功能须要 openssl 库 点击下载
Nginx包下载: http://nginx.org/en/download.html
依赖包安装顺序依次为:openssl、zlib、pcre, 最后安装Nginx包。

安装openssl-fips-2.0.2.tar.gz

[root@localhost mrms]# tar -zxvf openssl-fips-2.0.2.tar.gz
[root@localhost mrms]# cd openssl-fips-2.0.2
[root@localhost openssl-fips-2.0.2]# ./config
[root@localhost openssl-fips-2.0.2]# make
[root@localhost openssl-fips-2.0.2]# make install

安装zlib-1.2.7.tar.gz

[root@localhost mrms]# tar -zxvf zlib-1.2.7.tar.gz
[root@localhost mrms]# cd zlib-1.2.7
[root@localhost zlib-1.2.7]# ./configure
[root@localhost zlib-1.2.7]# make
[root@localhost zlib-1.2.7]# make install

安装pcre-8.21.tar.gz

[root@localhost mrms]# tar -zxvf pcre-8.21.tar.gz
[root@localhost mrms]# cd pcre-8.21
[root@localhost pcre-8.21]# ./configure
[root@localhost pcre-8.21]# make
[root@localhost pcre-8.21]# make install

安装 nginx-1.2.6.tar.gz

[root@localhost mrms]# tar -zxvf nginx-1.2.6.tar.gz
[root@localhost mrms]# cd nginx-1.2.6
[root@localhost nginx-1.2.6]# ./configure --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-fips-2.0.2
[root@localhost nginx-1.2.6]# make
[root@localhost nginx-1.2.6]# make install

检测是否安装成功

[root@localhost nginx-1.2.6]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ./nginx -t

若是是以下的结果的话,就代表安装成功啦
安装成功

启动nginx

[root@localhost sbin]# ./nginx

查看端口

[root@localhost sbin]# netstat -ntlp
端口使用

静态HTTP服务器

首先,Nginx是一个HTTP服务器,能够将服务器上的静态文件(如HTML、图片)经过HTTP协议展示给客户端。
配置:
静态资源服务

反向代理服务器

什么是反向代理?
客户端原本能够直接经过HTTP协议访问某网站应用服务器,若是网站管理员在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,而后将结果返回给客户端,此时Nginx就是反向代理服务器。
反向代理
反向代理配置:
反向代理
既然服务器能够直接HTTP访问,为何要在中间加上一个反向代理,不是画蛇添足吗?反向代理有什么做用?继续往下看,下面的负载均衡、虚拟主机,都基于反向代理实现,固然反向代理的功能也不只仅是这些。

负载均衡

当网站访问量很是大,也摊上事儿了。由于网站愈来愈慢,一台服务器已经不够用了。因而将相同的应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其余服务器正常运行,就不会影响用户使用。
Nginx能够经过反向代理来实现负载均衡
负载均衡
负载均衡配置:
负载均衡配置

虚拟主机

有的网站访问量大,须要负载均衡。然而并非全部网站都如此出色,有的网站,因为访问量过小,须要节省成本,将多个网站部署在同一台服务器上。
例如将www.aaa.comwww.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,可是用户经过两个域名却能够打开两个彻底不一样的网站,互相不影响,就像访问两个服务器同样,因此叫两个虚拟主机。
配置:
虚拟主机
在服务器8080和8081分别开了一个应用,客户端经过不一样的域名访问,根据server_name能够反向代理到对应的应用服务器。
虚拟主机的原理是经过HTTP请求头中的Host是否匹配server_name来实现的,有兴趣的同窗能够研究一下HTTP协议。
另外,server_name配置还能够过滤有人恶意将某些域名指向你的主机服务器。

FastCGI

Nginx自己不支持PHP等语言,可是它能够经过FastCGI来将请求扔给某些语言或框架处理(例如PHP、Python、Perl)。
FastCGI
配置中将.php结尾的请求经过FashCGI交给PHP-FPM处理,PHP-FPM是PHP的一个FastCGI管理器。有关FashCGI能够查阅其余资料,本篇再也不介绍。
fastcgi_pass和proxy_pass有什么区别?
下面一张图带你看明白:
FastCGI

Nginx经常使用命令

1, 启动 Nginx

poechant@ubuntu:sudo ./sbin/nginx

2,中止 Nginx

poechant@ubuntu:sudo ./sbin/nginx -s stoppoechant@ubuntu:sudo ./sbin/nginx -s quit
-s都是采用向 Nginx 发送信号的方式。

3,Nginx 重载配置

poechant@ubuntu:sudo ./sbin/nginx -s reload
或者使用:
poechant@ubuntu:service nginx reload

4,指定配置文件

poechant@ubuntu:sudo ./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
-c表示configuration,指定配置文件。

5,查看 Nginx 版本

poechant@ubuntu:/usr/local/nginx$ ./sbin/nginx -v
或者使用:
poechant@ubuntu:/usr/local/nginx$ ./sbin/nginx -V

6,检查配置文件是否正确

poechant@ubuntu:/usr/local/nginx$ ./sbin/nginx -t

7, 显示帮助信息

poechant@ubuntu:/user/local/nginx$ ./sbin/nginx -h
或者使用:
poechant@ubuntu:/user/local/nginx$ ./sbin/nginx -?

负载均衡实战

upstream test.miaohr.com {
server 192.168.232.132:80;
server 192.168.232.133:80;
}
server {
listen 80;
server_name test.miaohr.com;
charset utf-8;
location / {
root html;
index index.html index.htm;
proxy_pass http://test.miaohr.com;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
location ~ ^/(WEB-INF)/ {
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html/;
}
}

  1. 轮询(默认)
    每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。
  2. weight
    指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。

    upstream bakend {
    server 192.168.159.10 weight=10;
    server 192.168.159.11 weight=10;
    }

  3. ip_hash
    每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。

    upstream resinserver{
    ip_hash;
    server 192.168.159.10:8080;
    server 192.168.159.11:8080;
    }

  4. air(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    upstream resinserver{
    server server1;
    server server2;
    fair;
    }

  5. url_hash(第三方)
    按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
    例:在upstream中加入hash语句,server语句中不能写入weight等其余的参数,hash_method是使用的hash算法

    upstream resinserver{
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
    }

  • down 表示单前的server暂时不参与负载
  • weight 默认为1.weight越大,负载的权重就越大。
  • max_fails :容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
  • fail_timeout:max_fails次失败后,暂停的时间。
  • backup: 其它全部的非backup机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。
    nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
  • client_body_in_file_only 设置为On 能够讲client post过来的数据记录到文件中用来作debug
  • client_body_temp_path 设置记录文件的目录 能够设置最多3层目录
  • location 对URL进行匹配.能够进行重定向或者进行新的代理 负载均衡

总结

关于nginx的前因后果就这么多,其实只须要知道怎么安装使用和负载均衡的使用就够啦,基本上全部的要点都已经在上面讲啦

相关文章
相关标签/搜索