Module Proxy是一款HTTP反向代理中间件,突出的靓点是将HTTP协议代理为TCP Socket协议,特别适合Web前后台分离的编程架构项目,使用Module Proxy可以让后端编程从HTTP技术体系中抽身出来,这将带来两个重要的改变:
Module Proxy中间件由Rust语言实现,使用了优秀的异步运行时Tokio和HTTP底层库hyper,具有高效、稳定、简单的特性。
Demo 程序示例
Ajax客户端:
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script> <script type="text/javascript"> $(function(){ // method是和后端服务的约定,这里表示调用后端的hello方法,data是前后端约定的业务数据 var req_json = { "head":{"method":"hello"}, "data":{"hello":"world!!!", "list":[1,2,3,4]} }; $("#btn").click(function(){ $.ajax({ type: "POST", //传输方式POST url: "/socket1/", //提交URL, socket1是模块名 contentType : "application/json; charset=utf-8", //Socket转发的固定格式 data: JSON.stringify(req_json), success: function(rsp_json){ $("#myDiv").html('<h3>'+JSON.stringify(rsp_json)+'</h3>'); } }); }); }); </script> </head> <body> <button id="btn" type="button">submit</button> <div id="myDiv"></div> </body> </html>
Go语言实现的Socket端:
package main import ( "encoding/json" "fmt" "net" "strconv" "strings" "time" ) func main() { listener, err := net.Listen("tcp", "0.0.0.0:21231") //侦听端口21231 if err != nil { fmt.Println("listen error:", err) return } fmt.Println("server start...") for { conn, err := listener.Accept() if err != nil { fmt.Println("accept error:", err) break } go process(conn) //协程 } } func process(conn net.Conn) { defer conn.Close() //读取req json长度,长度行是Module Proxy转发时在Json数据前补充的 buf := make([]byte, 12) //长度行总是12字节 n, _ := conn.Read(buf) lenStr := string(buf[:n]) lenStr = strings.Trim(lenStr, "\r\n") //去除行尾的回车换行 lenStr = strings.Trim(lenStr, " ") //去除行左的空格 len, _ := strconv.Atoi(lenStr) //string转int //读取req json jsonBuf := make([]byte, len) n, _ = conn.Read(jsonBuf) //解析req json m := make(map[string]interface{}) //map json.Unmarshal(jsonBuf, &m) //json转map method := m["head"].(map[string]interface{})["method"] data := m["data"] fmt.Println("method: ", method) fmt.Println("data: ", data) //调用业务函数 var rspJson []byte var rsplen int switch method { case "hello": rspJson, rsplen = hello(data.(map[string]interface{})) //只传入Json中的data数据部分 default: rspJson, rsplen = foo() } //返回 rsp json lenRsp := fmt.Sprintf("%10d\r\n", rsplen) //构建12字节长度行(左补空格,右补\r\n) conn.Write([]byte(lenRsp)) //socket返回 长度行 conn.Write(rspJson) //socket返回 rsp json } func hello(m map[string]interface{}) ([]byte, int) { m["time"] = time.Now().Format("2006-01-02 15:04:05") m["module"] = "golang" b, _ := json.Marshal(m) //map转json return b, len(b) } func foo() ([]byte, int) { b := []byte("{}") return b, len(b) }
说明:因篇幅原因,以上代码省略了必要的错误和异常处理,只起到示范说明作用。
目录 一、背景 二、问题 三、解决方案 一、背景 最近对贫僧的个人页https://stackoperator.top进行升级,将Apache升级到2.4.46,PHP升级到7.4.15。升级后没啥问题,但是第二天却宕机了。经过查证是内存不足,导致mysql服务宕机了。那么是谁占用了这么多内存呢? 利用free、top等工具发现在页面刷新时,httpd进程的内存消耗会增加,而且是每点击、刷新一次页
众所周知,vue跨域有很多种解决方案,这里主要讲述一下使用proxyTable时遇到的一些问题 vue环境:脚手架cli3.0 本地地址:http://localhost:96 修改文件:vue.config.js module.exports = { devServer: { proxy: { 'aaa': { //跨域标识 target:
Proxy(代理) 是 ES6 中新增的一个特性。Proxy 让我们能够以简洁易懂的方式控制外部对对象的访问。其功能非常类似于设计模式中的代理模式。 使用 Proxy 的好处是:对象只需关注于核心逻辑,一些非核心的逻辑(如:读取或设置对象的某些属性前记录日志;设置对象的某些属性值前,需要验证;某些属性的访问控制等)可以让 Proxy 来做。从而达到关注点分离,降级对象复杂度的目的。 使用方法 va
今天在重启Apache的时候碰到这个Warn,在这里记录一下: 首先发现如下Warn: # service apache2 restart [Thu Apr 25 09:39:06 2019] [warn] module headers_module is already loaded, skipping Syntax OK Shutting down httpd2 (waiting for a
近期由于项目需要使用到https正向代理,而nginx官方模块仅支持做http正向代理,一番百度学习后发现了该模块,故今日记录下此笔记供大家一起学习交流 ngx_http_proxy_connect_module模块主要用于隧道SSL请求的代理服务器 GitHub地址:http://www.github.com/chobits/ngx_http_proxy_connect_module nginx
我们安装完golang后,我们在windows的cmd命令下就可以直接查看和使用go命令和环境变量了,同样的在linux下可以在控制台使用,如下图所示: C:\Users\lijie1>go env set GO111MODULE= set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\lijie1\AppData\Local\go-build set
什么是反向代理 反向代理(Reverse Proxy)方式是指用代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 举个例子,一个用户访问 http://www.example.com/readme,但是 www.example.com 上并不存在
反向代理是一个 V2Ray 的附加功能,可以把服务器端的流量向客户端转发,即逆向流量转发。 反向代理功能在 V2Ray 4.0+ 可用。目前处于测试阶段,可能会有一些问题。 反向代理的大致工作原理如下: 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP,无法在公网上直接访问。另有一台主机 B,它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。 在主机 A 中配置一
主要内容:1. 简单的反向代理,2. 集群和平衡器,3. Balancer和BalancerMember配置,3. 故障转移,4. 均衡器管理器除了作为“基本”Web服务器,并为最终用户提供静态和动态内容之外,Apache httpd(以及大多数其他Web服务器)也可以充当反向代理服务器,也称为“网关” “服务器。 在这种情况下,httpd本身不生成或托管数据,而是由一个或多个后端服务器获取内容,后端服务器通常没有直接连接到外部网络。当httpd收到来自客户端的请求时,请求本身被代理到这些后端服
主要内容:1. 代理服务器介绍,2. 将请求传递给代理的服务器,3. 传递请求标头,4. 配置缓冲区,5. 选择传出IP地址本文介绍代理服务器的基本配置。 您将学习如何通过不同协议将NGINX请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。 代理服务器的基本配置目录 代理服务器介绍 将请求传递给代理的服务器 传递请求标头 配置缓冲区 选择传出IP地址 1. 代理服务器介绍 代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过
1. 什么叫反向代理服务器? 要说反向代理服务器,先来说一般的代理服务器。代理就是受委托去做一些事。假如用户A委托B去做一些事,做完之后B告诉A结果。在代理服务器中也是一样的道理,用户A通过代理服务器B访问网站C(www.example.com),请求先到代理服务器B,B再转发请求到网站C,代理服务器B是真正访问网站C的,访问之后再把网站C的应答结果发给用户A。这样给用户A的感觉是C直接提供服务的
Nginx 是一个高性能的 HTTP 和反向代理服务器,代码完全用 C 实现,基于它的高性能以及诸多优点,我们可以把它设置为 hyperf 的前置服务器,实现负载均衡或 HTTPS 前置服务器等。 配置 Http 代理 # 至少需要一个 Hyperf 节点,多个配置多行 upstream hyperf { # Hyperf HTTP Server 的 IP 及 端口 server
以下是我对这些的理解,我看到了很少的差距;特别是何时何地使用 HTTP(s)代理: 可用作TLS终止代理 可用于修改HTTP标头 可用作DMZ前面的负载均衡器或公共IP提供程序,以屏蔽后端服务器 TCP代理 可以用作TCP连接的反向代理,不仅支持HTTP而且支持其他应用层协议,如FTP 我的问题 如果我只接受HTTP web流量,我们应该使用TCP代理而不是HTTP代理的用例是什么 这种理解是连接
如果您想使用 Nginx 作为 Gitea 的反向代理服务,您可以参照以下 nginx.conf 配置中 server 的 http 部分: server { listen 80; server_name git.example.com; location / { proxy_pass http://localhost:3000; } } 使用