Nginx 的这些妙用,你都 get 到了吗?

Nginx 简介
Nginx 是一个免费、开源、高性能、轻量级的 HTTP 和反向代理服务器,也是一个电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强 。
Nginx 由内核和一系列模块组成,内核提供 Web 服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互 。
Nginx 的各种功能和操作都由模块来实现 。Nginx 的模块从结构上分为:

  • 核心模块:HTTP 模块、EVENT 模块和 MAIL 模块 。
  • 基础模块:HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块 。
  • 第三方模块:HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块及用户自己开发的模块 。
这样的设计使 Nginx 方便开发和扩展,也正因此才使得 Nginx 功能如此强大 。
Nginx 的模块默认编译进 Nginx 中,如果需要增加或删除模块,需要重新编译 Nginx,这一点不如 Apache 的动态加载模块方便 。
如果有需要动态加载模块,可以使用由淘宝网发起的 Web 服务器 Tengine,在 Nginx 的基础上增加了很多高级特性,完全兼容 Nginx,已被国内很多网站采用 。
Nginx 有很多扩展版本:
  • 开源版 nginx.org
  • 商业版 NGINX Plus
  • 淘宝网发起的 Web 服务器 Tengine
  • 基于 Nginx 和 Lua 的 Web 平台 OpenResty
Nginx 作为 Web 服务器
Web 服务器也称为 WWW(World Wide Web)服务器,主要功能是提供网上信息浏览服务,常常以 B/S(Browser/Server)方式提供服务:
  • 应用层使用 HTTP 协议 。
  • html 文档格式 。
  • 浏览器统一资源定位器(URL) 。
Nginx 可以作为静态页面的 Web 服务器,同时还支持 CGI 协议的动态语言,比如 Perl、php 等,但是不支持 JAVA 。
Java 程序一般都通过与 Tomcat 配合完成 。作为一名 Java 程序员,肯定要理解下 Nginx 和 Tomcat 的区别了 。
Nginx、Apache 和 Tomcat:
  • Nginx:由俄罗斯程序员 Igor Sysoev 所开发的轻量级、高并发 HTTP 服务器 。
  • Apache HTTP Server Project:一个 Apache 基金会下的 HTTP 服务项目,和 Nginx 功能类似 。
  • Apache Tomcat:是 Apache 基金会下的另外一个项目,是一个 Application Server 。更准确的说是一个 Servlet 应用容器,与 Apache HTTP Server 和 Nginx 相比,Tomcat 能够动态的生成资源并返回到客户端 。
Apache HTTP Server 和 Nginx 本身不支持生成动态页面,但它们可以通过其他模块来支持(例如通过 Shell、PHP、Python 脚本程序来动态生成内容) 。
一个 HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以在 Apache/Nginx 上你可以看到代理、负载均衡等功能 。
客户端通过 HTTP Server 访问服务器上存储的资源(HTML 文件、图片文件等等) 。
通过 CGI 技术,也可以将处理过的内容通过 HTTP Server 分发,但是一个 HTTP Server 始终只是把服务器上的文件如实的通过 HTTP 协议传输给客户端 。
而应用服务器,则是一个应用执行的容器 。它首先需要支持开发语言的运行(对于 Tomcat 来说,就是 Java),保证应用能够在应用服务器上正常运行 。
其次,需要支持应用相关的规范,例如类库、安全方面的特性 。对于 Tomcat 来说,就是需要提供 JSP/Sevlet 运行需要的标准类库、Interface 等 。
为了方便,应用服务器往往也会集成 HTTP Server 的功能,但是不如专业的 HTTP Server 那么强大 。
所以应用服务器往往是运行在 HTTP Server 的背后,执行应用,将动态的内容转化为静态的内容之后,通过 HTTP Server 分发到客户端 。
正向代理
正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理 。
正向代理“代理”的是客户端 。比如你想去 google 看个“动作片”,可国内不允许呀,就需要找翻墙代理,这个就是所谓的“正向代理” 。
Nginx 的这些妙用,你都 get 到了吗?

文章插图
 
反向代理与负载均衡
反向代理正好与正向代理相反,反向代理是指以代理服务器来接收 Internet 上的连接请求,然后将请求转发到内部网络上的服务器,并将服务器上得到的结果返回给客户端 。
此时代理服务器对外表现就是一个服务器,客户端对代理是无感知的 。反向代理“代理”的是服务端 。
【Nginx 的这些妙用,你都 get 到了吗?】再比如,你想本本分分的在“优酷”上看个“爱情片”,youku.com 会把你的请求分发到存放片片的那台机器上,这个就是所谓的“反向代理” 。


推荐阅读