什么是Nginx
Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的WEB服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx HTTP服务器的特色及优点
- 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
- 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
- 可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能
- 具备Squid等专业缓存软件等的缓存功能
- 支持异步网络I/O事件模型epoll
Nginx的主要企业功能
- 使用Nginx运行HTML,JS,CSS,小图片等静态数据(此功能类似Lighttpd软件)
- Nginx结合FastCGI运行php等动态程序(例如使用fastcgi_pass方式)
- Nginx结合Tomcat/Resin等支持Java动态程序(常用的proxy_pass)
Nginx作为web服务器的主要应用场景包括:
- 使用Nginx运行HTML,JS,CSS,小图片等静态数据(此功能类似Lighttpd软件)
- Nginx结合FastCGI运行php等动态程序(例如使用fastcgi_pass方式)
- Nginx结合Tomcat/Resin等支持Java动态程序(常用的proxy_pass)
一般情况下普通php引擎支持的并发连接参考为300-1000,Java引擎和数据库的并发连接参考值为300-1500.当然架构不同可能会有浮动
Nginx的安装
快速安装命令集合:
各个命令解释
- 安装前需要安装pcre库(兼容正则表达式)
- 还需要安装openssl
- 编译之前还需要创建一个用户
- 编译安装:
- 安装完成后的检查与启动,重启
- 注意:1、关闭防火墙:
2、关闭安全子系统(selinux)
a、查看selinux的状态:
可以通过/usr/sbin/sestatus –v 或者用命令 getenforce
Disabled为关闭
b、更改selinux的方式:
setenforce 0(临时关闭)
vi编辑/etc/selinux/config进行下面更改
SELINUX=disabled(永久关闭)
安装故障总结
安装故障处理:
故障一:没有安装pcre或pcre-devel
报错为:./configure: error: the HTTP rewrite module requires the PCRE library.
故障二:没有安装openssl和openssl-devel
报错为:./configure: error: SSL modules require the OpenSSL library.
故障三:nginx.pid文件缺失
执行:/application/nginx1.6.2/sbin/nginx -c /application/nginx1.6.2/conf/nginx.conf
重新指定下配置文件的位置
报错为:nginx: [error] open() "/application/nginx1.6.2/logs/nginx.pid" failed (2: No such file or directory)
如果yum报错请:
http://user.qzone.qq.com/616745045/2 按照上述文档进行配置
常用的Nginx http功能模块
nginx.conf详解
Location 模块
location 模块的作用是根据用户请求的URI来执行不同的应用,匹配成功了进行相关的操作
什么是统一资源标示符URI(Uniform Resource Identifier):
是一个用于标识某一互联网资源名称的字符串,该种标识允许用户对任何的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。Web上可用的每种资源 HTML文档、图像、视频片段、程序等 - 由一个统一资源标识符进行定位。
Location基础语法
6种location格式的区别
1、^~ 特殊字符串匹配 匹配到相应的字符串后,不会对后面正则进行匹配
2、~* 正则匹配 不区分大小写
3、‘=‘ 精确查找
4、/xxx/ 普通字符串路径匹配
5、/ 根 当所有匹配结束 没有符合的 匹配默认的 / 根路径
6、~ 表示uri包含正则,并且区分大小写
实验一、输入www.imdsx.cn
nginx代理走的是精确匹配所有走到了400(这里多提一句,当多次使用的路径时 可以使用精确匹配方式,加快匹配速度提高性能)
实验二、输入http://www.imdsx.cn/123456
nginx所有location都没有匹配到找到了默认的根 也就是401
实验三、输入http://www.imdsx.cn/1.gif
nginx匹配的事正则 *.gif 也就走到了 403
组合实验
实验四、输入www.imdsx.com/aaa/1.gif
同时存在普通路径、和正则的情况下nginx又是如何匹配的呢?
nginx匹配的是正则,因为nginx在匹配时会先记录最高匹配度的普通uri,再去匹配正则,如果正则有匹配的则展示正则,否则展示普通uri
实验五、输入www.imdsx.cn/aaa/1.abc
我们输入了一个不符合正则的URI nginx匹配到了普通URI 502错误
实验五、输入www.imdsx.com/bbb/1.gif
nginx这时匹配的是402错误,^~ 方式如果匹配到普通uri后就不在继续正则匹配
重新改下location
实验六、“^~”遵循最大匹配原则
nginx匹配了 400
nginx匹配了 401
重新改下location
试验七、当最长匹配(^~)和精确匹配(=)相同时
nginx 匹配到了 401 匹配到了精确匹配(=)
Nginx对于静态文件的缓存配置
只要访问的是图片文件,就会根据图片的名称在image的这个目录中寻找
为什么配置静态缓存?
1、为了提高响应速度
2、减轻真实服务器的负载
对于静态资源(长久使用不变动的文件或图片)我们可以在反向代理服务器中进行缓存,nginx在跳转时只要匹配到了缓存中的文件,讲直接通过nginx返回给客户端,如果没有则在下发到个服务器进行处理。大大优化了客户的访问速度和对真是服务器所造成的真实压力
upstream模块
Upstream的牛逼之处在于,它解决了nginx跨越单机的限制,完成网络数据的接收、处理和转发。实现了负载均衡的能力。数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。在云模型大行其道的今天,数据转发使nginx有能力构建一个网络应用的关键组件。
Upstream的四种命中机制
1、ip_hash;
iphash 能够避免同一个客户端连续的web请求分发到多个机器 涉及到session校验问题 通过iphash解决该问题
2、least_conn;
请求分发到最少连接数的服务器上
3、Round Robin(轮训)
默认是轮训机制,当有服务器down掉,就从负载列表清除掉
轮询时默认的weight=1;
4、Weight(权重)(weighted round robin)
基于权重的反向代理 weight值越大越有几率被分配
在实际应用中iphash和weight可以搭配使用
反向代理的配置设置
代理缓存区设置(proxy_buffering)
proxy_buffering参数
代理缓存的开启和关闭,不影响proxy_buffer_size的作用,只作用在proxy_buffers、proxy_busy_buffers_size
接受服务器返回的第一个部分 response header 建议设置为proxy_buffers的一个buffer的大小
设置buffer的数量和大小
nginx在接受服务器的数据的同时,并不是全部接受服务器回传的数据在返回客户端而是有部分数据在接收的同时返回客户端,返回的大小通过proxy_busy_buffers_size 设置,建议是单个buffer的两倍。如果缓冲区和busy缓冲区都满了则写到磁盘的临时文件中。通过下方的参数设置
responser返回占满了所有buffer则存在temp_file下 而最多能接收的大小则通过proxy_max_temp_file_size设置 当涉及到磁盘存储时就涉及到IO的操作,则会影响到客户端体验的效果
是一次访问能写入的临时文件的大小,默认的大小单个buffer的2倍