什么是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的安装
快速安装命令集合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | yum install pcre pcre-devel –y yum install openssl openssl-devel –y useradd nginx -M -s /sbin/nologin ./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2 --with-http_stub_status_module --with-http_ssl_module make&&make install ln -s /application/nginx1.6.2/ /application/nginx /application/nginx/sbin/nginx –t /application/nginx/sbin/nginx |
各个命令解释
- 安装前需要安装pcre库(兼容正则表达式)
1 | yum install pcre pcre-devel –y |
- 还需要安装openssl
1 | yum install openssl openssl-devel –y |
- 编译之前还需要创建一个用户
1 | useradd nginx -M -s /sbin/nologin |
- 编译安装:
1 2 3 | ./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2 --with-http_stub_status_module --with-http_ssl_module make&&make install |
- 安装完成后的检查与启动,重启
1 2 3 4 5 | /application/nginx/sbin/nginx –t /application/nginx/sbin/nginx /application/nginx/sbin/nginx –s reload |
- 注意:1、关闭防火墙:1/etc/init.d/iptables stop 或 service iptables stop
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功能模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Nginx http 功能模块 模块说明 Ngx_http_core_module 包括一些核心的http参数配置,对应Nginx的配合为HTTP区块部分 Ngx_http_access_module 访问控制模块,用来控制网站用户对Nginx的访问 Ngx_http_gzip_module 压缩模块,对Nginx返回的数据压缩,属于性能优化模块 Ngx_http_fastcgi_module FastCGI模块,和动态应用相关的模块,例如PHP Ngx_http_proxy_module Proxy 代理模块 Ngx_http_upstream_module 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查 Ngx_http_rewrite_module URL地址重写模块 Ngx_http_limit_conn_module 限制用户并发连接数及请求数模块 Ngx_http_limit_req_module 根据定义的key限制Nginx请求过程的速率 Ngx_http_log_module 访问日志模块,以指定的格式记录Nginx客户访问日志等信息 Ngx_http_auth_basic_module web认证模块,设置web用户通过账号,密码访问Nginx Ngx_http_ssl_module ssl模块,用于加密的http连接如https Ngx_http_stub_status_module 记录Nginx基本访问状态信息等的模块 |
nginx.conf详解
egrep -v "#|^$" nginx.conf.default >nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | worker_processes 1; #worker进程的数量 event { #事件区块的开始 worker_connections 1024; #每个worker进程支持的最大连接数 } #事件区块的结束 http { #http区块的开始 include mime.types; #nginx支持的媒体类型库文件 default_type application/octet-stream;#默认的媒体类型 sendfile on; #开启高效传输模式 keepalive_timeout 65; #连接超时 server { #第一个server区块开始,表示一个独虚拟主机站点 listen 80; #服务端口,默认80 server_name localhost; #提供服务的域名主机名 location / { #第一个location区块开始 root html; #站点的根目录,相当于Nginx的安装目录 index index.html index.htm; #默认的首页文件,如果多个用空格分开 } #第一个location区块结束 error_page 500 502 503 504 /50x.html;#出现对象http状态码时使用50x.html回应用户 location = /50x.html { root html; } } } |
Location 模块
location 模块的作用是根据用户请求的URI来执行不同的应用,匹配成功了进行相关的操作
什么是统一资源标示符URI(Uniform Resource Identifier):
是一个用于标识某一互联网资源名称的字符串,该种标识允许用户对任何的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。Web上可用的每种资源 HTML文档、图像、视频片段、程序等 - 由一个统一资源标识符进行定位。
Location基础语法
1 | location [ = | ~ | ~* | ^~ ] uri { ... } |
6种location格式的区别
1、^~ 特殊字符串匹配 匹配到相应的字符串后,不会对后面正则进行匹配
2、~* 正则匹配 不区分大小写
3、‘=‘ 精确查找
4、/xxx/ 普通字符串路径匹配
5、/ 根 当所有匹配结束 没有符合的 匹配默认的 / 根路径
6、~ 表示uri包含正则,并且区分大小写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | server { listen 80; server_name www.imdsx.cn; location / { return 401; } location = / { return 400; } location ^~ /bbb/ { return 402; } location ~* \.(gif|jpg|jpeg)$ { return 403; } location /aaa/ { return 502; } } |
实验一、输入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
1 2 3 4 5 6 | location ^ ~ / aaa / { return 400; } location ^ ~ / aaa / bbb / { return 401; } |
实验六、“^~”遵循最大匹配原则
nginx匹配了 400
nginx匹配了 401
重新改下location
1 2 3 4 5 6 | location /aaa/ { reutrn 400; } location = /aaa/ { return 401; } |
试验七、当最长匹配(^~)和精确匹配(=)相同时
nginx 匹配到了 401 匹配到了精确匹配(=)
Nginx对于静态文件的缓存配置
只要访问的是图片文件,就会根据图片的名称在image的这个目录中寻找
1 2 3 | location ~*.\.(jpg|gif|bmp|gif|png)$ { root image; # 注明我的文件存放的位置 默认以nginx的根目录算起 } |
为什么配置静态缓存?
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可以搭配使用
反向代理的配置设置
1 2 3 4 5 6 7 8 9 10 | proxy_pass http://xxxx # 通过proxy_pass 来声明要跳转upstream设置的名字 proxy_set_header Host $host; # 获取通过什么域名访问的主机 proxy_set_header X-Forwarded-Fori $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_connect_timeout 60; # 反向代理和后端节点服务器 链接超时时间 发起握手后的时间 proxy_send_timeout 60; # 后端服务器数据回传的超时时间 proxy_read_timeout 60; # Nginx 从后端读取数据的超时时间 proxy_buffer_size 4k; # 设定头部缓冲区大小 proxy_buffers 4 32k; # 设定缓冲的的数量和大小 proxy_busy_buffers_size 64k; # 当系统繁忙时 可使用该缓冲区的大小 proxy_temp_file_write_size 64k; # 临时缓存文件大小 |
代理缓存区设置(proxy_buffering)
proxy_buffering参数
1 | proxy_buffering on|off |
代理缓存的开启和关闭,不影响proxy_buffer_size的作用,只作用在proxy_buffers、proxy_busy_buffers_size
1 | proxy_buffer_size 4k |
接受服务器返回的第一个部分 response header 建议设置为proxy_buffers的一个buffer的大小
1 | proxy_buffers 4 4k |
设置buffer的数量和大小
1 | proxy_busy_buffers_size 8k |
nginx在接受服务器的数据的同时,并不是全部接受服务器回传的数据在返回客户端而是有部分数据在接收的同时返回客户端,返回的大小通过proxy_busy_buffers_size
设置,建议是单个buffer的两倍。如果缓冲区和busy缓冲区都满了则写到磁盘的临时文件中。通过下方的参数设置
1 | proxy_max_temp_file_size 1024m |
responser返回占满了所有buffer则存在temp_file下 而最多能接收的大小则通过proxy_max_temp_file_size设置 当涉及到磁盘存储时就涉及到IO的操作,则会影响到客户端体验的效果
1 | proxy_temp_file_write_size 8k |
是一次访问能写入的临时文件的大小,默认的大小单个buffer的2倍
生产中常见的网站状态码
1 2 3 4 5 6 7 8 9 10 11 12 13 | 状态码 详细描述说明 200-OK 服务器成功返回网页,这是成功的状态码 301-Moved Permanently 永久跳转,所请求的网页将永久跳转到被设定的新位置 403-Forbidden 禁止访问,虽然这个请求时合法的,但是服务器端因为匹配了预先设置的规则而拒绝相应客户端的请求, 此类问题一般为服务器或服务器权限配置不当所致 404-Not Found 服务器找不到客户端请求的指定页面,可能是客户端请求了服务器上不存在的资源所导致 500-Internal Server Error 内部服务器错误,服务器遇到了意料不到的情况,不能完成客户的请求, 这是一个较为笼统的报错,一般为服务器的设置或内部程序问题导致 502-Bad Gateway 坏的网关,一般是代理服务器请求后端服务时,后端服务不可用或没有完成相应网关服务器, 这通常为反向代理服务器下面的节点出问题导致 503-Service Unavailable 服务当前不可用,可能是服务器超载或停机维护导致的,或者是反向代理没有可以提供的服务节点 504-Gateway Timeout 网关超时,一般是网关代理服务器请求后端服务时,后端服务没有在特定的时间内完成处理请求, 多数是服务器过载导致没有在指定的时间内返回数据给前端代理服务器 |