タスク8 - NGINXリバース・プロキシの構成
GoldenGateのリバース・プロキシ機能を使用すると、Oracle GoldenGateデプロイメントに関連付けられたすべてのOracle GoldenGate Microservicesに対応する単一のアクセス先を使用できます。
リバース・プロキシを使用しないと、Oracle GoldenGateデプロイメント・マイクロサービスは、ホスト名またはIPアドレスと個別のポート番号で構成されるサービスごとに1つずつのURLを使用してアクセスされます。
たとえば、サービス・マネージャにアクセスするためにhttp://gghub.example.com:9100を使用し、管理サーバーにはhttp://gghub.example.com:9101、2番目のサービス・マネージャにはhttp://gghub.example.com:9110を使用してアクセスするようになります。
Grid Infrastructure Agent (XAG)を使用してOracle Exadata Database Serviceで高可用性(HA)構成のOracle GoldenGateを実行する場合、GoldenGateサービス・マネージャでは複数のデプロイメントを管理できないとう制限があります。この制限のため、サービス・マネージャとデプロイメントのペアごとに、個別の仮想IPアドレス(VIP)を作成するようにお薦めします。このようにすると、VIPを使用してマイクロサービスに直接アクセスできます。
リバース・プロキシにより、ポート番号はデプロイメント名とホスト名のVIPに置き換えられるため、マイクロサービスに接続するためのポート番号は不要になります。たとえば、Webブラウザでコンソールに接続するには、次のURLを使用します。
サービス | URL |
---|---|
サービス・マネージャ | https://localhost:localPort |
管理サーバー | https://localhost:localPort/instance_name/adminsrvr |
分散サーバー | https://localhost:localPort/instance_name/distsrvr |
パフォーマンス・メトリック・サーバー | https://localhost:localPort/instance_name/pmsrvr |
レシーバ・サーバー | https://localhost:localPort/instance_name/recvsrvr |
ノート:
OCIでOracle GoldenGateに接続する場合は、要塞とSSHポート転送セッションを作成する必要があります(ステップ6.1を参照)。その後で、https://locahost:<localPort>を使用すると、Oracle GoldenGateサービスに接続できます。リバース・プロキシは、マイクロサービスに簡単にアクセスし、セキュリティと管理性を強化するために必須です。
手順に従って、SSL接続のNGINXリバース・プロキシをインストールおよび構成し、すべての外部通信をセキュアにします。
ノート:
NGINXでCA署名付き証明書を使用する場合は、NGINXssl_certificate
パラメータが、CA署名付き証明書、中間証明書、ルート証明書という正しい順序で証明書が含まれている証明書ファイルを指していることを確認します。
このタスクを完了するには、次のステップを実行します。
- ステップ8.1 - NGINXのインストール
- ステップ8.2 - NGINXリバース・プロキシの構成
- ステップ8.3 - GoldenGate Microservicesの保護によるセキュアでない直接アクセスの制限
- ステップ8.4 - NGINXを管理するClusterwareリソースの作成
ステップ8.1 - NGINXリバース・プロキシ・サーバーのインストール
- すべてのノードで
root
OSユーザーとして、次の内容でファイル/etc/yum.repos.d/nginx.repo
を作成することでYUMリポジトリを設定します。[opc@exadb-node1 ~]$ sudo su - [root@exadb-node1 ~]# cat > /etc/yum.repos.d/nginx.repo <<EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/rhel/7/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF
root
OSユーザーとして、次のコマンドを実行して、NGINXをインストール、有効化および起動します。[root@exadb-node1 ~]# yum install -y python-requests python-urllib3 nginx [root@exadb-node1 ~]# systemctl enable nginx
root
OSユーザーとして、ソフトウェアのインストール後に、NGINXリポジトリを無効にします。[root@exadb-node1 ~]# yum-config-manager --disable nginx-stable
ステップ8.2 - NGINXリバース・プロキシの構成
Oracle GoldenGateホームごとに、個別のリバース・プロキシ構成が必要です。
複数のサービス・マネージャを実行する場合は、次の手順によって、サービス・マネージャごとに個別のVIPを使用する構成を用意します。NGINXは、VIPを使用してHTTPS接続リクエストのルーティング先になるサービス・マネージャを決定します。
SSL証明書は、クライアントがNGINX経由で接続するサーバーを認証するために必要です。続行する前に、システム管理者に連絡して、会社の標準に従ってサーバー証明書を作成または取得してください。VIPとサービス・マネージャのペアごとに、個別の証明書が必要です。
ノート:
CA署名付き証明書の共通名は、NGINXで使用されるターゲット・ホスト名/VIPと一致している必要があります。次のサブステップを実行して、このステップを完了します。
- ステップ8.2.1 - NGINX構成ファイルの作成
- ステップ8.2.2 - NGINX構成ファイルの変更
- ステップ8.2.3 - NGINXのサーバー証明書のインストール
- ステップ8.2.4 - NGINX構成ファイルのインストール
- ステップ8.2.5 - 新しいNGINX構成のテスト
- ステップ8.2.6 - NGINXと新しい構成のリロード
- ステップ8.2.7 - GoldenGate Microservicesの接続のテスト
- ステップ8.2.8 - GoldenGate NGINX構成ファイルの配布
ステップ8.2.1 - NGINX構成ファイルの作成
Oracle GoldenGate Microservices Architectureは、リバース・プロキスを使用するように構成できます。Oracle GoldenGate Microservices Architectureには、ReverseProxySettings
というスクリプトが含まれています。このスクリプトによって、NGINXリバース・プロキシ・サーバーのみの構成ファイルを作成します。
このスクリプトには次のパラメータが必要です。
--user
パラメータは、初期デプロイメントの作成で指定したGoldenGate管理者アカウントの写しにする必要があります。- GoldenGate管理者パスワードの入力が求められます。
--port
パラメータで指定したリバース・プロキシ・ポート番号は、デフォルトのHTTPSポート番号(443)にする必要があります。ただし、同じ--host
を使用して複数のGoldenGateサービス・マネージャを実行している場合を除きます。その場合は、前のサービス・マネージャ・リバース・プロキシ構成と競合しないHTTPSポート番号を指定します。たとえば、同じホスト名/VIPを使用して2つのサービス・マネージャを実行する場合、最初のリバース・プロキシ構成は
--port 443 --host hostvip01
で作成し、2番目は--port 444 --host hostvip01
で作成します。個別のホスト名/VIPを使用する場合は、
--port 443 --host hostvip01
と--port 443 --host hostvip02
を使用して、2つのサービス・マネージャ・リバース・プロキシ構成を作成します。- 最後に、HTTPポート番号(9100)は、デプロイメントの作成時に指定したサービス・マネージャのポート番号と一致する必要があります。
このステップは、追加のGoldenGateサービス・マネージャごとに繰り返します。
oracle
OSユーザーとして、次のコマンドを使用して、Oracle GoldenGate NGINX構成ファイルを作成します。
[opc@exadb-node1 ~]$ sudo su - oracle
[oracle@exadb-node1 ~]$ export OGG_HOME=/u02/app/oracle/goldengate/gg21c
[oracle@exadb-node1 ~]$ export PATH=$PATH:$OGG_HOME/bin
[oracle@exadb-node1 ~]$ cd /u02/app_acfs/goldengate
[oracle@exadb-node1 ~]$ $OGG_HOME/lib/utl/reverseproxy/ReverseProxySettings
--user oggadmin --port 443 --output ogg_<instance_name>.conf http://localhost:9100
--host <VIP hostname/IP>
Password: <oggadmin_password>
ステップ8.2.2 - NGINX構成ファイルの変更
複数のGoldenGateサービス・マネージャが同じHTTPS 443ポートのIP/VIPを使用するように構成されている場合は、前のステップで生成したNGINXリバース・プロキシ構成ファイルに小さな変更が必要です。
同じポート番号を共有するすべてのサービス・マネージャは、--host
パラメータで指定したそれぞれのVIP/IPを使用して個別にアクセスされます。
oracle
OSユーザーとして、このサービス・マネージャによって管理されるデプロイメント名を調べます。まだわからない場合、デプロイメント名はリバース・プロキシ構成ファイルにリストされています。[opc@exadb-node1 ~]$ sudo su - oracle [oracle@exadb-node1 ~]$ cd /u02/app_acfs/goldengate [oracle@exadb-node1 ~]$ grep "Upstream Servers" ogg_<instance_name>.conf ## Upstream Servers for Deployment '<instance_name>'
この例では、デプロイメントは
SOURCE
と呼ばれます。oracle
OSユーザーとして、アンダースコアの前にデプロイメント名を追加することで、_ServiceManager
のすべての出現箇所を変更します。$ sed -i 's/_ServiceManager/<instance_name>_ServiceManager/' ogg_<instance_name>.conf
ステップ8.2.3 - NGINXのサーバー証明書のインストール
root
OSユーザーとして、ファイル権限400 (-r--------)のroot
が所有する/etc/nginx/ssl
ディレクトリでサーバー証明書とキー・ファイルをコピーします。[opc@exadb-node1 ~]$ sudo su - [root@exadb-node1 ~]# mkdir /etc/nginx/ssl [root@exadb-node1 ~]# chmod 400 /etc/nginx/ssl
root
OSユーザーとして、ステップ8.2.1で生成したリバース・プロキシ構成ファイルごとに、証明書とキー・ファイルの正しいファイル名を設定します。[oracle@exadb-node1 ~]$ vi /u02/app_acfs/goldengate/ogg_<instance_name>.conf # Before ssl_certificate /etc/nginx/ogg.pem; ssl_certificate_key /etc/nginx/ogg.pem; # After ssl_certificate /etc/nginx/ssl/server.chained.crt; ssl_certificate_key /etc/nginx/ssl/server.key;
CA署名付き証明書を使用する場合、ssl_certificate
NGINXパラメータで指定した証明書には、1) CA署名付き証明書、2)中間証明書および3)ルート証明書を単一ファイルに含める必要があります。この順序は重要です。そうしていないと、NGINXの起動は失敗して、エラー・メッセージが表示されます。
(SSL: error:0B080074:x509 certificate routines: X509_check_private_key:key values mismatch)
ルート証明書と中間証明書は、CA署名付き証明書プロバイダからダウンロードできます。
SSL証明書の単一ファイルは、次のコマンド例を使用して生成できます。
[root@exadb-node1 ~]# cat
CA_signed_cert.crt intermediate.crt root.crt > server.chained.crt
ssl_certificate_key
ファイルは、CA署名付き証明書をリクエストする際に必要になる証明書署名リクエスト(CSR)の作成時に生成されます。
ステップ8.2.4 - NGINX構成ファイルのインストール
root
OSユーザーとして、デプロイメント構成ファイル(ステップ8.2.1で複数のファイルを作成した場合はそれらのファイル)を/etc/nginx/conf.d
ディレクトリにコピーします。
[root@exadb-node1 ~]# mv /u02/app_acfs/goldengate/ogg_<instance_name>.conf
/etc/nginx/conf.d
ステップ8.2.5 - 新しいNGINX構成のテスト
root
OSユーザーとして、NGINX構成ファイルを検証します。
ファイルにエラーがある場合は、次のコマンドでエラーが報告されます。
[root@exadb-node1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginxconf test is successful
ステップ8.2.6 - NGINXと新しい構成のリロード
root
OSユーザーとして、新しい構成をロードするためにNGINXを再起動します。
[root@exadb-node1 ~]# systemctl restart nginx
ステップ8.2.7 - GoldenGate Microservicesの接続のテストroot
OSユーザーとして、デプロイメントのユーザー名とパスワードが含まれるcurl構成ファイル(access.cfg
)を作成します。[root@exadb-node1 ~]# vi access.cfg user = "oggadmin:<password>"
root
OSユーザーとして、次のコマンドを使用してデプロイメントのヘルスを問い合せます。[root@exadb-node1 ~]# curl -svf -K access.cfg https://<VIP hostname/IP>:<port#>/services/v2/config/health -XGET && echo -e "\n*** Success"
サンプル出力:
{"$schema":"api:standardResponse","links": [{"rel":"canonical","href":"https://gg-prmy-vip1/services/v2/config/health", "mediaType":"application/json"}, {"rel":"self","href":"https://gg-prmy-vip1/services/v2/config/health", "mediaType":"application/json"},{"rel":"describedby", "href":"https://gg-prmy-vip1/services/ServiceManager/v2/metadata-catalog/health", "mediaType":"application/schema+json"}],"messages":[], "response":{"$schema":"ogg:health","deploymentName":"ServiceManager", "serviceName":"ServiceManager","started":"2021-12-09T23:33:03.425Z","healthy":true, "criticalResources":[{"deploymentName":"SOURCE","name":"adminsrvr","type":"service", "status":"running","healthy":true},{"deploymentName":"SOURCE","name":"distsrvr", "type":"service","status":"running","healthy":true}, {"deploymentName":"SOURCE","name":"recvsrvr","type":"service","status":"running", "healthy":true}]}} *** Success ***
root
OSユーザーとして、デプロイメントのユーザー名とパスワードが含まれるcurl
構成ファイル(access.cfg
)を削除します。[root@exadb-node1 ~]# rm access.cfg rm: remove regular file ‘access.cfg’? y
GoldenGateサービス・マネージャ用のすべてのリバース・プロキシ構成ファイルを作成した後に、そのファイルをすべてのデータベース・ノードにコピーする必要があります。
opc
OSユーザーとして、すべてのデータベース・ノードにNGINX構成ファイルを配布します。[opc@exadb-node1 ~]$ sudo tar fczP nginx_conf.tar /etc/nginx/conf.d/ /etc/nginx/ssl/ [opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc -d /tmp -f nginx_conf.tar [opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo tar fxzP /tmp/nginx_conf.tar
opc
OSユーザーとして、新しい構成ファイルのコピー先にしたすべてのノードで新しいNGINX構成をテストします。[opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo nginx -t exadb-node1: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok exadb-node1: nginx: configuration file /etc/nginx/nginx.conf test is successful exadb-node2: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok exadb-node2: nginx: configuration file /etc/nginx/nginx.conf test is successful
opc
OSユーザーとして、新しい構成をロードするために、すべてのノードでNGINXを再起動します。[opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo systemctl restart nginx
ステップ8.3 - GoldenGate Microservicesの保護によるセキュアでない直接アクセスの制限
セキュアでないOracle GoldenGate MicroservicesデプロイメントにNGINXリバース・プロキシを構成していると、そのマイクロサービスは構成したマイクロサービスのポート番号を使用してHTTP (非セキュア)のアクセスができる状態が続きます。
たとえば、セキュアでないURLのhttp://<vip-name>:9101
を使用して管理サーバーにアクセスできます。
Oracle GoldenGate Microservicesの各サーバー(サービス・マネージャ、adminserver
、pmsrvr
、distsrvr
およびrecsrvr
)に対するデフォルトの動作では、構成されたポート番号を使用してすべてのネットワーク・インタフェースでリスニングします。これは、マイクロサービスへのHTTPを使用した直接アクセスを無効にして、NGINX HTTPSを使用したアクセスのみ許可する必要がある、よりセキュアなインストールには望ましくありません。
次のコマンドを使用して、localhostアドレスのみを使用するようにサービス・マネージャとデプロイメント・サービスのリスナー・アドレスを変更します。Oracle GoldenGate Microservicesへのアクセスはlocalhostからのみ許可されるようになり、localhost外部のアクセスはNGINX HTTPSポートを使用してのみ成功するようになります。
ステップ8.3.1 - サービス・マネージャの停止
grid
OSユーザーとして、サービス・マネージャを停止します。
[opc@exadb-node1 ~]$ sudo su - grid
[grid@exadb-node1 ~]$ agctl stop goldengate <instance_name>
[grid@exadb-node1 ~]$ agctl status goldengate
Goldengate instance '<instance_name>' is not running
ステップ8.3.2 - サービス・マネージャ・リスナー・アドレスの変更
oracle
OSユーザーとして、次のコマンドでリスナー・アドレスを変更します。
変更するサービス・マネージャに、適切なポート番号を使用してください。サーバーの起動に失敗しますが、エラーを無視して次のステップに進みます。
[opc@exadb-node1 ~]$ sudo su - oracle
[oracle@exadb-node1 ~]$ export OGG_HOME=/u02/app/oracle/goldengate/gg21c
[oracle@exadb-node1 ~]$ export
OGG_VAR_HOME=<acfs or dbfs mount point>/deployments/ggsm01/var
[oracle@exadb-node1 ~]$ export OGG_ETC_HOME=<acfs or
dbfs mount point>/deployments/ggsm01/etc
[oracle@exadb-node1 ~]$ $OGG_HOME/bin/ServiceManager
--prop=/config/network/serviceListeningPort
--value='{"port":9100,"address":"127.0.0.1"}'
--type=array --persist --exit
[oracle@exadb-node1 ~]$
ステップ8.3.3 - サービス・マネージャとデプロイメントの再起動
grid
OSユーザーとして、サービス・マネージャとデプロイメントを再起動します。
[opc@exadb-node1 ~]$ sudo su - grid
[grid@exadb-node1 ~]$ agctl start goldengate <instance_name>
[grid@exadb-node1 ~]$ agctl status goldengate
Goldengate instance '<instance_name>' is running on exadb-node1
ステップ8.3.4 - GoldenGate Microservicesリスナー・アドレスの変更
oracle
OSユーザーとして、次のコマンドを使用して、サービス・マネージャによって管理されるデプロイメントのすべてのGoldenGateマイクロサービス(adminsrvr
、pmsrvr
、distsrvr
、recvsrvr
)のリスニング・アドレスをlocalhost
に変更します。
[opc@exadb-node1 ~]$ sudo su - oracle
[oracle@exadb-node1 ~]$ cd /u02/app_acfs/goldengate
[oracle@exadb-node1 ~]$ chmod u+x secureServices.py
[oracle@exadb-node1 ~]$ ./secureServices.py http://localhost:9100 --user oggadmin
Password for 'oggadmin': <oggadmin_password>
*** Securing deployment - ogg_deployment
Current value of "/network/serviceListeningPort" for "<instance_name>/adminsrvr" is
{
"address": "127.0.0.1",
"port": 9101
}
Current value of "/network/serviceListeningPort" for "<instance_name>/distsrvr" is
{
"address": "127.0.0.1",
"port": 9102
}
Current value of "/network/serviceListeningPort" for "<instance_name>/pmsrvr" is
{
"address": "127.0.0.1",
"port": 9104
}
Current value of "/network/serviceListeningPort" for "<instance_name>/recvsrvr" is
{
"address": "127.0.0.1",
"port": 9103
}
ノート:
単一のデプロイメント(adminsrvr
、pmsrvr
、distsrvr
、recvsrvr
)を変更する場合は、フラグ--deployment instance_name
を追加します
ステップ8.3.5 - NGINX default.conf構成ファイルの削除
opc
OSユーザーとして、/etc/nginx/conf.d
に作成されたデフォルト構成ファイル(default.conf
)を削除します。
[opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo rm
-f /etc/nginx/conf.d/default.conf
[opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo nginx -s reload
ステップ8.4 - NGINXを管理するClusterwareリソースの作成Oracle Clusterwareは、NGINXリバース・プロキシの起動を制御して、Oracle GoldenGateデプロイメントの起動前に自動的にリバース・プロキシを起動できるようにする必要があります。
grid
OSユーザーとして、次のコマンドを使用して、基盤となるネットワークCRSリソースに依存するNGINXリソースの作成に必要なネットワークCRSリソース名を取得します。[opc@exadb-node1 ~]$ sudo su - grid [grid@exadb-node1 ~]$ crsctl stat res -w "TYPE == ora.network.type"|grep NAME NAME=ora.net1.network
root
OSユーザーとして、次のサンプル・コマンドを使用して、NGINXを管理するClusterwareリソースを作成します。HOSTING_MEMBERS
およびCARDINALITY
は環境に合致するように置き換えます。[opc@exadb-node1 ~]$ sudo su - [root@exadb-node1 ~]# $(grep ^crs_home /etc/oracle/olr.loc | cut -d= -f2)/bin/crsctl add resource nginx -type generic_application -attr "ACL='owner:root:rwx,pgrp:root:rwx,other::r--,group:oinstall:r-x,user:oracle:rwx', EXECUTABLE_NAMES=nginx,START_PROGRAM='/bin/systemctl start -f nginx',STOP_PROGRAM='/bin/systemctl stop -f nginx',CHECK_PROGRAMS='/bin/systemctl status nginx' ,START_DEPENDENCIES='hard(ora.net1.network) pullup(ora.net1.network)', STOP_DEPENDENCIES='hard(intermediate:ora.net1.network)', RESTART_ATTEMPTS=0, HOSTING_MEMBERS='<exadb-node1, exadb-node2>', CARDINALITY=2"
この例で作成したNGINXリソースは、指定のデータベース・ノード(
HOSTING_MEMBERS
で指定)で同時に実行されます。これは、複数のGoldenGateサービス・マネージャのデプロイメントが構成されていて、それらがデータベース・ノード間で独立して移動できる場合にお薦めします。NGINX Clusterwareリソースの作成後には、GoldenGateデプロイメントの起動前にNGINXを起動するように、GoldenGate XAGリソースを変更する必要があります。
root
OSユーザーとして、次のコマンド例を使用してXAGリソースを変更します。# Determine the current --filesystems parameter: [opc@exadb-node1 ~]$ sudo su - grid [grid@exadb-node1 ~]$ agctl config goldengate <instance_name> |grep "File System" File System resources needed: <file_system_resource_name> # Modify the --filesystems parameter: [opc@exadb-node1 ~]$ sudo su - [root@exadb-node1 ~]# /u01/app/grid/xag/bin/agctl modify goldengate <instance_name> --filesystems <file_system_resource_name>,nginx
- NGINXに依存するXAG GoldenGateの登録ごとに、前述のコマンドを繰り返します。