Planet Linux of Taiwan

11月18日

AppleBOY's Blog's face
AppleBOY's Blog


縮小 展開

從 Nginx 換到 Caddy

The_Caddy_web_server_logo.svg 終於下定決心將 Nginx 換到 Caddy 這套用 Go 語言所撰寫的開源套件,大家一定會有所疑問『為什麼要換掉 Nginx 而改用 Caddy』,原因其實很簡單,你現在看的 Blog 安裝在 Linode 機器上面,之前跑的是 Nginx 搭配 letsencrypt,但是必須要寫一個 Scripts 來自動更新 letsencrypt 憑證,這機制最後不太運作,加上這一年來,每三個月就會有人丟我說『你的 Blog 憑證過期了』,所以就在這時間點,花點時間把 Nginx 設定調整到 Caddy,轉換的時間不會花超過一小時喔。

轉換 WordPress

目前自己只有三個服務,其中一項就是現在的 Blog 是用 WordPress 架出來的,先來看看原先 Nginx 設定
server {
  # don't forget to tell on which port this server listens
  listen 80;

  # listen on the www host
  server_name blog.wu-boy.com;

  location /.well-known/acme-challenge/ {
    alias /var/www/dehydrated/;
  }

  # and redirect to the non-www host (declared below)
  return 301 https://blog.wu-boy.com$request_uri;
}

server {
  listen 0.0.0.0:443 ssl http2;

  location /.well-known/acme-challenge/ {
    alias /var/www/dehydrated/;
  }

  ssl_certificate /etc/dehydrated/certs/blog.wu-boy.com/fullchain.pem;
  ssl_certificate_key /etc/dehydrated/certs/blog.wu-boy.com/privkey.pem;

  # The host name to respond to
  server_name blog.wu-boy.com;

  # Path for static files
  root /home/www/blog/www;
  index index.html index.htm index.php;
  access_log /home/www/blog/log/access.log;
  error_log /home/www/blog/log/error.log;

  # Specify a charset
  charset utf-8;
  # disable autoindex
  autoindex off;

  # Deliver 404 instead of 403 "Forbidden"
  error_page 403 /403.html;
  # Custom 404 page
  error_page 404 /404.html;

  # stop image Hotlinking
  # ref: http://nginx.org/en/docs/http/ngx_http_referer_module.html
  location ~ .(gif|png|jpe?g)$ {
     valid_referers none blocked server_names;
     if ($invalid_referer) {
        return 403;
    }
  }

  location = / {
    index index.html index.html index.php;
  }

  include h5bp/basic.conf;
  include h5bp/module/wordpress.conf;
看到都頭昏眼花了。這還沒有附上 wordpress.conf 的設定呢。接著我們看一下 Caddy 的設定
blog.wu-boy.com {
  root /home/www/blog/www
  gzip
  fastcgi / unix:/var/run/php5-fpm.sock php
  rewrite {
    if {path} not_match ^\/wp-admin
    to {path} {path}/ /index.php?{query}
  }
}
有沒有差異很大,Caddy 強調的就是簡單,而且會自動更新網站憑證。

轉換 CodeIgniter

CodeIgniterLaravel 架構一樣,所以設定方式也差不多
codeigniter.org.tw {
  root /home/www/ci/www
  gzip
  fastcgi / unix:/var/run/php5-fpm.sock php
  rewrite {
    if {path} not_match ^\/(forum|user_guide|userguide3)
    to {path} {path}/ /index.php?{query}
  }
}

透過 Proxy 設定其他服務

如果你有啟動其他服務,可以透過 proxy 方式來設定
xxxx.wu-boy.com {
  proxy / localhost:8081 {
    websocket
    transparent
  }
}

感想

原本一直想找機會來處理憑證無法三個月自動更新,但是沒什麼時間處理,後來花短短半小時時間就把 Caddy 處理完成,並且設定在 Ubuntu 內開機自動啟動。也許大家可以嘗試看看 Caddy,如果最後真的效能瓶頸在 Caddy,也可以隨時抽換掉。想看更多範例,可以直接參考此範例連結

sakananote's face
sakananote


縮小 展開

kong 0.11.1 in Azure 測試小記

kong 0.11.1 in Azure 測試小記

OS:  openSUSE Leap 42.3 in Azure

測試 kong 0.11.1 版本

啟動 docker 服務

# systemctl   start      docker
# systemctl   enable  docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

這邊 跟上次不同的是 沒有開 port 5432 ( 因為不需要對外開放 )

# docker  run  -d  --name  kong-database   -e "POSTGRES_USER=kong"   -e   "POSTGRES_DB=kong"   postgres:9.4

進行 migrations 的動作

# docker   run  --rm   --link   kong-database:kong-database   -e "KONG_DATABASE=postgres"  -e   "KONG_PG_HOST=kong-database"   -e  "KONG_CASSANDRA_CONTACT_POINTS=kong-database"   kong:0.11.1   kong  migrations   up

Unable to find image 'kong:0.11.1' locally
0.11.1: Pulling from library/kong

d9aaf4d82f24: Pull complete
7246e83a372d: Pull complete
0695e4ef90eb: Pull complete
Digest: sha256:8cb8ac7dbd303f18d329f8336f1fb929c12ae0231bd62fe7d055c38dab70b613
Status: Downloaded newer image for kong:0.11.1
migrating core for database kong
core migrated up to: 2015-01-12-175310_skeleton
core migrated up to: 2015-01-12-175310_init_schema
core migrated up to: 2015-11-23-817313_nodes
core migrated up to: 2016-02-29-142793_ttls
core migrated up to: 2016-09-05-212515_retries
core migrated up to: 2016-09-16-141423_upstreams
core migrated up to: 2016-12-14-172100_move_ssl_certs_to_core
core migrated up to: 2016-11-11-151900_new_apis_router_1
core migrated up to: 2016-11-11-151900_new_apis_router_2
core migrated up to: 2016-11-11-151900_new_apis_router_3
core migrated up to: 2016-01-25-103600_unique_custom_id
core migrated up to: 2017-01-24-132600_upstream_timeouts
core migrated up to: 2017-01-24-132600_upstream_timeouts_2
core migrated up to: 2017-03-27-132300_anonymous
core migrated up to: 2017-04-18-153000_unique_plugins_id
core migrated up to: 2017-04-18-153000_unique_plugins_id_2
core migrated up to: 2017-05-19-180200_cluster_events
core migrated up to: 2017-05-19-173100_remove_nodes_table
core migrated up to: 2017-06-16-283123_ttl_indexes
migrating response-transformer for database kong
response-transformer migrated up to: 2016-05-04-160000_resp_trans_schema_changes
migrating rate-limiting for database kong
rate-limiting migrated up to: 2015-08-03-132400_init_ratelimiting
rate-limiting migrated up to: 2016-07-25-471385_ratelimiting_policies
migrating acl for database kong
acl migrated up to: 2015-08-25-841841_init_acl
migrating ip-restriction for database kong
ip-restriction migrated up to: 2016-05-24-remove-cache
migrating statsd for database kong
statsd migrated up to: 2017-06-09-160000_statsd_schema_changes
migrating jwt for database kong
jwt migrated up to: 2015-06-09-jwt-auth
jwt migrated up to: 2016-03-07-jwt-alg
jwt migrated up to: 2017-05-22-jwt_secret_not_unique
migrating cors for database kong
cors migrated up to: 2017-03-14_multiple_orgins
migrating galileo for database kong
galileo migrated up to: 2016-04-15_galileo-import-mashape-analytics
migrating basic-auth for database kong
basic-auth migrated up to: 2015-08-03-132400_init_basicauth
basic-auth migrated up to: 2017-01-25-180400_unique_username
migrating key-auth for database kong
key-auth migrated up to: 2015-07-31-172400_init_keyauth
migrating response-ratelimiting for database kong
response-ratelimiting migrated up to: 2015-08-03-132400_init_response_ratelimiting
response-ratelimiting migrated up to: 2016-08-04-321512_response-rate-limiting_policies
migrating request-transformer for database kong
request-transformer migrated up to: 2016-05-04-160000_req_trans_schema_changes
migrating datadog for database kong
datadog migrated up to: 2017-06-09-160000_datadog_schema_changes
migrating hmac-auth for database kong
hmac-auth migrated up to: 2015-09-16-132400_init_hmacauth
hmac-auth migrated up to: 2017-06-21-132400_init_hmacauth
migrating oauth2 for database kong
oauth2 migrated up to: 2015-08-03-132400_init_oauth2
oauth2 migrated up to: 2016-07-15-oauth2_code_credential_id
oauth2 migrated up to: 2016-12-22-283949_serialize_redirect_uri
oauth2 migrated up to: 2016-09-19-oauth2_api_id
oauth2 migrated up to: 2016-12-15-set_global_credentials
oauth2 migrated up to: 2017-04-24-oauth2_client_secret_not_unique
45 migrations ran
Error response from daemon: Driver devicemapper failed to remove root filesystem 5424b25954b9fc35d551e29b3e1e441b3957318c41f6ed77069586d29348f83c: devicemapper: Error running RemoveDevice dm_task_run failed


執行 kong 容器

# docker   run   -d   --name  kong  --link  kong-database:kong-database  -e "KONG_DATABASE=postgres"  -e   "KONG_PG_HOST=kong-database"  -e  "KONG_CASSANDRA_CONTACT_POINTS=kong-database"  -e "KONG_PROXY_ACCESS_LOG=/dev/stdout"  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout"  -e "KONG_PROXY_ERROR_LOG=/dev/stderr"  -e "KONG_ADMIN_ERROR_LOG=/dev/stderr"  -p  8000:8000   -p  8443:8443  -p  8001:8001  -p  8444:8444    kong:0.11.1


觀察 docker

# docker   ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
479edbd0fc22        kong:0.11.1         "/docker-entrypoint.s"   7 minutes ago       Up 7 minutes        0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:8443-8444->8443-8444/tcp   kong
fa2ed7cbb6c6        postgres:9.4        "docker-entrypoint.sh"   14 minutes ago      Up 14 minutes       5432/tcp

為了日後不想打太長的指令將 結果 commit

# docker  commit  -m  "kong_test_0.11.1"  -a  "sakana"  4b5635ee34ed  sakana/kong_0.11.1
sha256:115879424e5057c4b1ff64666beda6f90501fd4fcca8af3336f9d3b89625d4f9

# docker   commit   -m  "kong_test_0.11.1"  -a  "sakana"   9a212d85ce2c   sakana/kong_0.11.1_db_postgres
sha256:d6e9fc2cb50dfd370671fa3b889c68f11d4ef3c85d0b5a9767fdf42d216baf93

登入 docker
# docker  login

將 image push 上去
# docker   push   sakana/kong_0.11.1

# docker   push   sakana/kong_0.11.1_db_postgres

另外開一台 VM 測試,
目前測試的結果是 0.11.1 一定要進行 migrations 才可以通過, 改天要來研究一下

#systemctl  start   docker

# docker  run  -d  --name   kong-database   sakana/kong_0.11.1_db_postgres

docker   run  --rm   --link   kong-database:kong-database   -e "KONG_DATABASE=postgres"  -e   "KONG_PG_HOST=kong-database"   -e  "KONG_CASSANDRA_CONTACT_POINTS=kong-database"   kong:0.11.1   kong  migrations   up

# docker   run   -d   --name   kong  --link  kong-database:kong-database  -p  8000:8000   -p 8443:8443  -p  8001:8001  -p 8444:8444   sakana/kong_0.11.1





11月17日

sakananote's face
sakananote


縮小 展開

openSUSE Leap 42.3 正式版 安裝小記

openSUSE Leap 42.3 正式版 安裝小記
這次也是使用 USB 來進行安裝, 上次裝 42.3 是 2017年7月 :)


中文輸入法問題:


因為就算安裝 中文輸入法也沒有出現( 預設沒有輸入來源, 就算選了也是沒用 ), 所以就用之前的方式
移除 ibus
#yast2  sw_single


取消 ibus  套件


取消 USB 為安裝來源
# yast2  repositories


Google Chrome:


Freemind:
使用one click install 安裝 http://software.opensuse.org/package/freemind
我是使用 editors 那個來源的 ymp 檔案安裝


.mm 的檔案指定用 freemind  開啟


新增 Packman 套件庫:


使用 #yast2  repositories 手動加入 NCHC Packman 套件庫


#yast2  repositories


URL 為


Firefox Sync:
登入 Firefox Sync, 會處理之前有下載的 Plugin

flash-player:
# zypper   install   flash-player


播放器:


# zypper  install   vlc
因為 mplayber 與 smplayer 不知道為何播放 .mp4 有點問題, 但是使用 VLC 就沒有問題
所以我就安裝 VLC Media player


並將 .rmvb 以及 .mp4 預設播放器設定為  VLC


安裝  ffmpeg ( 會把提供者從 openSUSE 換成 Packman )
# zypper  install   ffmpeg


這樣的好處是使用 youtube-dl  可以轉換  mp3 格式




透過 youtube-dl  -F 來觀察可以下載的格式


> youtube-dl  -F  http://www.youtube.com/watch?v=13eLHrDcb1k
[youtube] Setting language
[youtube] 13eLHrDcb1k: Downloading video webpage
[youtube] 13eLHrDcb1k: Downloading video info webpage
[youtube] 13eLHrDcb1k: Extracting video information
Available formats:
22 : mp4 [720x1280]
18 : mp4 [360x640]
43 : webm [360x640]
5 : flv [240x400]
17 : mp4 [144x176]


指定要下載的格式進行下載 (請注意 -f 是小寫)


> youtube-dl  -f  22  http://www.youtube.com/watch?v=13eLHrDcb1k


下載為 mp3
首先要安裝 ffmpeg 套件


>youtube-dl    http://www.youtube.com/watch?v=13eLHrDcb1k --extract-audio --audio-format mp3


PDF Viewer 安裝:
Foxit
因為預設的 PDF Viewer 中文顯示有問題所以使用 Foxit

https://www.foxitsoftware.com/products/pdf-reader/


Skype:
目前的版本是 5.4.0 的版本




官方網站說
重要通知事項:所有 Linux 版 Skype 用戶端 4.3 版及較舊版本將於 2017 年 7 月 1 日停止服務。若要繼續使用聊天功能,請安裝最新的 Linux 版 Skype。


下載 RPM 版本用軟體安裝就裝好了 :)


使用 #yast2 sound 調整音效


Dropbox:


目前版本 2.10.0
使用 # zypper install dropbox 來安裝


安裝完之後在終端機下 dropbox  start  -i  來安裝


安裝 GNOME Control center
# zypper  install  yast2-control-center-gnome


然後修改 /etc/sysconfig/yast2
改為
WANTED_GUI="gtk"


修改 LS_OPTIONS 變數
# vi   /etc/profile.d/ls.bash
把 root 的 LS_OPTIONS 的 -A 移除


.7z 支援:
# zypper  install  p7zip


imagewriter:
# zypper  install  imagewriter

用來製作開機 USB


以下為個人記事


rdesktop 安裝與測試:
#zypper  install  freerdp


執行方式
#xfreerdp  -g  1280x1024  -u administrator  HOST_IP



VMware workstation Pro 14:


安裝 kernel-default-devel  
# zypper   install   kernel-default-devel
# ./VMware-Workstation-Full-14.0.0-6661328.x86_64.bundle


取消 “Enable virtual machine sharing and remote access


2017-11-13 20-45-20 的螢幕擷圖.png


Yubico Key:
如果 linux 沒有抓到 Yubico 的 U2F Key可以使用以下步驟
讓 linux 支援 Yubico , 我是參考 https://www.yubico.com/faq/enable-u2f-linux/  
作法
存到 /etc/udev/rules.d/70-u2f.rules
將 linux 重開機, 接下來就可以使用了 :-)


smartgit 安裝:


下載 smartgit-linux-17_1_1.tar.gz


解壓縮到 /opt
# tar  zxvf   smartgit-linux-17_*.tar.gz  -C   /opt/


建立 link 讓一般使用者也能使用
# ln  -s   /opt/smartgit/bin/smartgit.sh   /usr/local/bin/smartgit


安裝 git
# zypper  install  git


建立 個人的 ssh key
> ssh-keygen  -t  dsa


將 ssh 的公鑰 id_dsa.pub 新增到 Github 的 Settings -- >  SSH and GPG Keys


接下來就是以一般使用者的身份執行 smartgit 指令
> smartgit


按照上面的參考設定


設定 smart git icon 使用 alacarte


在設定好之後如果發現無法直接開啟資料夾 ( 資料夾上面按右鍵 -- > Open )
Edit -- > Preferences --> 點選  Tools -- > 點選 Re-Add Defaults 得到解決
2016-11-24 15-48-28 的螢幕擷圖.png


ansible 安裝:


目前版本 2.4.1
#zypper  install  ansible


安裝 pysphere:


為了 ansible and VMware Module




# zypper  install  python-pysphere


Docker 安裝:


目前版本 17.04.0-ce
#zypper  install  docker


#systemctl  start  docker
#systemctl  enable   docker


GNOME Extension:


參考調校小記
裝了
  • TopIcon
  • NetSpeed


Forticlient SSL VPN 安裝:
Dropbox 內2017/packages 的 source code


使用 forticlientsslvpn_linux_4.4.2323.tar.gz 內的 fortisslvpn.sh


印表機安裝:
# yast2  printer

~ enjoy it


參考

11月14日

AppleBOY's Blog's face
AppleBOY's Blog


縮小 展開

Go 語言實現 gRPC Health 驗證

grpc_square_reverse_4x 本篇教大家如何每隔一段時間驗證 gRPC 服務是否存活,如果想了解什麼是 gRPC 可以參考 這篇『REST 的另一個選擇:gRPC』,這邊就不多介紹 gRPC 了,未來將會是容器的時代, 那該如何檢查容器 Container 是否存活。如果是用 Kubernetes 呢?該如何來撰寫 gRPC 接口搭配 livenessProbe 設定。底下是在 Dockerfile 內可以設定 HEALTHCHECK 來 達到檢查容器是否存活。詳細說明可以參考此連結

HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

建立 Health Check proto 接口

打開您的 *.proto 檔案,並且寫入
message HealthCheckRequest {
  string service = 1;
}

message HealthCheckResponse {
  enum ServingStatus {
    UNKNOWN = 0;
    SERVING = 1;
    NOT_SERVING = 2;
  }
  ServingStatus status = 1;
}

service Health {
  rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
}
存檔後重新產生 Go 程式碼: 檔案存放在 rpc/proto 目錄
$ protoc -I rpc/proto rpc/proto/gorush.proto --go_out=plugins=grpc:rpc/proto
或者在 Makefile 內驗證 proto 檔案是否變動才執行:
rpc/proto/gorush.pb.go: rpc/proto/gorush.proto
    protoc -I rpc/proto rpc/proto/gorush.proto \
    --go_out=plugins=grpc:rpc/proto

程式碼連結

建立 Health Interface

如果還有其他接口需要驗證,這就必須建立一個 Health Interface 讓你的服務可以驗證多種 protocol, 建立 health.go
package rpc

import (
    "context"
)

// Health defines a health-check connection.
type Health interface {
    // Check returns if server is healthy or not
    Check(c context.Context) (bool, error)
}

程式碼連結

建立 gRPC 服務

首先要定義一個 Server 結構來實現 Check 接口
type Server struct {
    mu sync.Mutex
    // statusMap stores the serving status of the services this Server monitors.
    statusMap map[string]proto.HealthCheckResponse_ServingStatus
}

// NewServer returns a new Server.
func NewServer() *Server {
    return &Server{
        statusMap: make(map[string]proto.HealthCheckResponse_ServingStatus),
    }
}
這邊可以看到,gRPC 的狀態可以從 proto 產生的 Go 檔案拿到,打開 *.pb.go,可以找到如下
type HealthCheckResponse_ServingStatus int32

const (
    HealthCheckResponse_UNKNOWN     HealthCheckResponse_ServingStatus = 0
    HealthCheckResponse_SERVING     HealthCheckResponse_ServingStatus = 1
    HealthCheckResponse_NOT_SERVING HealthCheckResponse_ServingStatus = 2
)
接著來實現 Check 接口
// Check implements `service Health`.
func (s *Server) Check(ctx context.Context, in *proto.HealthCheckRequest) (*proto.HealthCheckResponse, error) {
    s.mu.Lock()
    defer s.mu.Unlock()
    if in.Service == "" {
        // check the server overall health status.
        return &proto.HealthCheckResponse{
            Status: proto.HealthCheckResponse_SERVING,
        }, nil
    }
    if status, ok := s.statusMap[in.Service]; ok {
        return &proto.HealthCheckResponse{
            Status: status,
        }, nil
    }
    return nil, status.Error(codes.NotFound, "unknown service")
}
上面可以看到透過帶入 proto.HealthCheckRequest 得到 gRPC 的回覆,這邊通常都是帶空值, gRPC 會自動回 1,最後在啟動 gRPC 服務前把 Health Service 註冊上去
    s := grpc.NewServer()
    srv := NewServer()
    proto.RegisterHealthServer(s, srv)
    // Register reflection service on gRPC server.
    reflection.Register(s)
這樣大致上完成了 gRPC 伺服器端實作

程式碼連結

建立 Client 套件

一樣可以透過 proto 產生的程式碼來撰寫 Client 驗證,建立 client.go 裡面寫入
package rpc

import (
    "context"

    "github.com/appleboy/gorush/rpc/proto"

    "google.golang.org/grpc"
    "google.golang.org/grpc/codes"
)

// generate protobuffs
//   protoc --go_out=plugins=grpc,import_path=proto:. *.proto

type healthClient struct {
    client proto.HealthClient
    conn   *grpc.ClientConn
}

// NewGrpcHealthClient returns a new grpc Client.
func NewGrpcHealthClient(conn *grpc.ClientConn) Health {
    client := new(healthClient)
    client.client = proto.NewHealthClient(conn)
    client.conn = conn
    return client
}

func (c *healthClient) Close() error {
    return c.conn.Close()
}

func (c *healthClient) Check(ctx context.Context) (bool, error) {
    var res *proto.HealthCheckResponse
    var err error
    req := new(proto.HealthCheckRequest)

    res, err = c.client.Check(ctx, req)
    if err == nil {
        if res.GetStatus() == proto.HealthCheckResponse_SERVING {
            return true, nil
        }
        return false, nil
    }
    switch grpc.Code(err) {
    case
        codes.Aborted,
        codes.DataLoss,
        codes.DeadlineExceeded,
        codes.Internal,
        codes.Unavailable:
        // non-fatal errors
    default:
        return false, err
    }

    return false, err
}

程式碼連結

驗證 gRPC 服務是否存活

上述 Client 寫好後,其他開發者可以直接 import 此 package,就可以直接使用。再建立 一個檔案取名叫 check.go
package main

import (
    "context"
    "log"
    "time"

    "github.com/go-training/grpc-health-check/rpc"

    "google.golang.org/grpc"
)

const (
    address = "localhost:9000"
)

func main() {
    // Set up a connection to the server.
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()

    client := rpc.NewGrpcHealthClient(conn)

    for {
        ok, err := client.Check(context.Background())
        if !ok || err != nil {
            log.Printf("can't connect grpc server: %v, code: %v\n", err, grpc.Code(err))
        } else {
            log.Println("connect the grpc server successfully")
        }

        <-time.After(time.Second)
    }
}

程式碼連結

結論

所有程式碼都可以在這邊找到,假設團隊的 gRPC 服務跟 Web 服務器 綁在同一個 Go 程式的話,可以透過撰寫 /healthz 來同時處理 gRPC 及 Http 服務的驗證。在 Kubernetes 內就可以透過設定 livenessProbe 來驗證 Container 是否存活。
livenessProbe:
  httpGet:
    path: /healthz
    port: 3000
  initialDelaySeconds: 3
  periodSeconds: 3

11月12日

sakananote's face
sakananote


縮小 展開

kong-dashboard 小記

kong-dashboard 小記

測試環境
kong: 0.10.3
kong-dashboard: v2

kong-dashboard

因為 kong 是文字介面, 為了有 GUI 介面所以就找相關的開源專案來試試看
  • Listen port 預設 8080


Github 網頁

kong-dashboard on dockerhub

我是使用 docker 方式來進行
kong-dashboard 要配合 kong 的版本
  • 0.10.x 以上的版本要使用 kong-dashboard V2 以上的版本

安裝方式
無驗證方式
# docker   run   -d   -p   8080:8080   pgbi/kong-dashboard:v2

執行之後的畫面

2017-11-12 16-05-08 的螢幕擷圖.png
在 Kong node URL 輸入 Kong node 所在位置
例如   http://YOUR_KONG_IP:8001
點選 SAVE



kong-dashboard 畫面

2017-11-12 16-07-56 的螢幕擷圖.png

接下來就可以針對 Plugins 來進行增加 Plugins, 或是新增 APIs

測試 新增 API

點選 Manage APIs
點選 ADD API

2017-11-12 16-15-02 的螢幕擷圖.png


接下來進入設定畫面
2017-11-12 16-16-40 的螢幕擷圖.png
欄位說明
Name: 識別管理
Hosts: 真正提供服務的 FQDN
Uris: ( Host and Uris 至少要填一個 )( optional )
Methods: 限制 API 行為, GET or POST
Upstream url: API 根目錄路徑 例如 http://ipgod.nchc.org.tw/api/3/action
Strip uri: 如果勾選, 可以限制 uris 行為


原來的作法

> curl   http://ipgod.nchc.org.tw/api/3/action/tag_list
{"help": "http://ipgod.nchc.org.tw/api/3/action/help_show?name=tag_list", "success": true, "result": ["aqi", "eco", "GMP\u85e5\u5ee0", "OpenData", "Sensor", "test", "\u4f5c\u696d\u57fa\u91d1\u6703\u8a08\u5831\u8868", "\u5168\u90e8\u8cc7\u6599\u96c6", "\u5e38\u898b\u6feb\u7528\u7ba1\u5236\u85e5\u54c1", "\u6708\u5831", "\u672c\u7ad9\u6e05\u55ae", "\u6838\u51c6\u5291\u578b", "\u6feb\u7528\u7ba1\u5236\u85e5\u54c1", "\u74b0\u4fdd", "\u7a7a\u6c59", "\u7ba1\u5236\u85e5\u54c1", "\u85e5\u54c1\u88fd\u9020\u8a31\u53ef\u7de8\u865f", "\u98df\u54c1\u5b89\u5168", "\u98df\u54c1\u5b89\u5168\u7ba1\u5236\u7cfb\u7d71", "\u9910\u98f2\u696d", "\u9910\u98f2\u696d\u98df\u54c1\u5b89\u5168\u7ba1\u5236\u7cfb\u7d71"]}

這樣可讀性比較低, 使用之前裝的 underscore 來處理

> curl  http://ipgod.nchc.org.tw/api/3/action/tag_list  |  underscore  print
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100   699  100   699    0     0   7141      0 --:--:-- --:--:-- --:--:--  7206
{
 "help": "http://ipgod.nchc.org.tw/api/3/action/help_show?name=tag_list",
 "success": true,
 "result": [
   "aqi",
   "eco",
   "GMP藥廠",
   "OpenData",
   "Sensor",
   "test",
   "作業基金會計報表",
   "全部資料集",
   "常見濫用管制藥品",
   "月報",
   "本站清單",
   "核准劑型",
   "濫用管制藥品",
   "環保",
   "空汙",
   "管制藥品",
   "藥品製造許可編號",
   "食品安全",
   "食品安全管制系統",
   "餐飲業",
   "餐飲業食品安全管制系統"
 ]
}


確認 kong API
http://YOUR_KONG_IP:8001/apis
http://YOUR_KONG_IP:8000

還沒建立 API 之前, 使用 kong 來呼叫 API

> curl  -i  -X  GET  http://YOUR_KONG_IP:8000/tag_list  -H   'Host: ipgod.nchc.org.tw'
HTTP/1.1 404 Not Found
Date: Sun, 12 Nov 2017 08:47:34 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: kong/0.10.3

{"message":"no API found with those values"}

嘗試加入相關設定
加入 Name / Hosts / Upstream url

2017-11-12 16-58-22 的螢幕擷圖.png

確認 api 有被加進去


> curl   http://YOUR_KONG_IP:8001/apis  | underscore  print
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100   397    0   397    0     0    346      0 --:--:--  0:00:01 --:--:--   346
{
 "data": [
   {
     "http_if_terminated": true,
     "id": "d54b1a02-d7ac-45d4-a01f-405e7c38052d",
     "upstream_read_timeout": 60000,
     "preserve_host": false,
     "created_at": 1510477097000,
     "upstream_connect_timeout": 60000,
     "upstream_url": "http://ipgod.nchc.org.tw/api/3/action",
     "strip_uri": true,
     "https_only": false,
     "name": "ipgod_tag_list",
     "retries": 5,
     "upstream_send_timeout": 60000,
     "hosts": ["ipgod.nchc.org.tw"]
   }
 ],
 "total": 1
}


再次測試

> curl  http://YOUR_KONG_IP:8000/tag_list  -H  'Host: ipgod.nchc.org.tw'  | underscore print
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100   699  100   699    0     0    485      0  0:00:01  0:00:01 --:--:--   484
{
 "help": "http://ipgod.nchc.org.tw/api/3/action/help_show?name=tag_list",
 "success": true,
 "result": [
   "aqi",
   "eco",
   "GMP藥廠",
   "OpenData",
   "Sensor",
   "test",
   "作業基金會計報表",
   "全部資料集",
   "常見濫用管制藥品",
   "月報",
   "本站清單",
   "核准劑型",
   "濫用管制藥品",
   "環保",
   "空汙",
   "管制藥品",
   "藥品製造許可編號",
   "食品安全",
   "食品安全管制系統",
   "餐飲業",
   "餐飲業食品安全管制系統"
 ]
}

  • -H : header
    • 對應 KONG API  內的Hosts 欄位
  • http://YOUR_KONG_IP:port
  • tag_list

完成之後的畫面

2017-11-12 17-36-11 的螢幕擷圖.png









未來考慮


~ enjoy it