正向代理和反向代理,一次说清

作为一个Web前端开发人员,一些服务器端的知识也是必不可少的。我之前也有了解过服务器端,可是对有的东西仍是一知半解的。今天在知乎中看到一篇文章,把正向代理和反向代理讲解的很透彻。由此,我便想站在一个前端开发者的角度,谈谈正向代理和反向代理。

有哪些需求场景

先不谈概念,先说需求。

  1. 对于一个程序员来说,会科学上网是必不可少的。有的东西,在国内是访问不了的,那么如何访问像谷歌这样的网站呢?
  2. 有时候,我们写了一个前端应用(Web App),如何部署到服务器上呢?如果我们有多个应用,又如何部署呢?

这可能是大多数前端人员都会有的需求,因为我最近也是对第二个需求犯困。对于我们来说,可能最简单的方式就是直接托管到github上,我们知道,Github是可以开启静态页面功能的。注意这里的“静态”二字,也就是说,如果我们的应用需要连接数据库,需要实现后端路由(当然,也可以在前端实现路由技术),就需要我们自己部署服务器,并且写服务器端的代码。幸运的是,现在有了Node.js,我们可以直接通过JavaScript来写后端代码。这可能扯的有点远,有点超出前端的范畴了,但是,前端的终极目标是“全栈”啊。

由于JavaScript的越来越强大,原本应该在服务端做的事情,现在很多都是在前端来完成了。后面有时间会专门写一篇关于Vue的前端路由(vue-router)的文章。

正向代理和反向代理

原文看这里

正向代理

比如,客户端要访问Google,但是不直接去访问,而且让一个代理服务器去访问Google,然后代理服务器再将访问到的信息返回给客户端。这里的代理服务器所实现的功能就叫做正向代理

特点:Google并不知道是哪个客户端访问的。

根据这个特点,我们就可以在国外部署一个代理服务器,这个服务器有正向代理的功能。我们就可以通过这个代理服务器实现科学上网,盗一张图说明一下。

正向代理

反向代理

对于百度来说,服务器肯定不止一台,后面可能会有成千上万的服务器。当我们去访问百度服务器的时候,百度服务器会将我们的请求转发给背后的真实的服务器。这个过程中,百度服务器实现的功能就是反向代理

特点:客户端不知道访问的真实的服务器是哪一个。

反向代理

反向代理就是这个意思,至于如何实现反向代理,我也在摸索中,不过网上也有不少Nginx实现反向代理的教程。好吧,又得需要学习不少Nginx的知识,着实感觉自己在前端开发的大坑里越走越远、越走越偏了。

反向代理部署Web应用

Nginx是一个HTTP服务器,主要用来处理静态资源和作为反向代理,还有一个叫Apache的东西,不过现在好像用Nginx的多。

乱七八糟的概念

Nginx本质上就是一个运行在Linux服务器上的一个应用程序,它可以监听来自客户端的http请求,然后返回服务器上固定的资源(HTML文档、音视频、图片等)。

http的请求默认是80端口,所以一般Nginx只监听80端口(当然也可以监听其他端口),然后根据不同的路由参数或其他判断,反向代理到其他的服务器(真实的服务器)。比如,我们访问www.baidu.com的时候,从PC端和手机端访问的页面是不一样的。

部署Web应用

何为静态资源?就是服务器上存在的一个实实在在的文件,Nginx本身不会执行任何脚本语言,而是直接返回某个资源文件。很多时候,我们可能需要执行一些像phpPython等服务器脚本,通过这些脚本从数据库中获取数据,拼接成不同的HTML文件,最后返回给浏览器。

一个典型的例子就是Vue的服务端渲染,我们一般使用的可能都是浏览器直接渲染。但是对于一个复杂而庞大的Web应用,浏览器渲染显然不合适,这时候就需要部署一个Web服务器,可以是Node.js搭建的服务器,因为我们可以直接在服务器端使用JavaScript语言。然后,我们再通过Nginx服务器反向代理到我们的Web服务器

可能,这里有点迷惑:我们直接访问我们的Web服务器不就行了,干嘛还要通过Nginx服务器来作反向代理呢?

的确,我们也可以直接访问我们Web服务器。但是你想,一般我们可能只有一个域名,也就是说,对外只提供一个可访问的接口。用反向代理的话,我们就只需要对外提供Nginx服务器的访问链接。而我们的Web应用可能不止一个,你不可能为每一个Web应用都绑定一个域名吧。

其实就像前面说的,现在JavaScript越来越强大,很多原本在服务器端要做的事情在前端也能够完成。对于我们前端开发人员来说,只要后台提供数据接口,页面的动态渲染在前端完全可以自己实现。

正向代理实现科学上网

科学上网的工具有很多,我现在正在使用的是ShadowSocks(影梭)。至于服务器搭建教程网上真的很多,自行百度就好。

那么,首先你得有一台服务器,必须是国外或香港的服务器。这里有一些关于服务器的概念,我想有必要说一下:

  • VPS:Virtual Private Server,虚拟专用服务器。它是将一台真实的物理服务器通过一种虚拟化技术分成多个虚拟的服务器,俗称VPS。有独立的操作系统和IP地址。
  • 云服务器:跟VPS不同,它是通过多个CPU、内存、硬盘组成的,典型的就是阿里云服务器。比如我们可以动态的选择几核、多大内存、多大硬盘,并且它不受物理服务器的影响。有独立的操作系统和IP地址
  • 虚拟主机:也就是共享主机,它将一台真实的物理服务器分成多个主机,可以托管多个网站。它跟VPS最大的不同在于,没有独立的操作系统和IP地址,用户不能灵活地搭建自己想要的服务器,基本上只能用来做网站。

因此,基于以上的介绍,我们如果要搭建ShadowSocks服务器,就必须选择VPS或云服务器。我建议一般选择VPS就好了,便宜嘛,对于一个上网工具来说,足够了。如果我们要部署我们自己的服务器,建议选择云服务器,安全灵活。

后记

这篇文章写得有点乱,我现在也是正在研究这方面的东西,越到后面逻辑就越不清晰了,暂且就当作是自己的学习笔记好了。


正向代理和反向代理,一次说清
https://codingmo.com/article/20170810/325501537862/
作者
颜漠笑年
发布于
2017年8月10日
许可协议