当前位置:首页 > 社会百态 > 正文

手机代理服务器是什么(自己建代理服务器)

手机代理服务器是什么(自己建代理服务器)

上述命令会用提供的脚本启动 Pipy 服务器。敏锐的用户可能已经注意到,我们通过环境变量PIPY_CONFIG_FILE提供了一个远程 Pipy 脚本的链接,而不是一个本地文件,Pipy 足够智能,可以处理这种情况。


下面是tutorial/01-hello/hello.js文件的内容,供参考:

pipy().listen(8080) .serveHTTP( new Message('Hi, there!\') )

在这个脚本中,我们定义了一个端口管道,它监听 8080 端口,并为从监听端口收到的每个 HTTP 请求返回“Hi, there!”。


既然我们已经通过上面的docker run命令暴露了本地 8080 端口,那么我们可以在同一端口上进行测试了:

$ curl http://localhost:8080

执行上述命令,控制台中应该显示“Hi, there!”。


如果是出于学习、开发或调试的目的,建议在本地安装 Pipy(从源代码构建 Pipy 或针对你的操作系统下载一个预构建版本),因为它提供了 Web 管理控制台以及相关的文档和教程。


安装到本地后,运行pipy,不需要任何参数,就可以在6060端口启动管理控制台,但如果要监听不同的端口,可以通过--admin-port=参数配置。


监听 6060 端口的 Pipy 管理控制台


要从源代码构建 Pipy 或针对你的操作系统安装预编译的二进制文件,请参考PipyGitHub 库的 README.md 文件。

要启动 Pipy 代理,可以用一个 PipyJS 脚本文件运行 Pipy。例如,如果需要一个简单的回显服务器,针对每个传入的请求都用所接收到的消息体进行响应,那么就用脚本tutorial/01-hello/hello.js:

$ pipy tutorial/01-hel lo/hello.js

另外,在开发和调试时,可以启动带有内置 Web UI 的 Pipy:

$ pipy tutorial/01-hello/hello.js --admin-port=6060显示命令行选项

$ pipy --help列出内置过滤器及其参数

$ pipy --list-filters$ pipy --help-filters

前文从概念和技术上对 Pipy 做了一个简短的介绍,这些内容也是我们实现一个支持缓存和负载均衡的网络代理所需要了解的,这一点我们在下一节会看到。

假设我们正在运行不同服务的单独实例,我们想要添加一个代理,根据请求的 URL 路径将流量转发到相关服务。这样做的好处是,我们只需要提供一个 URL,并在后端扩展我们的服务,而用户不需要分别记住不同服务的 URL。在正常情况下,服务会在不同的节点上运行,每个服务可以有多个实例在运行。假设在这个例子中,我们正在运行下面的服务,我们希望根据 URI 将流量分配给它们。

服务

URI

主机:端口

service-hi

/hi/*

"127.0.0.1:8080", "127.0.0.1:8082"

service-echo

/echo

"127.0.0.1:8081"

service-tell-ip

/ip/*

"127.0.0.1:8082"


好了,让我们启动一个 Pipy 实例,不需要任何参数,这样,Pipy 管理控制台将在 6060 端口启动。现在,打开你喜欢的 Web 浏览器,导航到 http://localhost:6060,就会看到 Pipy 内置的 Web 端管理 UI(如图 1)。

将代码和配置分开是一种很好的设计实践。Pipy 通过插件(你可以把它想成是 JavaScript 模块)来支持这种模块化设计。也就是说,我们将把配置数据存储在 config 文件夹下,把编码逻辑存储在 plugins 文件夹下不同的文件中。主代理服务器脚本将存储在根目录下,主代理脚本(proxy.js)将包含并组合这些单独的模块所定义的功能。 一旦我们完成了下述步骤,最终的文件夹结构将是下面这个样子:

├── config│ ├── balancer.JSON│ ├── proxy.json│ └── Router.json├── plugins│ ├── balancer.js│ ├── default.js│ └── router.js└── proxy.js

让我们开始吧:

{ "listen": 8000, "plugins": [ "plugins/router.js", "plugins/balancer.js", "plugins/default.js" ]}

  1. 重复步骤 2 和 3,创建另一个文件/config/router.json,它将存储路由信息,配置数据如下:

{ "routes": { "/hi/*": "service-hi", "/echo": "service-echo", "/ip/*": "service-tell-ip" }}

  1. 重复步骤 2 和 3,创建另一个文件/config/balancer.json,它将存储服务到目标的映射信息,内容如下:

{ "services": { "service-hi" : ["127.0.0.1:8080", "127.0.0.1:8082"], "service-echo" : ["127.0.0.1:8081"], "service-tell-ip" : ["127.0.0.1:8082"] }}

  1. 现在,我们编写第一个 Pipy 脚本,当我们收到一个没有配置任何目标(端点/url)的请求时,它将被用作默认的后备选项。重复上述步骤,创建文件/plugins/default.js。使用 default 作为文件名只是一个习惯做法,并不是 Pipy 的要求,你可以选择任何你喜欢的名字。该脚本将包含如下代码,返回 HTTP 状态代码 404,信息为 No handler found:

pipy().pipeline('request') .replaceMessage( new Message({ status: 404 }, 'No handler found') )

  1. 创建/plugins/router.js文件,存储路由逻辑:

(config =>pipy({ _router: new algo.URLRouter(config.routes),}).export('router', { __serviceID: '',}).pipeline('request') .handleMessageStart( msg => ( __serviceID = _router.find( msg.head.headers.host, msg.head.path, ) ) ))(JSON.decode(pipy.load('config/router.json')))

  1. 创建/plugins/balancer.js文件,存储了我们的负载均衡逻辑。顺便说明一下,Pipy 提供了多种负载均衡算法,但简单起见,我们这里将使用 Round Robin 算法。

(config =>pipy({ _services: ( Object.fromEntries( Object.entries(config.services).map( ([k, v]) => [ k, new algo.RoundRobinLoadBalancer(v) ] ) ) ), _balancer: null, _balancerCache: null, _target: '',}).import({ __turnDown: 'proxy', __serviceID: 'router',}).pipeline('session') .handleStreamStart( () => ( _balancerCache = new algo.Cache( // k is a balancer, v is a target (k ) => k.select(), (k,v) => k.deselect(v), ) ) ) .handleStreamEnd( () => ( _balancerCache.clear() ) ).pipeline('request') .handleMessageStart( () => ( _balancer = _services[__serviceID], _balancer && (_target = _balancerCache.get(_balancer)), _target && (__turnDown = true) ) ) .link( 'forward', () => Boolean(_target), '' ).pipeline('forward') .muxHTTP( 'connection', () => _target ).pipeline('connection') .connect( () => _target ))(JSON.decode(pipy.load('config/balancer.json')))

  1. 现在,我们来编写入口点或代理服务器脚本,它会使用上述插件。创建一个新的代码库(步骤 1),这个过程会创建一个默认的main.js文件作为入口点。我们可以用它作为我们的主入口点,或者如果你希望换个名字,可以随时删除main.js,然后用你选的名字新建一个文件。让我们删除它并新建一个名为/proxy.js的文件。务必点下顶部的旗标,将其设置为主入口点,这可以确保在你点击运行按钮(右侧的箭头图标)时开始执行脚本:

(config =>pipy().export('proxy', { __turnDown: false,}).listen(config.listen) .use(config.plugins, 'session') .demuxHTTP('request').pipeline('request') .use( config.plugins, 'request', 'response', () => __turnDown ))(JSON.decode(pipy.load('config/proxy.json')))

如果你已经按照上面的步骤进行了操作,就可以看到类似于以下截图的东西:



现在,我们点击播放图标按钮(右起第四个)来运行我们的脚本。如果脚本没有任何错误,我们将看到 Pipy 运行我们的代理脚本,输出类似下面这样:



这表明我们的代理服务器正在监听 8000 端口(这是在/config/proxy.json中配置的)。我们用 curl 来运行一个测试:

$ curl -i http://localhost:8000HTTP/1.1 404 Not Foundcontent-length: 10connection: keep-aliveNo handler found

这没问题,因为我们没有为 root 配置任何目标。让我们试下配置过的路由,如/hi:

$ curl -i http://localhost:8000/hiHTTP/1.1 502 Connection Refusedcontent-length: 0connection: keep-alive

我们看到了 502 Connection Refused 这个消息,因为我们没有在配置的目标端口上运行服务。


你可以更新/config/balancer.json,加入你已经运行的服务的主机、端口等细节,以匹配你的实际情况,或者我们在 Pipy 中编写一个脚本,监听我们配置的端口,并返回简单的消息。


将以下代码片段保存到你本地计算机上的一个文件中,命名为mock-proxy.js,并记住文件的存储位置。

pipy().listen(8080) .serveHTTP( new Message('Hi, there!\') ).listen(8081) .serveHTTP( msg => new Message(msg.body) ).listen(8082) .serveHTTP( msg => new Message( `You are requesting ${msg.head.path} from ${__inbound.remoteAddress}\` ) )

打开一个新的终端窗口,通过 Pipy 运行这个脚本(其中/path/to是存储该脚本文件的位置):

$ pipy /path/to/mock-proxy.js2022-01-11 18:56:31 [INF] [config]2022-01-11 18:56:31 [INF] [config] Module /mock-proxy.js2022-01-11 18:56:31 [INF] [config] ================2022-01-11 18:56:31 [INF] [config]2022-01-11 18:56:31 [INF] [config] [Listen on :::8080]2022-01-11 18:56:31 [INF] [config] ----->|2022-01-11 18:56:31 [INF] [config] |2022-01-11 18:56:31 [INF] [config] serveHTTP2022-01-11 18:56:31 [INF] [config] |2022-01-11 18:56:31 [INF] [config] <-----|2022-01-11 18:56:31 [INF] [config] 2022-01-11 18:56:31 [INF] [config] [Listen on :::8081]2022-01-11 18:56:31 [INF] [config] ----->|2022-01-11 18:56:31 [INF] [config] |2022-01-11 18:56:31 [INF] [config] serveHTTP2022-01-11 18:56:31 [INF] [config] |2022-01-11 18:56:31 [INF] [config] <-----|2022-01-11 18:56:31 [INF] [config] 2022-01-11 18:56:31 [INF] [config] [Listen on :::8082]2022-01-11 18:56:31 [INF] [config] ----->|2022-01-11 18:56:31 [INF] [config] |2022-01-11 18:56:31 [INF] [config] serveHTTP2022-01-11 18:56:31 [INF] [config] |2022-01-11 18:56:31 [INF] [config] <-----|2022-01-11 18:56:31 [INF] [config] 2022-01-11 18:56:31 [INF] [listener] Listening on port 8080 at ::2022-01-11 18:56:31 [INF] [listener] Listening on port 8081 at ::2022-01-11 18:56:31 [INF] [listener] Listening on port 8082 at ::

现在,我们已经模拟了监听 8080、8081 和 8082 端口的服务。让我们在代理服务器上再做一次测试,你会看到,模拟服务返回了正确的响应。


这篇文章对 Pipy 做了一个非常简要的介绍和概述。GitHub 上提供了入门教程和文档,你也可以通过 Pipy 管理控制台的 Web UI 查看。社区非常欢迎大家为 Pipy 的发展做贡献,也欢迎大家在自己特定的场景下进行试用,或者提供反馈和意见。



原文链接:

How to Create a Network Proxy Using Stream Processor Pipy