发布于 

反向代理

本篇内容概要

不知道大家有没有问过别人,或者是自己偷偷在网上搜过类似 “什么是正向和反向代理“ 类似的问题,即使问过、搜过是不是也很懵?

总结一句粗话:正向代理就是代理客户端的代理服务,反向代理就是代理服务端的代理服务。

那我们今天就来掰扯掰扯这个问题。

VPN 和正向代理

小明:“你昨天看了我给你发的视频链接了吗?超级好看哟!”。
小丽:“哦,那个链接根本打不开呀,看个pi!”,小明失望的看了看小丽。
小明:“好吧,肯定是你没有使用 VPN 软件,所以你看不了…”。

相信你也有经历过类似的场景,朋友给了一个需要你拥有 VPN 才能打开的链接,无论你是万兆光纤也好还是亿兆光纤也罢,死活都无法打开。

这里所说的 VPN 就是人们通常所说的正向代理服务器,VPN(虚拟私人网络 Virtual Private Network),是一种加密通讯技术。VPN 有很多的具体实现,比如 PPTPL2TPIPSecopenvpn。VPN 不是为了翻墙而生的,他只是一中技术,就好比菜刀本来是用来切菜的道理一样。使用 VPN 来爬楼梯基本已经作废了,但当大家谈及 fanqiang 的时候说得最多的还是 “你有好用的 VPN 吗?”,所以把 VPN 当成 fanqiang 工具的代名词也情有可原。

如果你有了 fanqiang 软件就可以轻松访问全世界的网站了,特别是程序员,可以在知识的海洋里遨游。简单来说正向代理服务器类似于下面图所示:

反向代理和 Nginx

这里可以给大家举个例子,假如你想让电信公司给你安装宽带或者网络电视,这个时候你可能需要打电话咨询一下相关的内容,于是你拿起了手机给电信公司打电话,经过一番复杂操作后终于可以等待人工服务了。电信的人工客服人员有很多,系统会根据一定的规则给你分配一个人,接下来可能是美眉也可能是汉子为你服务,究竟是谁给你提供语音服务取决与系统的分配,而不是你可以决定的。

系统分配和调度的功能就类似于反向代理服务器,对用户来说没有感知。类似于下面图所示:

在软件设计中,服务端开发经常会用到反向代理服务器,比如 NginxApache 等,它们经常也被用作为 WEB 服务器,Nginx 被当做代理服务器比较多,所谓的代理服务器是架设在 WEB 服务器和网络中断(比如手机客户端)之间的服务器,换句话说,Nginx 提供了反向代理服务的能力。

由于 NginxApache 各自的优势,现在很多开发者选择让两者在服务器中共存。在服务器端让 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
# 监听80端口号
listen 80;

# 监听访问的域名
server_name www.ithome.com;

# 根据访问路径配置
location / {
# 设置 http 版本
proxy_http_version 1.1;
proxy_set_header Connection "";
# 把请求转发到 https://www.baidu.com
proxy_pass https://www.baidu.com;
}
}

重新启动 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
2
3
Sets the HTTP protocol version for proxying. By default, version 1.0 is used. 

Version 1.1 is recommended for use with keepalive connections and NTLM authentication.

另外,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

推荐阅读


不经历风雨怎么见彩虹,没有人能够随随便便成功~


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

veryitman