Nginx篇(一)
什么是 Nginx?
- Nginx 读作 “engine-ex”。
- Nginx 是由俄罗斯程序员 Igor Sysoev 编写,2004年10月作为一个试图回答公众发布 C10K 问题。其中 C10k 是同时管理 10,000 个连接的挑战。Nginx 采用了事件驱动和异步架构,此设计使 Nginx 成为可扩展、高性能的服务器。
- 它是一个开源、轻量级和高性能的 Web 服务器,也用作 HTTP、HTTPS、SMTP、IMAP、POP3 协议的反向代理服务器,另一方面,它也用作 IMAP、POP3 和 IMAP 的 HTTP 负载均衡器、HTTP 缓存和电子邮件代理。
- 简而言之,我们可以说 Nginx 是一种用于处理并发请求的软件。
为什么要使用 Nginx?
随着当今互联网的迅速发展,单点服务器早已无法承载上万个乃至数十万个用户的持续访问。比如一台Tomcat服务器在理想状态下只能够可以承受住2000个左右的并发量,为了解决这个问题,就需要多台Tomcat服务器来进行负载均衡。
那么,应该如何实现负载均衡?Nginx就是其中的一种解决方案,当用户访问网站时,Nginx拦截到这个访问请求,并将其通过轮询的方式均匀地分配到不同的服务器上。
并且,在Nginx中有一种ip_hash策略,它可以获取到用户的真实IP,计算出hash值来选择服务器,这也是一种优秀的负载均衡方式。 所以,掌握Nginx成为了Web开发学习道路上不可缺少的一部分。
正向代理和反向代理
正向代理:
正向代理就是代理服务器介于用户客户端和目标服务器之间,用户指定想要获取的目标内容,通过客户端先向代理服务器发送请求,再由代理服务器发送到目标服务器,随后将获得的内容返回用户客户端。正向代理的情况下,客户端必须要进行一些需求设置,在有确定目标的前提下发送请求。
正向代理是代理用户客户端,为客户端发送请求,使真实的用户客户端对服务器不可见。它最典型的用途就是可以用来访问受地理限制的内容、保护用户隐私、帮助爬虫爬取数据、广告效果测试、网站测试等等。
反向代理:
反向代理是用户客户端发送请求于代理服务器,然后代理服务器将请求转发给相对的目标服务器,并将结果返回给客户端。对于客户端来说,它没有确定想要访问的目标服务器,这里的代理服务器就相当于是目标服务器,此时也不需要客户端进行任何的设置。
反向代理是代理服务器,为服务器收发请求,使得真实的服务器对于用户客户端不可见。它的作用是隐藏服务器的IP地址、提高访问速度、保持负载平衡、保护免受黑客攻击。
正向代理与反向代理的区别:
正向代理和反向代理都是介于用户客户端与服务器之间的,它在中间都起到了连接与保护的作用。它们的区别在于,正向代理是用户客户端代理,而反向代理是服务器代理,在代理对象不同的情况下,都可以起到隐藏信息的作用;其次,正向代理一般是用户客户端设置的,而反向代理是由服务器设置的。
正向代理与反向代理的应用很广泛,但总的来说,普通用户们日常使用的大多是正向代理,而反向代理则主要应用于网站服务器之中,适用于大公司业务处理。
Nginx 是如何工作的?
Nginx进程
nginx 在启动后,会以 daemon 的方式在后台运行,后台进程包含一个 master 进程和多个 worker 进程,worker 进程以非 root 用户运行,可以在配置文件中配置运行 worker 进程的用户。
master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。
worker 进程则是处理基本的网络事件。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。
总结其主要功能分别如下:
主进程(master process)的功能:
- 读取 Nginx 配置文件并验证其有效性和正确性
- 按照配置启动、管理和关闭工作进程
- 接受外界指令,比如重启、升级及关闭服务器等指令
- 不中断服务,实现平滑升级,重启服务并应用新的配置
- 开启日志文件
工作进程(woker process)的功能:
- 接收处理客户端的请求
- 将请求以此送入各个功能模块进行处理
- IO 调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户端的请求
- 接收主程序指令,比如重启、升级和退出等
master 进程:负责加载和分析配置文件、管理 worker 进程,平滑升级
worker 进程:接收客户端请求、将请求一次送入各模块过滤、I/O 调用、数据缓存、发送响应
cache相关进程:cache loader (缓存索引重建)与 cache manager( 缓存索引管理)组成
–Cache loader 在 Nginx 服务启动后由主进程生成,根据本地磁盘上缓存建立索引元数据库后退出。
–Cache manager 在元数据更新完成后,对元数据是否过期做出判断。
Nginx的模块结构
Nginx 的各种功能和操作都由模块来实现。Nginx 由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。Nginx 的模块从结构上分为核心模块、基础模块和第三方模块。
核心模块: HTTP 模块、EVENT 模块和 MAIL 模块
基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块
第三方模块: HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块及用户自己开发的模块。
这样的设计使 Nginx 方便开发和扩展,Nginx的模块默认编译进 nginx 中,如果需要增加或删除模块,需要重新编译 nginx,这一点不如 Apache 的动态加载模块方便,最新版本Nginx 已经支持动态模块