nginx是一个高性能的http和反向代理web服务器,它的代码是由c语言写的,具有很好的可移植性, ngnix效率高,可以实现高并发,虽然相比较lvs次一些,nginx开十个进程也消耗不了多少,消耗内存小,配置文件简单,很便宜,开源的,支持reactive重写规则,内置间发检查功能,支持gzip压缩,把高清图片压缩,小图片可以查看原图,加快访问速率,稳定性比较高,和linux服务器一样,支持热部署,可以在线增加功能,正在运行也可以让他更新版本,模块非常全,而且它还是一个非常优秀的邮件代理服务
nginx的四大模块
- 二进制模块
在Nginx中,我 们可以编译出各种二进制,包括插件的二进制。就好比一辆汽车,Nginx的常规Web服务器功能是基础的配置,一些扩张的插件则是车上的空调、音响、倒车 影像等等功能。像OpenResty就是一款非常流行的Nginx插件,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
- 配置文件模块
在一辆汽车上,我们想要开启哪些功能,空调要开多冷,音响要开多大,都是由操作人员自己决定,非常灵活,Nginx也是如此。在Linux服务器上,我们一般可以在etc目录下找到Nginx的配置文件,如上图所示。user的含义是运 行的用户,worker_processes则是运行时的进程数。worker_connections则是运行时每一个进程的最大并发数,http则 是作为反向代理服务器一些常见的功能配置。Nginx的功能非常复杂,配置项也非常多,后面我们再来单独进行学习。
- 访问日志模块
access.log 可以看做是一个汽车的行车记录仪,准确的说是是低配版的,只能记录下行车的轨迹。Nginx的access.log可以记录下来http服务器的访问轨 迹,可以记录下每一次客户的访问,可以记录下用户的IP,用户访问的地址、返回的错误码、用户的UserAgent等等。开发与运维人员可以根据 access.log的情况,简单统计出服务器的运行情况。
- 异常日志模块
不知道你有没有遇 到过这样的问题,在线上重新启动一个JavaWeb服务,或者新建一个JavaWeb服务,但在浏览器中就是无法正常的访问,而在Java的日志中,又无 法找到异常日志,下一次,不如查一查Nginx的异常日志,或许有意外的收获。程序在运行时总是伴随着各种异常,Nginx也是如此,我们可以在 Nginx的Error.log中,找到对应的错误,并加以修复。
nginx的功能概述
HTTP基础功能:__
- 处理静态文件,索引文件以及自动索引;
- 反向代理加速(无缓存),简单的负载均衡和容错;
- FastCGI,简单的负载均衡和容错;
- 模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
- SSL 和 TLS SNI 支持;
__IMAP/POP3 代理服务功能:__
- 使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
- 使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
- 认证方法:
- POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
- IMAP: IMAP LOGIN;
- SMTP: AUTH LOGIN PLAIN CRAM-MD5;
- SSL 支持;
- 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;
__支持的操作系统:__
- FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
- Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
- Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
- MacOS X (10.4) PPC;
__结构与扩展:__
- 一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;
- kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;
- kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;
- sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;
- 输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
- 10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存。
- 最小化的数据拷贝操作;
__其他HTTP功能:__
- 基于IP 和名称的虚拟主机服务;
- Memcached 的 GET 接口;
- 支持 keep-alive 和管道连接;
- 灵活简单的配置;
- 重新配置和在线升级而无须中断客户的工作进程;
- 可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
- 4xx-5xx 错误代码重定向;
- 基于 PCRE 的 rewrite 重写模块;
- 基于客户端 IP 地址和 HTTP 基本认证的访问控制;
- PUT, DELETE, 和 MKCOL 方法;
- 支持 FLV (Flash 视频);
- 带宽限制;
nginx的进程信息
- Nginx采用了高度模块化的设计思路,并且内部的进程主要有俩类,master进程和worker进程,其中master进程只有一个,而worker进程可以有多个。
- master进程:是用来管理和监控控制其下面的worker进程的主进程,这个进程由root发起,其中原因就是http这个服务器需要启用80端口,而只有root才有权限启用80端口。
- worker进程才是真正的working进程,才是真正处理请求的进程。worker进程全部都是master进程的子进程。worker进程是以普通用户的身份进行运行的,这样就可以极大的增加程序的安全性。万一即使有一个进程被劫持,也不会有管理员权限。
- worker进程中,原生的功能只有最基本的web服务。但是由于Nginx是高度模块化的应用程序,所以,在每一个worker进程中,有着一个或者多个模块。但需要注意的是,装载的模块不是一次性加进去的,只有当这个进程需要这个模块的时候,才会被这个工作进程加载。
nginx应用
1. 正向代理
正向代理:内网服务器主动去请求外网的服务的一种行为
正向代理其实就是说客户端无法主动或者不打算完成主动去向某服务器发起请求,而是委托了nginx代理服务器去向服务器发起请
求,并且获得处理结果,返回给客户端。正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪
个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
从下图可以看出:客户端向目标服务器发起的请求,是由代理服务器代替它向目标主机发起,得到结果之后,通过代理服务器返
回给客户端
2. 反向代理
反向代理:reverse proxy,是指用代理服务器来接受客户端发来的请求,然后将请求转发给内网中的上游服务器,上游服务器处
理完之后,把结果通过nginx返回给客户端。
反向代理是对于来自外界的请求,先通过nginx统一接受,然后按需转发给内网中的服务器,并且把处理请求返回给外界客户端,
此时代理服务器对外表现的就是一个web服务器,客户端根本不知道“上游服务器”的存在。
4. 负载均衡
负载均衡:将服务器接收到的请求按照规则分发的过程,称为负载均衡。负载均衡是反向代理的一种体现。
1.9.0的时候,nginx增加了一个 stream 模块,用来实现四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟
http的用法类似,允许我们配置一组TCP或者UDP等 协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多
个后端服务,实现负载均衡。
nginx实现负载均衡有几种模式:
1.轮询:每个请求按时间顺序逐一分配到不同的后端服务器,也是nginx的默认模式。轮询模式的配置很简单,只需要把服务器列表加入到upstream模块中即可
2.ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
3.url_hash:按访问url的hash结果来分配请求,相同的url固定转发到同一个后端服务器处理。
4.fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5. 静态服务器
现在很多项目流行前后分离,也就是前端服务器和后端服务器分离,分别部署,这样的方式能让前后端人员能各司其职,不需要互相依赖,而前后分离中,前端项目的运行是不需要用Tomcat、Apache等服务器环境的,因此可以直接用nginx来作为静态服务器。
想要深入了解nignx,可以访问他的官网nginx.org