kong konga從開始就踩坑


因為之前有用過nginx,httpd,還有各種的自己寫tcp端口來處理服務的。所以當使用kong konga的時候就各種與之前的知識打架。

坑1:

我就是要在原機上裝kong,konga

操作:首先官網文檔走起,一步一步地按照文檔操作。

結果:glibc要求2.28.

原來我在centos7上,以為在centos8上操作。本來有兩台機,一個7,一個8.結果7在操作一大半,發現操作錯了。

改回到8.很順利地裝好了kong. 

坑2:

kong manger是什么東西,各種配端口。結果發現,毛用都沒用。這個是kong manger管理界面。直接換成konga

 

坑3:

我要裝mysql,看下官方文檔,原來只支持postpres.毛線,花N多時間找資料,至於為什么想用mysql,因為想數據統一管理唄。

還有konga只支持postpres吧。

 

坑4:

我就是要在原機裝konga.。。。。嗯嗯.各種源安裝,數據庫創建,git so easy.毛線,前端各種依賴跟不上。而且玩過前端的都知道裝個npm -g 毛線的那個node_moudle占多十幾G,以為我的機子是開發機嗎?

直接玩docker

為毛之前不想玩docker,因為我沒錢,買的配置很低,不想跑doceker呀。

坑5:

老實人跟着人家說的kong窗口走。下面我貼一下人家的容器命令

安裝kong,按照官網的教程:
docker pull kong/kong-gateway:2.4.1.0-alpine
docker images
docker tag <IMAGE_ID> kong-ee
docker network create kong-ee-net

  上面那個tag 要改成 鏡像ID之外,沒問題,還有這里這個網絡很有用。它可以讓幾個容器之間可以訪問

建數據庫:
docker run -d --name kong-ee-database \
--network=kong-ee-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:9.6

  走起,沒問題,這里有指明一個sql的鏡像,如果沒下載,它會自動給你下載來的。

導docker庫數據:
docker run --rm --network=kong-ee-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-ee-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PASSWORD=kong" \
kong-ee kong migrations bootstrap

  這個命令也沒問題,就是弄一下數據庫初始化

啟動kong:
docker run -d --name kong \
--network=kong-ee-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-ee-database" \
-e "POSTGRES_DB=kong" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001,0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8001:8001 \
-p 8443:8443 \
-p 8444:8444 \
kong:latest

  這里要說一下,這個kong:latest,因為上面已經把它改為kong-ee,所以要改,不過這里最大的坑是8000:8000,8443:8443

這里說明一下,因為這個kong本來就是要用來做代理的。所以它就是一個對外提供端口服務網關。8000,8443要改為80,443,這樣才能對接外面的無端口域名,https無端口域名的訪問。

坑6:

kong代理線路,upstreams里的名稱,要跟service里的host一致。service里的protocol是指的目標服務器的協議,因為目標服務器可以是http和https,service里的端口就像是nginx里的listen,什么?你說為什么使用80端口,也能用https?配就是了。這個我也不懂,不過我就是用80

routes就像是nginx里的location,不過rotes里要配service alias就是域名映射,有點像nginx的域名解析。path就是要代理的路徑。

https的配置,先在左邊的證書欄目里添加證書。添加一個snis,這個snis要跟routes里的snis一致。好了。https配置成功。這里的https在上面一定要把容器的8443改為443.  致於路徑的配置。service里的路徑就像upstreams端口后面的路徑。routes的路徑就像是location代理的路徑。所以如果走不通。先在nginx走一次看看能不能通。再把對應的參數在konga里修改

 更多坑:如果讓http強制轉到https

看到有的文章說,要把容器里的東西映射到宿主機。不過這個做法有點復雜

可能使用lua腳本來處理,使用插件。

在要使用到的route里添加上對應的插件:plugins->serverless->pre function  這個意思是,在執行操作前,運行這個函數

在添加的函數下添加以下代碼:

local a=kong.request.get_scheme()if a=="http"then local b=kong.request.get_host()local c=kong.request.get_path_with_query()local d="https://"..b..c;kong.response.set_header("Location",d)return kong.response.exit(302,d)end

  記得按enter,它才認為有數據填入。然后,http的就會自動轉到https了

 

坑7:大坑

居然8001端口隨便訪問?還有沒有王法。自從裝了這個東西,讓我天天睡不着覺。怎么可能重要的服務讓人家亂搞嘛。

下面是解決方案。

首先,讓8001的服務變為kong自己的一個服務。然后把這個服務加上驗證。

走起:

先建一個upsteam,然后目標弄為內網IP加端口。如localhost:8001,這個時候,上面的容器就可以再處理一下,再弄一個不要綁定8001端口的。

建一個service對應upsteam

建一個route對應service,這里,給這個route加一個單獨的域名吧。沒有域名的關我毛事。給route添加basic auth.也就是說這個8001要用戶名和密碼才能使用。

最后在konga的connects那里,改為這個新的驗證

最后一步。到服務器,去掉對外的8001端口

 

我們把上面的kong的容器停止,刪掉。然后用下面的語句創建一個新的

docker run -d --name kong \
--network=kong-ee-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-ee-database" \
-e "POSTGRES_DB=kong" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001,0.0.0.0:8444 ssl" \
-p 80:8000 \
-p 443:8443 \
kong-ee:latest

  這時,盡量減少了對外的端口

那個konga的就留着吧,因為那個有驗證。88

 

坑X:

場景-》如果是代理的目標是一個nginx服務器,而nginx服務器是使用域名來識別站點的。就是都用80端口來。根據域名不同指向不同的站點。

查了很多,都 是說把docker里的配置文件映射到宿主機出來。然后直接改配置文件 ,像改nginx一樣。

就是改那個poxy_set_header

其實konga里有一個,是否開啟host向前傳遞的功能。 

Preserve Host   設置為開啟,就可能把域名傳過去。讓目標服務器識別了。

如果國內有些站點要備案,另當別論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM