反向代理
本篇内容概要
不知道大家有没有问过别人,或者是自己偷偷在网上搜过类似 “什么是正向和反向代理“ 类似的问题,即使问过、搜过是不是也很懵?
总结一句粗话:正向代理就是代理客户端的代理服务,反向代理就是代理服务端的代理服务。
那我们今天就来掰扯掰扯这个问题。
VPN 和正向代理
小明:“你昨天看了我给你发的视频链接了吗?超级好看哟!”。
小丽:“哦,那个链接根本打不开呀,看个pi!”,小明失望的看了看小丽。
小明:“好吧,肯定是你没有使用 VPN 软件,所以你看不了…”。
相信你也有经历过类似的场景,朋友给了一个需要你拥有 VPN 才能打开的链接,无论你是万兆光纤也好还是亿兆光纤也罢,死活都无法打开。
这里所说的 VPN 就是人们通常所说的正向代理服务器,VPN(虚拟私人网络 Virtual Private Network
),是一种加密通讯技术。VPN 有很多的具体实现,比如 PPTP
、L2TP
、IPSec
和 openvpn
。VPN 不是为了翻墙而生的,他只是一中技术,就好比菜刀本来是用来切菜的道理一样。使用 VPN 来爬楼梯基本已经作废了,但当大家谈及 fanqiang 的时候说得最多的还是 “你有好用的 VPN 吗?”,所以把 VPN 当成 fanqiang 工具的代名词也情有可原。
如果你有了 fanqiang 软件就可以轻松访问全世界的网站了,特别是程序员,可以在知识的海洋里遨游。简单来说正向代理服务器类似于下面图所示:
反向代理和 Nginx
这里可以给大家举个例子,假如你想让电信公司给你安装宽带或者网络电视,这个时候你可能需要打电话咨询一下相关的内容,于是你拿起了手机给电信公司打电话,经过一番复杂操作后终于可以等待人工服务了。电信的人工客服人员有很多,系统会根据一定的规则给你分配一个人,接下来可能是美眉也可能是汉子为你服务,究竟是谁给你提供语音服务取决与系统的分配,而不是你可以决定的。
系统分配和调度的功能就类似于反向代理服务器,对用户来说没有感知。类似于下面图所示:
在软件设计中,服务端开发经常会用到反向代理服务器,比如 Nginx
、Apache
等,它们经常也被用作为 WEB 服务器,Nginx
被当做代理服务器比较多,所谓的代理服务器是架设在 WEB 服务器和网络中断(比如手机客户端)之间的服务器,换句话说,Nginx
提供了反向代理服务的能力。
由于 Nginx
和 Apache
各自的优势,现在很多开发者选择让两者在服务器中共存。在服务器端让 Nginx
在前 Apache
在后,由 Nginx
做负载均衡和反向代理,并且处理静态文件,将动态请求交给 Apache
去处理。
下图是一个典型的 Nginx
作为反向代理服务器部署 ELK
的架构图,如下:
用 Nginx
的反向代理,用户可以从外部访问到 Kibana
,并且它本身具有负载均衡的作用,也能够提高了其性能。
再看一个微服务架构中的架构图(在网关前面也部署了 Nginx),如下图所示:
关于 Nginx
作为负载均衡器的配置和实例,下一次跟大家分享。你现在只需要聚焦在 Nginx
作为反向代理服务器上面的功能即可。
Nginx 配置反向代理
Nginx
本身已经提供了反向代理服务的能力,下面我们结合实例给大家分享一下,假设你本机已经安装了 Nginx
并且会基本的操作命令。
1、启动 Nginx
1 | sudo nginx |
在浏览器打开 http://localhost:80
,确保 Nginx
启动成功。
2、配置 host
我们配置一下本机的 host,vim 编辑即可。
1 | sudo vim /etc/hosts |
增加下面一行:
1 | 127.0.0.1 www.ithome.com |
在浏览器打开 http://www.ithome.com:80
,跟刚才显示一样的WEB 界面。
3、配置 Nginx
编辑 Nginx
配置,如下:
1 | sudo vim /usr/local/etc/nginx/nginx.conf |
在 http {
节点下增加下面内容:
1 | server { |
重新启动 Nginx
,重新加载配置文件,操作命令如下:
1 | sudo nginx -s reload |
在浏览器打开 http://www.ithome.com:80
,此时打开的是百度首页。至此,简单的配置 Nginx
作为反向代理服务器的功能已经完成,当然想配置好 Nginx
还需要大家多去实践和看官方技术手册。
proxy_pass
默认使用的是 http 1.0
,可以通过 proxy_http_version
指令让它使用 http 1.1
,以便开启 keepalive
之类的功能。官方说明 如下:
1 | Sets the HTTP protocol version for proxying. By default, version 1.0 is used. |
另外,nginx 还可以设置透明代理,可以参考 IP Transparency and Direct Server Return with NGINX and NGINX Plus as Transparent Proxy 这篇文章。
附录:Nginx 命令
1、查看 nginx 的配置信息
1 | nginx -V |
注意:是大写字母 V
。
2、查看 nginx 版本信息
1 | nginx -v |
3、启动 nginx
1 | sudo nginx |
4、查看 nginx 进程
1 | ps -ef|grep nginx |
5、重启 nginx
1 | nginx -s reload |
6、完美停止 nginx
1 | kill -QUIT `cat /var/run/nginx.pid` |
7、快速停止 nginx
1 | kill -TERM `cat /var/run/nginx.pid` |
或者
1 | kill -INT `cat /var/run/nginx.pid` |
8、完美停止工作进程,主要用于平滑升级
1 | kill -WINCH `cat /var/run/nginx.pid` |
9、强制停止 nginx
1 | pkill -9 nginx |
10、检查 nginx.conf 修改是否正确
1 | nginx -t |
11、停止 nginx 的命令
1 | nginx -s stop |
推荐阅读
不经历风雨怎么见彩虹,没有人能够随随便便成功~