0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ubuntu下部署envoy并作為前端代理方法

馬哥Linux運維 ? 來源:稀土掘金技術(shù)社區(qū) ? 2024-01-08 18:08 ? 次閱讀

前言

Envoy 是一個開源的高性能、可擴展的代理服務(wù),最初由 Lyft 公司開發(fā)。它設(shè)計用于處理現(xiàn)代的微服務(wù)架構(gòu)中的網(wǎng)絡(luò)通信,并提供了許多功能,包括負載均衡、服務(wù)發(fā)現(xiàn)、路由、認證、授權(quán)等。Envoy 被廣泛用于構(gòu)建和部署云原生應(yīng)用程序以及微服務(wù)體系結(jié)構(gòu)。

本文將通過將envoy作為前端代理來演示envoy的安裝、配置和簡單使用。

本文使用環(huán)境

Ubuntu 22.04.3 LTS Desktop 64-bit

1 安裝

envoy 編譯比較復(fù)雜,可以使用Envoy 社區(qū)提供的docker鏡像和getenvoy項目,不過getenvoy所使用的版本比較老。在Linux下最簡單的方式還是直接使用官方的envoy預(yù)編譯二進制文件。

1.1 下載

從Envoy 的 GitHub 發(fā)行版頁面下載 Ubuntu 的最新版的envoy預(yù)編譯二進制文件,這里選擇“envoy-1.28.0-linux-x86_64”

https://github.com/envoyproxy/envoy/releases

4cd6d37c-ae0c-11ee-8b88-92fbcf53809c.jpg4ce16a3a-ae0c-11ee-8b88-92fbcf53809c.jpg

1.2 安裝envoy

新建項目目錄,將文件復(fù)制到該目錄下(本文使用/home/zhg/Mine/Workplace/getenvoy/)

下載完成后如果是.tar.gz則需要解壓

如果是(application/x-executable)可執(zhí)行文件,則需要添加添加可執(zhí)行權(quán)限


# 重命名為"envoy"方便輸入命令
sudo mv envoy-1.28.0-linux-x86_64 envoy


# 添加可執(zhí)行權(quán)限
chmod +x envoy 


通過以下命令可以查看envoy版本,以驗證envoy是否正確安裝

./envoy --version

4cf1353c-ae0c-11ee-8b88-92fbcf53809c.jpg

2 配置

配置參考官網(wǎng)

www.envoyproxy.io/docs/envoy/…

envoy 可以通過靜態(tài)配置和動態(tài)配置兩種方式實現(xiàn),靜態(tài)文件通常yaml格式的文件進行配置,主要字段有:

listeners(監(jiān)聽器)

listeners 字段用于定義Envoy監(jiān)聽的網(wǎng)絡(luò)地址和協(xié)議。它描述了Envoy如何接收和處理傳入的連接請求。


listeners:
-   name:給監(jiān)聽器命名,方便引用。
-   address:指定監(jiān)聽的 IP 地址和端口。
-   filters:指定用于處理傳入連接的過濾器鏈,包括協(xié)議轉(zhuǎn)碼、路由、TLS 等。

filter(過濾器)

filters字段通常用于通過配置文件引入和加載Envoy的各種過濾器。過濾器是Envoy的功能組件,用于在請求或響應(yīng)的處理過程中執(zhí)行特定的操作。過濾器可以添加、修改或刪除請求或響應(yīng)的頭信息,執(zhí)行轉(zhuǎn)換,執(zhí)行日志記錄等操作。

envoy.http_connection_manager 是Envoy的HTTP連接管理器,它用于處理HTTP請求和響應(yīng)。它是Envoy配置的核心組件之一,負責管理HTTP連接的生命周期、處理HTTP協(xié)議、執(zhí)行各種過濾器等。該連接管理器允許您配置各種HTTP功能,包括路由、重試、負載均衡、超時等

filters:                           # 過濾器列表
  - name: envoy.http_connection_manager   # 使用 Envoy 的 HTTP 連接管理器過濾器
    typed_config:                   # 配置該過濾器的類型和參數(shù)
      "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
      codec_type: HTTP2             # 使用 HTTP/2 編解碼器
      stat_prefix: ingress_http     # 用于生成統(tǒng)計信息的前綴
      route_config:                  # 路由配置
        name: local_route           # 路由的名稱
        virtual_hosts:               # 虛擬主機列表

             

clusters(集群)

clusters 字段用于定義集群(clusters)。集群是Envoy用于負載均衡和路由請求的基本單元,定義后端服務(wù)的地址、端口、協(xié)議等信息


clusters:
-  name:定義集群的名稱。
-  type:指定集群類型,如 static, strict_dns, sds 等。
-  connect_timeout:連接超時時間。
-  lb_policy:負載均衡策略,如 round_robin, least_request 等。
-  hosts:指定集群的后端主機。
-  tls_context:配置 TLS。

routes(路由)

routes 字段用于定義路由規(guī)則。路由規(guī)則確定了Envoy在接收到請求時應(yīng)該將其轉(zhuǎn)發(fā)到哪個后端服務(wù)


routes:
-   prefix:URL 前綴匹配。
-   cluster:指定請求應(yīng)該轉(zhuǎn)發(fā)到的集群。
-   timeout:設(shè)置請求超時時間。
-   retry_policy:配置請求重試策略。

admin(管理控制)

admin是用于提供管理和監(jiān)控功能的配置選項。通過 Envoy 的 admin`接口,用戶可以查看運行時統(tǒng)計信息、配置信息,執(zhí)行一些診斷命令等


admin:
-   access_log_path:指定訪問日志文件的路徑。
-   address:指定 Envoy 管理界面的監(jiān)聽地址和端口。

以下是一份配置實例,在項目目錄打開終端,輸入以下命令創(chuàng)建配置文件,并將配置內(nèi)容復(fù)制到文件中。

touch envoy_conf.yaml


# Envoy 管理配置
admin:
  # 訪問日志路徑
  access_log_path: "/home/zhg/Mine/Workplace/getenvoy/envoy.log"
  # 管理界面監(jiān)聽地址和端口
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 10001


# 靜態(tài)資源配置
static_resources:
  listeners:
    # 定義一個監(jiān)聽器,監(jiān)聽在 0.0.0.0:10000
    - address:
        socket_address: { protocol: TCP, address: 0.0.0.0, port_value: 10000 }
      filter_chains:
        - filters:
            # 使用 HTTP 連接管理器過濾器
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                codec_type: auto
                stat_prefix: http
                access_log:
                  # 記錄 HTTP 請求到文件
                  - name: envoy.access_loggers.file
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
                      path: "/home/zhg/Mine/Workplace/getenvoy/envoy_http.log"
                      log_format:
                        text_format: |
                          >>>>
                          start_time: "%START_TIME%"  
                          method: "%REQ(:METHOD)%", original_path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%", protocol: "%PROTOCOL%", response_code: "%RESPONSE_CODE%", response_flags: "%RESPONSE_FLAGS%"
                          user_agent: "%REQ(USER-AGENT)%"
                          authority: "%REQ(:AUTHORITY)%"
                          upstream_host: "%UPSTREAM_HOST%"
                          request_id: "%REQ(X-REQUEST-ID)%"
                          custom_header: "%REQ(custom_header)%"
                          static_header: "%REQ(static_header)%"
                route_config:
                  name: search_route
                  virtual_hosts:
                    - name: backend
                      domains:
                        - "*"
                      routes:
                        - match:
                            prefix: "/"
                          route:
                            # 將請求發(fā)送到 baidu 集群
                            cluster: baidu
                http_filters:
                  - name: envoy.filters.http.router
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
    - name: baidu
      connect_timeout: 1s
      # 使用 STRICT_DNS 模式進行 DNS 解析
      type: STRICT_DNS
      dns_lookup_family: V4_ONLY
      lb_policy: round_robin
      load_assignment:
        cluster_name: baidu
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      # 目標服務(wù)器地址
                      address: www.baidu.com
                      port_value: 80
   

   

3 運行envoy

寫好配置文件后,就可以在項目目錄打開終端,輸入以下命令啟動envoy


# 通過靜態(tài)配置文件直接啟動 Envoy
# -l debug :設(shè)置日志級別為debug,可省略
./envoy -c envoy_conf.yaml -l debug


//查看幫助
envoy --help


4.測試

4.1 查看envoy admin

打開瀏覽器,輸入localhost:10001,可以看到envoy已經(jīng)啟動起來,可以正常訪問admin頁面

4cffaf54-ae0c-11ee-8b88-92fbcf53809c.jpg

4.2 代理配置驗證

普通 curl 請求

curl -vvv baidu.com

zhg@zhg-pc:~/Mine/Workplace/envoytest$ curl -vvv baidu.com
*   Trying 39.156.66.10:80...
* Connected to baidu.com (39.156.66.10) port 80 (#0)
> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Thu, 16 Nov 2023 0354 GMT
< Server: Apache
< Last-Modified: Tue, 12 Jan 2010 1300 GMT
< ETag: "51-47cf7e6ee8400"
< Accept-Ranges: bytes
< Content-Length: 81
< Cache-Control: max-age=86400
< Expires: Fri, 17 Nov 2023 0354 GMT
< Connection: Keep-Alive
< Content-Type: text/html
< 



* Connection #0 to host baidu.com left intact






4d130b26-ae0c-11ee-8b88-92fbcf53809c.jpg

使用 curl 訪問 Envoy,并添加 Header 字段 host: baidu.com

curl -v -H 'Host: baidu.com' 127.0.0.1:10000

可以看到請求被轉(zhuǎn)發(fā)到了 baidu.com,在響應(yīng)頭中,server: envoy表示服務(wù)器使用的是 Envoy 代理。這是 Envoy 代理的標識,表示請求經(jīng)過了 Envoy


zhg@zhg-pc:~/Mine/Workplace/envoytest$ curl -vvv -H 'Host: baidu.com' 127.0.0.1:15001
*   Trying 127.0.0.1:15001...
* Connected to 127.0.0.1 (127.0.0.1) port 15001 (#0)
> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< accept-ranges: bytes
< cache-control: private, no-cache, no-store, proxy-revalidate, no-transform
< content-length: 2381
< content-type: text/html
< date: Thu, 16 Nov 2023 03:45:17 GMT
< etag: "588604dc-94d"
< last-modified: Mon, 23 Jan 2017 13:27:56 GMT
< pragma: no-cache
< server: envoy
< set-cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
< x-envoy-upstream-service-time: 18
< 

...省略...

* Connection 

4d2554de-ae0c-11ee-8b88-92fbcf53809c.jpg

4.3 代理到本機web服務(wù)

4.3.1 修改配置

在clusters字段下增加一個名為"localserver"的集群,配置如下:

  clusters:
    - name: baidu
      connect_timeout: 1s
      # 使用 STRICT_DNS 模式進行 DNS 解析
      type: STRICT_DNS
      dns_lookup_family: V4_ONLY
      lb_policy: round_robin
      load_assignment:
        cluster_name: baidu
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      # 目標服務(wù)器地址
                      address: www.baidu.com
                      port_value: 80
    - name: localserver
      connect_timeout: 1s
      # 使用 STATIC 模式,直接指定目標地址
      type: STATIC
      dns_lookup_family: V4_ONLY
      lb_policy: round_robin
      load_assignment:
        cluster_name: localserver
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      # 本地服務(wù)器地址
                      address: 127.0.0.1
                      port_value: 9001




并將routes的cluster 修改為改localserver

  routes:
    - match:
        prefix: "/"
      route:
        # 將請求發(fā)送到 baidu 集群
        cluster: localserver


4.3.2 使用Python搭建簡易HTTP 服務(wù)器

適用:小型 web 項目在局域網(wǎng)內(nèi)的預(yù)覽

編寫網(wǎng)頁

新建項目目錄和文件:web/index.html,并輸入以下內(nèi)容,創(chuàng)建一個簡易的網(wǎng)頁以進行驗證。





    
    
    
    Document


     WebServer for hello Envoy! 


4.3.3 啟動http服務(wù)器

在項目目錄運行啟動http服務(wù)器

# 服務(wù)器默認監(jiān)聽端口是 8000,支持自定義端口號
python3 -m http.server 9001


#服務(wù)器默認工作目錄為當前目錄,可通過 -d/--directory 參數(shù)指定工作目錄
python -m http.server --directory /tmp/




4.3.4 驗證地址

輸入以下命令獲取ubuntu的本機IP地址,假設(shè)ip是192.168.2.30


# ubuntu 查看本機ip地址
$ ip a


2.訪問網(wǎng)頁 例如ubuntu虛擬機所在的主機,使用瀏覽器連接ubuntu的ip地址,端口是envoy的監(jiān)聽端口9000,即

http://192.168.2.30:10000/

這時候應(yīng)該能看到Ubuntu本地服務(wù)器web/index.html網(wǎng)頁的內(nèi)容,注意這里用的是10000端口,這是envoy程序的監(jiān)聽端口,如果是9001則是http服務(wù)器的端口,

4d3df98a-ae0c-11ee-8b88-92fbcf53809c.jpg

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 程序
    +關(guān)注

    關(guān)注

    116

    文章

    3762

    瀏覽量

    80757
  • 網(wǎng)絡(luò)通信
    +關(guān)注

    關(guān)注

    4

    文章

    781

    瀏覽量

    29744
  • Ubuntu
    +關(guān)注

    關(guān)注

    5

    文章

    559

    瀏覽量

    29503
  • 云原生
    +關(guān)注

    關(guān)注

    0

    文章

    240

    瀏覽量

    7932

原文標題:ubuntu 下部署envoy 并作為前端代理方法

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ubuntu 用socks5代理上網(wǎng),求助

    ubuntu 11.10 里面有沒有類似proxifier的代理上網(wǎng)工具呢?
    發(fā)表于 07-18 15:28

    【OK210試用體驗】搭建遠程ubuntu服務(wù)之二 ubuntu代理上網(wǎng)

    本帖最后由 耳東的刀 于 2015-7-24 12:58 編輯 因為學校是銳捷上網(wǎng)。一個人一個銳捷號,懶得找學校的網(wǎng)絡(luò)管理員,ubuntu安裝銳捷銳捷客戶端我不會,那么設(shè)置代理上網(wǎng)相對簡單
    發(fā)表于 07-24 12:56

    淺談Service Mesh體系中的Envoy

    部署和使用Envoy能夠帶來很好的運行效率。非常有意思的表述,Envoy并沒有把追求極致性能作為目標,那么其架構(gòu)設(shè)計會弱化性能這塊嗎?目前業(yè)內(nèi)公認
    發(fā)表于 07-12 17:25

    基于Ubuntu的Django+uwsgi+nginx項目部署步驟

    Ubuntu 部署Django+uwsgi+nginx項目前 搭建必要環(huán)境
    發(fā)表于 07-09 09:36

    Linux服務(wù)器的vue項目部署方法

    最近剛到新公司,正好之前沒接觸過這方面的東西。最初僅僅是猜想。最后也沒想到Tomcat真的可以部署前端頁面
    發(fā)表于 07-16 08:10

    JAVA如何生成UUID并作為數(shù)據(jù)庫表的ID

    JAVA生成UUID并作為數(shù)據(jù)庫表的ID
    發(fā)表于 06-02 16:59

    qt源碼庫在樹莓派中的部署方法

    接安裝qt。本文介紹最普遍的部署方式,就是在pc端的ubuntu中交叉編譯庫源碼,然后上傳編譯好的庫到樹莓派,最后配置qt creator交叉編譯的kit來實現(xiàn)在pc端編譯自碼程序,上傳到樹莓派運行。...
    發(fā)表于 12-24 06:44

    XR806是否可用類似SDIO接口與CPU連接,并作為Linux的一個外設(shè)網(wǎng)卡設(shè)備?

    如題:XR806是否可用類似SDIO接口與CPU連接,并作為Linux的一個外設(shè)網(wǎng)卡設(shè)備?
    發(fā)表于 03-11 15:02

    使用 Canonical MAAS 部署 openEuler 測試

    虛擬機資源,實現(xiàn)物理物理服務(wù)器的自助服務(wù),遠程訪問。MAAS目前支持 Ubuntu、CentOS、RHEL、Windows、ESXI 和自定義鏡像的部署。當在數(shù)據(jù)中心管理成百上千的物理服務(wù)器,比如
    發(fā)表于 08-24 11:43

    在Linux系統(tǒng)下部署RocketMQ單機實例

    前言這篇文章以4.3.0版本為標準進行講述在linux下部署RocketMQ單機實例,在此之前需要已配置JAVA環(huán)境。下載程序包直接使用一般就下載已經(jīng)編譯好的二進制文件就好了,下載好以后&
    發(fā)表于 11-11 16:29

    Ubuntu系統(tǒng)Linux學習環(huán)境的配置方法

    Ubuntu系統(tǒng)Linux學習環(huán)境的配置方法分享: Ubuntu14.04出來后我心血來潮卸載了fedora系統(tǒng)想換下Ubuntu系統(tǒng)嘗嘗鮮,沖動的結(jié)果是發(fā)現(xiàn)原來在fedora學習li
    發(fā)表于 11-21 14:45 ?1261次閱讀

    差壓液位計的常見故障及處理方法

    3、4號機組差壓液位計有兩種布置方式:其一是正壓側(cè)儀表管線上設(shè)置平衡容器與被測容器上部空間連通,負壓側(cè)儀表管線與被測容器下部相連并作為測量零點,適用于密閉容器;其二是正壓側(cè)儀表管線與被測容器下部相連
    發(fā)表于 08-20 09:05 ?1.2w次閱讀

    Ubuntu 22.10使用GNOME Console作為默認終端

    Bicha 在 5 月的提案指出,建議 Ubuntu 22.10 使用 GNOME Console 作為默認終端,這其實也是遵循 GNOME 上游的變化。而且 GNOME Console 比
    的頭像 發(fā)表于 08-08 16:15 ?845次閱讀

    ubuntu與windows之間的文件互傳方法

    。因此在開發(fā)的過程中會經(jīng)常在 Windows和 Ubuntu兩者間切換,同時還需要頻繁的進行文件互傳。一般情況下,ubuntu 與 windows 之間的文件互傳有如下三種方法。
    的頭像 發(fā)表于 04-17 15:03 ?1w次閱讀
    <b class='flag-5'>ubuntu</b>與windows之間的文件互傳<b class='flag-5'>方法</b>

    既然有了Kubernetes,為什么還需要Istio?

    Envoy 引入了 xDS 協(xié)議,該協(xié)議受到各種開源軟件的支持,例如Istio、MOSN等。Envoy 將 xDS 貢獻給服務(wù)網(wǎng)格或云原生基礎(chǔ)設(shè)施。Envoy 本質(zhì)上是一個現(xiàn)代版本的代理
    的頭像 發(fā)表于 12-11 17:28 ?898次閱讀
    既然有了Kubernetes,為什么還需要Istio?