精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go語言如何實現HTTP代理和反向代理

開發 前端
在反向代理中,代理服務器要轉發的服務器地址都是事先知道的(包括靜態配置和動態配置)。比如 使用 nginx 來配置負載均衡 。

代理的核心功能可以用一句話概括:接受客戶端的請求,轉發到后端服務器,獲得應答之后返回給客戶端。

代理的功能有很多,事實上整個互聯網到處都充斥著代理服務器。如果所有的 HTTP 訪問都是客戶端和服務器端直接進行的話,我們的網絡不僅會變得緩慢,而且性能會大打折扣。

代理服務器根據不同的配置和使用,可能會有不同的功能,這些功能主要包括:

  • 內容過濾:代理可以根據一定的規則限制某些請求的連接。比如有些公司會設置內部網絡無法訪問某些購物、游戲網站,或者學校的網絡不讓學生訪問色情暴力的網站等
  • 節省成本:代理服務器可以作為緩存使用,對于某些資源只需要第一次訪問的時候去下載,以后代理直接把緩存的結果返回給客戶端,節約網絡帶寬的開銷。
  • 提高性能:通過代理服務器的緩存(比如 CDN)和負載均衡(比如 nginx lb)功能,服務器端可以加速請求的訪問,在更快的時間內返回結果)。
  • 增加安全性:公司可以在內網和外網之間通過代理進行轉發,這樣不僅對外隱藏了實現的細節,而且可以在代理層對爬蟲、病毒性請求進行過濾,保護內部服務。

所有的這些功能的實現都依賴于代理的特性,它可以在客戶端和服務器端做一些事情,根據代理做的事情不同,它的角色和功能也就不同。

那么,代理具體可以做哪些事情呢?比如:

修改 HTTP 請求:url、header、body

過濾請求:根據一定的規則丟棄、過濾請求

決定轉發到哪個后端(可以是靜態定義的,也可以是動態決定)

保存服務器的應答,后續的請求可以直接使用保存的應答

修改應答:對應答做一些格式的轉換,修改數據,甚至返回完全不一樣的應答數據

重試機制,如果后端服務器暫時無法響應,隔一段時間重試

正向代理和反向代理

代理可以分為正向代理和反向代理兩種。

正向代理需要客戶端來配置,一般來說我們會通過瀏覽器或者操作系統提供的工具或者界面來配置。

這個時候,代理對客戶端不是透明的,客戶端需要知道代理的地址并且手動配置。配置了代理,瀏覽器在發送請求的時候會對報文做特殊的修改。

反向代理對客戶端是透明的,也就是說客戶端一般不知道代理的存在,認為自己是直接和服務器通信。

我們大部分訪問的網站就是反向代理服務器,反向代理服務器會轉發到真正的服務器,一般在反向代理這一層實現負載均衡和高可用的功能。而且這里也可以看到,客戶端是不會知道真正服務器端的 ip 地址和端口的,這在一定程度上起到了安全保護的作用。

代理服務器怎么知道目的服務器的地址?

在反向代理中,代理服務器要轉發的服務器地址都是事先知道的(包括靜態配置和動態配置)。比如 使用 nginx 來配置負載均衡 。

而對于正向代理來說,客戶端可能訪問的服務器地址是無法事先知道的。因為HTTP 協議活動在應用層,它無法獲取網絡層(IP層)信息,那么該協議要有一個地方可以拿到這個信息。

HTTP 中可能保存這個信息的地方有兩個:URL 和 header。默認情況下,HTTP 請求的 status line 有三部分組成:方法、uri 和協議版本,比如:

GET /index.html HTTP/1.0
User-Agent: gohttp 1.0

如果客戶端(比如瀏覽器)知道自己在通過正向代理進行報文傳輸,那么它會在 status line 加上要訪問服務器的真實地址。這個時候發送的報文是:

GET http://www.marys-antiques.com/index.html HTTP/1.0
User-Agent: gohttp 1.0

代理路徑客戶端不管是通過代理服務器,還是直接訪問后端服務器對于最終的結果是沒有區別的,也就是說大多數情況下客戶端根本不關心它訪問的到底是什么,只需要(準確快速地)拿到想要的信息就夠了。

但是有時候,我們還是希望知道請求到底在中間經歷了哪些代理,比如用來調試網絡異常,或者做數據統計,而 HTTP 協議也提供了響應的功能。

雖然 RFC 2616 定義了 Via 頭部字段來跟蹤 HTTP 請求經過的代理路徑,但在實際中用的更多的還是 X-Forwarded-For 字段, X-Forwarded-For 是 Squid 緩存代理服務軟件引入的,目前已經在規范化在 RFC 7239 文檔。

X-Forwarded-For 頭部格式也比較簡單,比如某個服務器接受到請求的對應頭部可能是:

X-Forwarded-For: client, proxy1, proxy2

對應的值有多個字段,每個字段代表中間的一個節點,它們之間由逗號和空格隔開,從左到右距離當前節點越來越近。

每個代理服務器會在 X-Forwarded-For 頭部填上前一個節點的 ip 地址,這個地址可以通過 TCP 請求的 remote address 獲取。為什么每個代理服務器不填寫自己的 ip 地址呢?

有兩個原因,如果由代理服務器填寫自己的 ip 地址,那么代理可以很簡單地偽造這個地址,而上一個節點的 remote address 是根據 TCP 連接獲取的(如果不建立正確的 TCP 連接是無法進行 HTTP 通信的);另外一個原因是如果由當前節點填寫 X-Forwarded-For ,那么很多情況客戶端無法判斷自己是否會通過代理的。

NOTE:

1、最終客戶端或者服務器端接受的請求,X-Forwarded-For 是沒有最鄰近節點的 ip 地址的,而這個地址可以通過 remote address 獲取

2、每個節點(不管是客戶端、代理服務器、真實服務器)都可以隨便更改 X-Forwarded-For 的值,因此這個字段只能作為參考

代理服務器實現這個部分我們會介紹如何用 golang 來實現 HTTP 代理服務器,需要讀者了解一些 HTTP 服務器端編程的知識。

正向代理按照我們之前介紹的代理原理,我們可以編寫出這樣的代碼:

package main
import (
    "fmt"
    "io"
    "net"
    "net/http"
    "strings"
)
type Pxy struct {}
func (p *Pxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
    fmt.Printf("Received request %s %s %s\n", req.Method, req.Host, req.RemoteAddr)
    transport :=  http.DefaultTransport
    // step 1
    outReq := new(http.Request)
    *outReq = *req // this only does shallow copies of maps
    if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
        if prior, ok := outReq.Header["X-Forwarded-For"]; ok {
            clientIP = strings.Join(prior, ", ") + ", " + clientIP
        }
        outReq.Header.Set("X-Forwarded-For", clientIP)
    }
    // step 2
    res, err := transport.RoundTrip(outReq)
    if err != nil {
        rw.WriteHeader(http.StatusBadGateway)
        return
    }
    // step 3
    for key, value := range res.Header {
        for _, v := range value {
            rw.Header().Add(key, v)
        }
    }
    rw.WriteHeader(res.StatusCode)
    io.Copy(rw, res.Body)
    res.Body.Close()
}
func main() {
    fmt.Println("Serve on :8080")
    http.Handle("/", &Pxy{})
    http.ListenAndServe("0.0.0.0:8080", nil)
}

這段代碼比較直觀,只包含了最核心的代碼邏輯,完全按照最上面的代理圖例進行組織。一共分成幾個步驟:

1、代理接收到客戶端的請求,復制了原來的請求對象,并根據數據配置新請求的各種參數(添加上 X-Forward-For 頭部等)

2、把新請求發送到服務器端,并接收到服務器端返回的響應

3、代理服務器對響應做一些處理,然后返回給客戶端

上面的代碼運行之后,會在本地的 8080 端口啟動代理服務。修改瀏覽器的代理為 127.0.0.1::8080 再訪問網站,可以驗證代理正常工作,也能看到它在終端打印出所有的請求信息。

雖然這段代碼非常簡短,但是你可以添加更多的邏輯實現非常有用的功能。比如在請求發送之前進行過濾,根據一定的規則直接阻止某些請求的訪問;或者對請求進行限流,某個客戶端在一定的時間里執行的請求有最大限額;統計請求的數據進行分析等等。

這個代理目前不支持 HTTPS 協議,因為它只提供了 HTTP 請求的轉發功能,并沒有處理證書和認證有關的內容。

如果了解 HTTPS 協議的話,你會明白這種模式下是無法完成 HTTPS 握手的,雖然代理可以和真正的服務器建立連接(知道了對方的公鑰和證書),但是代理無法代表服務器和客戶端建立連接,因為代理服務器無法知道真正服務器的私鑰。

反向代理編寫反向代理按照上面的思路當然沒有問題,只需要在第二步的時候,根據之前的配置修改 outReq 的 URL Host 地址可以了。

不過 Golang 已經給我們提供了編寫代理的框架:httputil.ReverseProxy 。我們可以用非常簡短的代碼來實現自己的代理,而且內部的細節問題都已經被很好地處理了。

這部分我們會實現一個簡單的反向代理,它能夠對請求實現負載均衡,隨機地把請求發送給某些配置好的后端服務器。使用 httputil.ReverseProxy 編寫反向代理最重要的就是實現自己的 Director 對象,這是 GoDoc 對它的介紹:

看代碼:

package main
import (
        "log"
        "math/rand"
        "net/http"
        "net/http/httputil"
        "net/url"
)
func NewMultipleHostsReverseProxy(targets []*url.URL) *httputil.ReverseProxy {
        director := func(req *http.Request) {
                target := targets[rand.Int()%len(targets)]
                req.URL.Scheme = target.Scheme
                req.URL.Host = target.Host
                req.URL.Path = target.Path
        }
        return &httputil.ReverseProxy{Director: director}
}
func main() {
        proxy := NewMultipleHostsReverseProxy([]*url.URL{
                {
                        Scheme: "http",
                        Host:   "localhost:9091",
                },
                {
                        Scheme: "http",
                        Host:   "localhost:9092",
                },
        })
        log.Fatal(http.ListenAndServe(":9090", proxy))
}

我們讓代理監聽在 9090 端口,在后端啟動兩個返回不同響應的服務器分別監聽在 9091 和 9092 端口,通過 curl 訪問,可以看到多次請求會返回不同的結果。

?  curl http://127.0.0.1:9090
116064a9eb83
?  curl http://127.0.0.1:9090
8f7ccc11718f

同樣的,這段代碼也只是一個 demo,存在著很多問題,比如沒有錯誤處理機制,如果后端某個服務器掛了,代理會返回 502 錯誤,更好的做法是把請求轉發到另外的可用服務器。當然也可以添加更多的特性讓它更好用,比如動態地添加后端服務器列表;根據后端服務器的負載情況進行負載轉發等等。

責任編輯:武曉燕 來源: Go語言圈
相關推薦

2023-09-08 00:07:41

2022-07-01 07:33:24

nginx反向代理測試

2012-12-07 10:14:48

Nginx負載均衡

2025-05-08 02:00:00

2025-02-17 01:03:35

開源庫分布式系統

2018-11-12 12:17:00

2024-07-22 15:34:25

2019-06-18 09:45:19

正向代理反向代理IT

2010-06-12 18:00:16

ARP協議

2019-08-26 10:31:12

正向代理反向代理安全

2023-09-13 07:16:31

Ngnix代理服務器

2020-10-22 08:05:46

Nginx

2024-02-04 16:51:47

2010-03-29 17:56:20

Nginx反向代理

2019-06-19 15:34:39

Nginx反向代理負載均衡

2015-12-02 14:10:56

HTTP網絡協議代理原理

2015-12-02 15:29:32

HTTP網絡協議代理原理

2017-12-27 09:49:35

HTTP服務器反向

2024-03-26 07:38:16

正向代理反向代理代碼
點贊
收藏

51CTO技術棧公眾號

久久亚洲春色中文字幕| 欧美日韩情趣电影| 精品久久久久久乱码天堂| 麻豆成人免费视频| 欧美激情国产在线| 精品久久久久久久人人人人传媒 | 国模大尺度视频| av在线最新| 国产精品麻豆久久久| 国产精品日本一区二区| 亚洲成人av网址| 欧美日韩1080p| 亚洲网站在线观看| 色哟哟无码精品一区二区三区| 欧美片第1页| 亚洲一区二区三区影院| 亚洲日本精品国产第一区| 日本黄色免费视频| 激情偷乱视频一区二区三区| 97婷婷涩涩精品一区| 中文字幕av播放| 欧美极品中文字幕| 精品美女一区二区| 伊人网在线综合| 88xx成人免费观看视频库| 一区二区三区欧美在线观看| 亚洲巨乳在线观看| 欧美日韩国产中文字幕在线| 国产91丝袜在线播放0| 国产精品草莓在线免费观看| 国产无套粉嫩白浆内谢| 亚洲九九视频| 最新91在线视频| 无码人妻精品一区二区三区温州 | 日韩国产精品久久久久久亚洲| 欧美成年人视频网站欧美| 欧美18—19性高清hd4k| 乱亲女h秽乱长久久久| 欧美一级二级三级蜜桃| 中文字幕丰满乱码| 福利一区视频| 欧美三级午夜理伦三级中视频| 日本wwww视频| 精品三级久久| 午夜影视日本亚洲欧洲精品| 91精品国产吴梦梦| 九七久久人人| ●精品国产综合乱码久久久久| 日韩在线电影一区| 免费在线高清av| 久久色中文字幕| 韩日午夜在线资源一区二区| 日韩中文字幕免费观看| 成人黄页在线观看| 久久er99热精品一区二区三区| 国产成人手机在线| 成人av动漫在线| 国产精品日韩欧美一区二区| 丰满肉嫩西川结衣av| 丁香婷婷综合激情五月色| 超碰97网站| 国产91免费在线观看| 99re视频这里只有精品| 黄色国产精品一区二区三区| 日韩欧美亚洲系列| 久久嫩草精品久久久久| 日韩视频在线播放| 欧美被日视频| 夜夜精品浪潮av一区二区三区| 中文字幕色呦呦| 男插女视频久久久| 精品久久久国产| 中文字幕第80页| 九九九精品视频| 欧美一级理论片| 欧美在线一级片| 国产99精品一区| 久久精品国产清自在天天线| 久久免费看少妇高潮v片特黄| 国内精品久久久久久久97牛牛| 欧美激情视频网站| 五月天婷婷激情| 热久久免费视频| 亚洲一区二区三区视频播放| 亚洲精品国产av| 91香蕉视频mp4| 亚洲欧美日韩在线综合| 污污视频在线| 欧美日韩一区二区免费在线观看| 黄色国产小视频| 国产成人免费视频网站视频社区 | 天堂аⅴ在线地址8| 亚洲啪啪综合av一区二区三区| 精品国产一区二区三区无码| 电影一区二区三| 欧美挠脚心视频网站| 午夜福利三级理论电影| 国产aⅴ精品一区二区三区久久| 色老头一区二区三区| 久视频在线观看| 肉色丝袜一区二区| 99国产在线观看| 国产三级视频在线播放线观看| 亚洲色图欧美激情| 国产日产欧美视频| 欧美影院视频| 三级精品视频久久久久| 日本少妇bbwbbw精品| 免费成人美女在线观看| 国产乱码精品一区二区三区卡| 99青草视频在线播放视| 午夜久久福利影院| 亚洲天堂网站在线| 国产成人调教视频在线观看| 欧美放荡办公室videos4k| 亚洲黄网在线观看| 不卡的av电影在线观看| 这里只有精品66| 欧美性xxx| 日韩av在线免费观看一区| 超碰手机在线观看| 日本91福利区| 日本不卡一区二区三区视频| 9999在线视频| 欧美一级免费大片| 欧美性生给视频| 日韩精品电影一区亚洲| 激情伦成人综合小说| 国精一区二区三区| 欧美一区二区三区视频在线 | 亚洲综合久久久久| 91精品999| 成人系列视频| 国产精品福利久久久| 偷拍25位美女撒尿视频在线观看| 一区二区三区精品久久久| 久久这里只精品| 欧美人与牛zoz0性行为| 欧美亚洲免费电影| 欧美一区二区三区成人片在线| 亚洲人成人一区二区在线观看| 免费看污污网站| 国产亚洲电影| 国产成人高潮免费观看精品| 天天爱天天干天天操| 亚洲国产日韩a在线播放性色| 中文字幕乱码在线人视频| 91精品国产福利在线观看麻豆| 国产精品免费看久久久香蕉| 国产中文在线观看| 欧美影视一区在线| av网站免费在线看| 青娱乐精品视频| 亚洲春色综合另类校园电影| 老司机精品视频网| 日韩在线视频中文字幕| 一级做a爱片性色毛片| 国产精品天干天干在线综合| 九色91popny| 色999日韩| 成人深夜直播免费观看| av网站大全在线| 欧美成人一区二区三区 | 在线一区二区视频| 国产精品久久久视频| 欧美a级理论片| 宅男一区二区三区| 超碰成人在线观看| 91成人性视频| 成人av毛片| 欧美久久一二三四区| 天天看片中文字幕| av中文字幕在线不卡| 国产裸体舞一区二区三区| jlzzjlzz亚洲女人| 91中文字幕在线| 丰乳肥臀在线| 亚洲欧美综合精品久久成人| 天天综合久久综合| 亚洲精品欧美在线| 91精品小视频| 免费欧美在线视频| 日韩精品免费一区| 久久av超碰| 亚洲iv一区二区三区| 麻豆理论在线观看| 中文字幕在线精品| 日韩一级片免费观看| 在线视频一区二区三| 农村黄色一级片| 久久蜜桃av一区二区天堂 | 精品久久国产精品| 亚洲精品久久久久久无码色欲四季 | 日韩视频在线你懂得| 国产系列精品av| 国产日产精品一区| www.桃色.com| 久久国产精品久久w女人spa| 人人妻人人澡人人爽精品欧美一区| 豆花视频一区二区| 国产精品国产三级国产专播精品人| www在线免费观看视频| 亚洲欧美国产精品| 国产av精国产传媒| 一本一道久久a久久精品 | 色哟哟在线观看一区二区三区| 欧美巨胸大乳hitomi| 成人国产视频在线观看| 国产精品自拍视频在线| 亚洲欧美春色| a级网站在线观看| 国内精品久久久久久久影视简单| 51国产成人精品午夜福中文下载| 免费日韩电影| 欧美激情精品在线| 日本www在线观看| 亚洲欧洲一区二区三区在线观看| 国产夫妻自拍av| 欧美色图免费看| www欧美在线| 亚洲综合色噜噜狠狠| 三级黄色免费观看| 久久一区二区三区四区| 最新日本中文字幕| 国产一区二区调教| 色播五月综合网| 日韩和欧美一区二区| 亚洲国产精品久久久久婷蜜芽| 中文字幕免费精品| 一道精品一区二区三区| 国产一区2区| 免费影院在线观看一区| 动漫视频在线一区| 国产精华一区| 88久久精品| 97神马电影| 国产高清日韩| 91传媒视频免费| 国产亚洲高清在线观看| 91视频免费在线| 欧美日韩免费电影| 国产精品爽爽爽爽爽爽在线观看| 伊人久久视频| 欧美在线视频一区| 亚洲精品中文字幕| 欧美一级淫片videoshd| 日本а中文在线天堂| 538国产精品一区二区免费视频| 黄色污污视频在线观看| 久久久最新网址| 免费在线国产视频| 97免费视频在线| 阿v视频在线观看| 2019中文字幕在线| 波多野结衣亚洲一二三| 国产精品xxx视频| 成人在线网站| 国产日韩在线精品av| 婷婷激情成人| 亚洲自拍偷拍网址| 99这里只有精品视频| 国产原创精品| 一区二区美女| 五月天亚洲综合情| 91精品国产麻豆国产在线观看| 国产日韩欧美大片| 伊人精品在线| 欧美aⅴ在线观看| 日本va欧美va瓶| 污视频在线观看免费网站| 丰满放荡岳乱妇91ww| 亚洲精品在线视频免费观看| 91麻豆福利精品推荐| 三年中国中文观看免费播放| 国产精品久久久久久久午夜片 | 水蜜桃av无码| 久久免费午夜影院| 成人高潮免费视频| 午夜私人影院久久久久| 99精品人妻国产毛片| 欧美老女人在线| 刘亦菲毛片一区二区三区| 亚洲精品一区二区三区婷婷月 | 国内精品视频在线| 手机看片久久| 亚洲精品免费av| 日韩精品社区| 伊人久久大香线蕉成人综合网| 欧美精品97| 十八禁视频网站在线观看| 精品无人码麻豆乱码1区2区| 伊人网综合视频| 国产精品视频线看| 日本熟妇一区二区| 欧美精品乱码久久久久久| 人妻无码中文字幕| 丝袜一区二区三区| 国产传媒av在线| 亚洲va久久久噜噜噜| 中日韩免视频上线全都免费| eeuss中文| 巨乳诱惑日韩免费av| 绯色av蜜臀vs少妇| 日本一区二区免费在线观看视频| 欧美人妻精品一区二区三区| 欧洲另类一二三四区| 亚洲精品97久久中文字幕| www.日韩不卡电影av| 色是在线视频| 成人h视频在线观看| 爽成人777777婷婷| cao在线观看| 国产乱色国产精品免费视频| 在线不卡av电影| 亚洲成人av免费| av中文在线观看| 色偷偷偷亚洲综合网另类| 无遮挡在线观看| 国产精品一区二区免费| 亚洲第一天堂| 亚洲美女爱爱视频| 国产日韩欧美不卡在线| 五月婷婷中文字幕| 精品精品国产高清一毛片一天堂| 日本免费中文字幕在线| 国产精品99久久久久久久久久久久| 97超碰成人| 成年在线观看视频| 国产一区二区免费视频| 91禁男男在线观看| 在线观看国产91| 黄色网址在线播放| 清纯唯美亚洲激情| 天天久久夜夜| 免费 成 人 黄 色| jiyouzz国产精品久久| 久久久久无码国产精品不卡| 91精品国产欧美一区二区| 黄视频在线观看网站| 国产精品无av码在线观看| 国产不卡一区| 激情网站五月天| 久久久久久电影| 国产91国语对白在线| 天天综合网91| 在线天堂一区av电影| 久久99国产精品麻豆| 国产亚洲精品久久久久久豆腐| 在线亚洲一区观看| 成年人在线观看网站| 国产精品夜间视频香蕉| 日韩欧美高清在线播放| 国产精品视频中文字幕| 国产精品福利电影一区二区三区四区| 天天干天天插天天射| 中文字幕久热精品视频在线| 粉嫩av一区二区三区四区五区| 亚洲 国产 日韩 综合一区| 免费高清在线一区| 国产尤物在线播放| 欧美一级理论片| 成人bbav| 欧美在线3区| 久久99国产精品尤物| 青娱乐国产在线视频| 欧美精品一区二区三区蜜桃视频| a级片免费在线观看| 蜜桃视频成人| 男人的天堂久久精品| a在线视频播放观看免费观看| 精品国产在天天线2019| 狠狠操一区二区三区| 日韩久久久久久久久久久久久| 日韩电影在线观看一区二区| 欧美mv和日韩mv国产网站| 久久久男人天堂| 欧美日韩最好看的视频| 日本免费新一区视频| 极品久久久久久| 亚洲第一免费网站| 亚洲精品一级二级| 国产盗摄视频在线观看| 成人av电影免费观看| 波多野结衣家庭主妇| 久久精品国产亚洲7777| 久久久久97| 亚洲无吗一区二区三区| 伊人婷婷欧美激情| 日本大片在线观看| 成人免费视频网址| 亚洲美女黄网| 亚洲无人区码一码二码三码的含义| 日韩一级免费一区| 欧美18av| 国产一区二区三区小说| 欧美激情中文不卡| www.亚洲黄色| 国产精品久久久亚洲| 亚洲无线视频| 1024在线看片|