反向代理

本篇内容概要

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

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

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

VPN 和正向代理

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

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

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

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

反向代理和 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 命令

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
2
3
4
5
6
7
nginx -s reload
```
**6、完美停止 nginx**
```sh
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

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

坚持原创技术分享!