--- 阅读时间约 20 分钟 ---
Nginx概述
众所周知,互联网已经离不开 WEB服务器 ,技术领域中 WEB服务器 不止 Nginx 一个,其他还有很多如 Apache 、 Tomcat 、 Lighthttpd 等,相信能看到这篇文章的友友们对这几个单词都不陌生。而 Nginx 因其高性能、轻量性、健壮性让技术大厂们无法忽视它的存在。
这是 Nginx 官网首页贴出的 Partners 名单,啥概念看图吧:
包括 由淘宝发起的项目 Tengine 、由章亦春发起 连锤子科技把T2发布会门票收入都捐赠的开源项目 OpenResty ,都是基于 Nginx 进行的定向开发。国内几乎所有大厂都使用到了 Nginx 技术,本章记录对 Nginx 与 WEB服务 的概念理解。
- WEB服务
“ WEB服务 ”,这个概念其实很简单,个人理解大致分为以下几个部分:
大部分程序员的工作就是下进行服务编写和项目搭构,再由 Nginx 这样的工具,对外持续提供服务,当然不仅是WEB服务,我们平时通过网络访问的绝大部分资源,其内部都有 Nginx 的身影。
Nginx 是一个高性能处理 HTTP协议 的服务软件,而互联网在我们日常生活中,凡是用于给用户展示的,绝大多数都是 HTTP协议 ,因此像 Nginx 这种以高性能稳定运行的解析HTTP协议软体理所当然会无处不在。当然如果仅仅是这样我们大可以用其他软体来代替, Nginx 真正的强大还不止于这些。
WEB服务器
- 概述
Nginx 本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用它来做服务器,同时现在也很流行动静分离,亦可通过它来实现。
- Nginx配置
server { listen 80; server_name localhost; location / { root e:/www/data; index index.html; } }
通过以上配置,我们在访问 http://localhost 时就会默认访问到 E://www/data 目录下的 index.html 。
- 应用场景
项目只有静态资源
- 实现方式
更改Nginx配置并启动,即可完成部署。
反向代理
- 概述
反向代理是大部分用户通过 Nginx 完成最多的一件工作, 反向代理(Reverse Proxy) 方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器处于同一个网络环境,当然也可能是同一台服务器的不同端口,这就是国内市场上大部分中小型企业的服务器中存在 Nginx 服务的原因,甚至隔壁 SegmentFault 也经常会全站访问 502 Bad Gateway —— Nginx xx.xx.xx(版本号)。
- Nginx配置
server { listen 80; server_name localhost; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host:$server_port; } }
- 应用场景
业务服务器不能直接被外部网络访问,即不能直接映射外网ip,需要一台代理服务器,而代理服务器能被外部网络访问同时又和业务服务器的网络相通。
- 实现方式
使用反向代理功能。将 Nginx 服务器映射外网ip,业务服务器无需映射,外网用户访问时首先访问 Nginx 服务器,然后再由 Nginx 服务器访问业务服务器资源后转发给用户,这是目前互联网服务器的主流方案,既满足了业务外网访问的需求,又保证了业务服务器的安全。
动静分离
- 概述
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好拆分后,我们就可以根据静态资源(如html、css、js、图片文件)的特点对其做缓存操作,这样就完成了网站静态化处理的核心思路。并且 Nginx 安装在服务器上的 http 和 反向代理服务组件,除了WEB服务意外还提供了 负载均衡 服务,这对用户访问服务器尤其在高并发的时候尤其关键,可以将用户访问静态资源和动态请求区分开,分配给不同的执行单元,提高响应速度,具体会在下文中提出。
- Nginx配置
upstream test{ server localhost:8080; server localhost:8081; } server { listen 80; server_name localhost; location / { root e:/wwwroot; index index.html; } # 所有静态请求都由nginx处理,存放目录为html location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ { root e:/wwwroot; } # 所有动态请求都转发给tomcat处理 location ~ .(do)$ { proxy_pass http://test; } error_page 500 502 503 504 /50x.html; location = /50x.html { root e:/wwwroot; } }
- 应用场景
项目对性能有要求,需要写出对并发和健壮性有要求的WEB服务。
- 实现方式
上述需求我们就可以使用静态服务器及反向代理模块,将静态资源由 Nginx 本地提供,动态资源反向代理到后端的 Tomcat 提供,其中 Tomcat 和 Nginx 可以在同一台服务器也可以在不同服务器中。
访问入口统一
- 应用场景
最近开发公司一个项目就是,不同地级市分别对应不同的业务首页,就是用 Nginx 实现的。多套业务系统使用同一个ip或者域名进行访问,以不同后缀进行区分,需要一台 Nginx 服务器做统一的访问入口。
- 实现方式
使用 Nginx 对入口项目进行部署,再使用反向代理模块将所有 Nginx 服务器作为外网或内网用户统一的访问入口,然后根据设置的 localtion 规则匹配不同的后缀转发至不同的业务服务器。通常和前文提到的反向代理场景结合使用实现一个域名来访问多个业务系统,同时甚至还可以实现统一的 https 访问,通过在 Nginx 服务器上配置证书,后端所有业务服务器无需每台额外配置证书即可实现 https 访问。
浏览器跨域
- 概述
将前后端项目都部署在服务器之后,因为请求和服务放在一起所以不存在跨域问题。但在非维护的开发时,如果后端没有为自己的服务提供跨域,我们必须自己来完成以请求数据来完成开发。不过我们在工作中并不是每个项目都使用了 webpack 或者引入了类似 http-proxy-middleware 的中间件,甚至还有可能维护 JSP 项目,所以我们有必要了解一个轻量级即开即用的跨域工具。
这一场景其实就是使用了 反向代理 模块,由于服务器不存在 同源策略 ,因此通过 Nginx 代理服务器将请求中转即可解决开发时临时请求跨域问题,这应该是前端开发用 Nginx 做的最多的事。详细请阅读我的另一篇文章:Nginx:多项目开发配置跨域代理
还有几个坑和重头菜明天再填,预告:
正向代理
负载均衡
行为分析