摘要:本文从 Nginx 的概念出发,分别从反向代理的概念、优势、配置代码 3 个方面介绍了 Nginx 的特性之一反向代理。
文章来源:宜信技术学院 & 宜信支付结算团队技术分享第一期 - 宜信支付结算八方数据团队高级技术经理 周恒《Nginx 的细枝末节》
分享者:宜信支付结算八方数据团队高级技术经理 周恒
原文首发于支付结算技术团队公号:野指针
一、Nginx 概念解读
对于新事物的理解,最好的方式就是从概念入手,本文作为《Nginx 专题》系列文章的第一篇,先从 Nginx 的名称开始来分解这个神秘的引擎。
Nginx,是 engine X 的缩写,发音也是 ’engine x’,2004 年由俄罗斯大神伊戈尔·赛索耶夫开发,提供了高性能而易用的 HTTP 反向代理功能。后期还加入了 TCP 的反向代理支持。
最初 Nginx 是为了解决早年的 C10K 问题而生的。什么是 C10K 呢?C 代表 Client 客户、10K 代表 10000,即一台服务器同时保持 1 万链接。这在当时是一个非常棘手的问题。
通过 Google 搜索 Nginx 会得到以下解释:
Nginx 是异步框架的网页服务器,也可以用作反向代理、负载平衡器和 HTTP 缓存。
从这句话中,我们可以得到下面几个关键:
- 异步框架
- 反向代理
- 负载均衡
- HTTP 缓存
本专题文章将分别从这几个关键词来解读 Nginx 的强大之处。本文先介绍 Nginx 特性之反向代理及其配置实现。
二、反向代理
2.1 什么是反向代理
代理在生活中非常常见,房屋中介是代理、终端零售是代理、选举代表是代理。这些代理都可以帮助需求方减轻很多工作的复杂度,提升效率和体验。
网络里的代理服务是什么样子,我想各位读者也非常清楚,这里再简单回顾一下:假设我们想在公司上网看 B 站的视频,而规范的公司出于安全和办公效率的考虑,设置了网络策略,不允许访问视频网站,聪明的程序员不可能被这些事情所打败,只要购买一台云服务,搭建代理服务,把浏览器设置上代理,就可以轻松访问视频网站。这就是常见的代理。
那么现在问题来了:“代理”大家都懂,这里为什么强调是反向代理呢?难道还有正向代理?答案是肯定的。
正向代理就是大家常见的代理,以请求端也就是客户端的角度为正向,用户发出请求经过的代理,称为“正向代理”。这时是用户主动选择使用代理。
反向代理:先看图再解释。
主动权被反转,原来是客户端选择代理,现在是代理选择服务端节点。由于控制权的反转,这样的代理被称为“反向代理”。
2.2 反向代理的优点
1)保护服务安全
- 隐藏服务节点的 IP;
- 将服务节点置于防火墙之后,避免直接攻击业务节点服务器。
2)服务节点更专注于业务,同时提升性能
- 由于有反向代理的存在,可以让反向代理服务器去实现比如 https、gzip 压缩等与业务无关的功能;
- 提供动静态分离,将静态文件发往静态服务器或本地文件系统,避免业务节点处理这些与业务无关的请求;
- 提供缓存机制,将一些短时间内不会变化的动态内容,在反向代理服务器这层增加缓存,降低业务服务器的请求量;
- 由于控制权在代理服务这边,完全可以根据服务节点的性能动态分配请求,做到服务节点性能最佳。
正是由于 Ngxin 引入了反向代理的特性,让请求和响应都要经过 Nginx,因此给 Nginx 带来了非常多的可能。比如负载均衡、HTTP 缓存等。
三、反向代理的配置
Nginx 中关于反向代理的配置相当简单。
3.1 配置一个单节点的反向代理
# simple reverse-proxy
server {
listen 80;
server_name big.server.com;
access_log logs/big.server.access.log main;
# pass requests for dynamic content to rails/turbogears/zope, et al
location / {proxy_pass http://127.0.0.1:8080;}
}
这里定义的规则是以 big.server.com 域名来请求 Nginx 的 80 端口,会将请求代理到 127.0.0.1:8080 上。
3.2 配置一组反向代理的服务节点。
1)配置一组反向代理并命名。
upstream big_server_com {
server 192.168.0.1:8000;
server 192.168.0.1:8001;
}
这里定义了 upstream,这个 upstream 可以理解为上传流,之所以叫上传是因为:从服务器获取数据叫下载,向服务器发送数据就叫上传,这里是将数据请求发送到服务节点,所以叫上传。
给这组服务节点命名为 big_server_com,其中包括两个节点,分别是:192.168.0.1:8000 和 192.168.0.1:8001。
2)配置规则:让满足的请求能够反向代理到这组服务节点中。
server {
listen 80;
server_name big.server.com;
access_log logs/big.server.access.log main;
location / {proxy_pass http://big_server_com;}
}
这里定义的规则是以 big.server.com 域名来请求 Nginx 的 80 端口,请求 url 是以 / 为后缀的所有请求,都会转发到前面定义的名字为 big_server_com 的服务节点组。
四、总结
本文从 Nginx 的概念出发,分别从反向代理的概念、优势、配置代码 3 个方面介绍了 Nginx 的特性之一反向代理。后续文章将继续介绍 Nginx 的另外三个特性:负载均衡、HTTP 缓存、异步框架,敬请期待。