JoruriCMS2017 WEB x CMS 設定手順

※ Joruri CMS 2017のシステムを複数のサーバーで構成したシステムについてのお問い合わせは、有償サポートのユーザー様のみ承っています。
 https://joruri-cms.jp/2017/support/

Joruri CMS 2017 WEBxCMS 設定手順書[TXT:15.3KB]

## JoruriCMS2017 WEBxCMS 設定マニュアル

**********************************************************************
 1. 前提条件
**********************************************************************

管理画面(CMS)と公開画面(WEB)のサーバーを分離してパフォーマンスとセキュリティを向上させることができます。

同じバージョンのJoruriCMSがCMSおよびWEBサーバーにインストール済みとします。
OSのバージョンはCentOS8で、データベースのバージョンはpostgres12です。
CentOS7の場合、標準で組み込まれているPostgresのバージョンが異なるため、対応するバージョン(9.5)に置き換えて実行してください。

[設定]
公開画面(WEBサーバー)
 ドメイン : www.example.com
 IPアドレス : 192.168.0.2
管理画面(CMSサーバー)
 ドメイン : admin.example.com
 IPアドレス : 192.168.0.3

ポートはSSH(22)、Postgresql(5432)をプライベートネットワークで開放しておくこと。

**********************************************************************
2. PostgreSQLレプリケーション設定
**********************************************************************

CMSサーバーとWEBサーバーで作業が必要となります。

[WEBサーバー][CMSサーバー]共通
Slonyをインストール

# cd /usr/local/src/
# wget https://www.slony.info/downloads/2.2/source/slony1-2.2.8.tar.bz2 --no-check-certificate
# tar xf  slony1-2.2.8.tar.bz2

Slonyをインストールします。
# cd slony1-2.2.8
# ./configure --prefix=/usr/local/slony --with-pgconfigdir=/usr/pgsql-12/bin/ --with-perltools
# make &&  make install


slonyの同期対象の書き出し
$ su - joruri
$ cd /var/www/joruri
$ RAILS_ENV=production ./bin/rails generate cms:slony:slony_sets

「config/slony/slony_sets.conf」にレプリケーション対象のテーブルとシーケンスが書き出されます。
後述する出力した値は、「slon_tools.conf」の設定時に使用します。
$ cat config/slony/slony_sets.conf

設定ファイルを準備します。
# su -
# cd /usr/local/slony/etc/
# cp -ap slon_tools.conf-sample slon_tools.conf

「pkeyedtables」と「sequences」は省略していますが、
「※省略」の部分を「slony設定ファイル書き出し機能」で出力したものと差し替えます。


# vi slon_tools.conf
-------------------------
    # (26行目)
    #$PIDFILE_DIR = '/var/run/slony1'; # コメントアウト
    $PIDFILE_DIR = '/run'; # pidファイルの保存場所を変更

    #(47行目)
    # $LOG_NAME_SUFFIX = '%a';
    $LOG_NAME_SUFFIX = "node"; # 仮の名前を付ける「joruri_production-node.log」となる

     #(75行目)
     add_node(node     => 1,
                  host     => '192.168.0.3', # IPで指定
                  dbname   => 'joruri_production', # 対象データベースへ変更
                  port     => 5432,
                  user     => 'joruri', # postgresqlのユーザで「SUPERUSER」権限を付与する必要がある
                  password => ''
     #             config   => '/path/to/node1_config_file.conf' # コメントアウト
                  );

         add_node(node     => 2,
                  host     => '192.168.0.2', # IPで指定
                  dbname   => 'joruri_production', # 対象データベースへ変更
                  port     => 5432,
                  user     => 'joruri',# postgresqlのユーザで「SUPERUSER」権限を付与する必要がある
                  password => ''
     #             config   => '/path/to/node2_config_file.conf' # コメントアウト
                  );

     # 使用しないnodeはコメントアウト
     #    add_node(node     => 3,
     #            host     => 'server3',
     #            dbname   => 'database',
     #            port     => 5432,
     #            user     => 'postgres',
     #             password => '',
     #             config   => '/path/to/node3_config_file.conf');

     #    add_node(node     => 4,
     #            parent   => 3,
     #            host     => 'server4',
     #            dbname   => 'database',
     #            port     => 5432,
     #            user     => 'postgres',
     #            password => '',
     #            config   => '/path/to/node4_config_file.conf');

     #(149行目)
        "table_id"    => 1,
        "sequence_id" => 1,

     # Primary Keyを持つ同期対象テーブルを設定
        "pkeyedtables" => [

          ※省略
                          ],

     # 修正(keyedtablesの内容を削除)
     #  "keyedtables" => {
     #      'table3' => 'index_on_table3',
     #      'table4' => 'index_on_table4',
     #  },
       "keyedtables" => {
       },


     # 同期対象のシークエンスを設定
        "sequences" => [

           ※省略
                        ],
    },

     #コメントアウト
     #    "set2" => {
     #       "set_id"       => 2,
     #       "table_id"     => 6,
     #       "sequence_id"  => 3,
     #       "pkeyedtables" => ["table6"],
     #       "keyedtables"  => {},
     #       "sequences"    => [],
     #   },

     };
-------------------------

Postgresqlの他サーバからの接続を許可します。
# cd /var/lib/pgsql/12/data/
# cp -ap postgresql.conf  postgresql.conf`date "+%Y%m%d%H%M"`
# vi postgresql.conf
     - - - - - - - - - - - - - - - - - - - -
    (53行目:CONNECTIONS AAND AUTEHNTICATION項目)
        listen_addresses = '*'
     - - - - - - - - - - - - - - - - - - - -

Postgresqlでローカルネットワークからの接続を許可します。
# cp -ap pg_hba.conf pg_hba.conf.`date "+%Y%m%d%H%M"`
# vi pg_hba.conf
-------------------------
host joruri_production joruri 192.168.0.2/32 md5
host joruri_production joruri 192.168.0.3/32 md5
-------------------------


実行するユーザの権限にSUPERUSER権限を付与します。
# su - postgres
$ psql
postgres=# ALTER USER joruri WITH PASSWORD 'joruripass';
postgres=# ALTER ROLE joruri SUPERUSER;
postgres=# \q


slonプロセスにパスワードが表示されるため、.pgpassを作成します。
$ vi ~/.pgpass
-------------------------
192.168.0.2:5432:joruri_production:joruri:joruripass
192.168.0.3:5432:joruri_production:joruri:joruripass
-------------------------

$ chmod 600 ~/.pgpass
$ exit

# vi ~/.pgpass
-------------------------
192.168.0.2:5432:joruri_production:joruri:joruripass
192.168.0.3:5432:joruri_production:joruri:joruripass
-------------------------

# chmod 600 ~/.pgpass

# systemctl restart postgresql-12


[WEBサーバー]
Joruriユーザーーのcrontab設定を全て削除(コメントアウトでも可)にします。
# su - joruri -c 'crontab -e'


delayed_jobを停止します。
# systemctl stop joruri_delayed_job && systemctl disable joruri_delayed_job


[CMSサーバー]

連携機能の有効化
# su - joruri
$ cd /var/www/joruri

slonik.ymlをコピー
$ cp config/original/slonik.yml config/slonik.yml

$ vi config/slonik.yml
-------------------------
default: &default
  enabled: true  # ここをtrueにする
-------------------------

$ exit

Slonyを初期設定します。

# su -
# cd /usr/local/slony/bin/
# ./slonik_init_cluster --config=../etc/slon_tools.conf | ./slonik

MasterでSlonyによるレプリケーション構成を作成します。
# ./slonik_create_set --config=../etc/slon_tools.conf set1 | ./slonik

MasterでSlonyのレプリケーションを開始します。
# ./slon_start --config=../etc/slon_tools.conf node1

Slonyが稼働していることを確認します。
# ps -ef | grep slony

# cd /usr/local/slony/bin/
# ./slon_start --config=../etc/slon_tools.conf node2


[WEBサーバー]
# su -
# cd /usr/local/slony/bin/
# ./slon_start --config=../etc/slon_tools.conf node2


[CMSサーバー]

同期状態を確認します。
# su - postgres
$ psql joruri_production
joruri_production=# select * from _replication.sl_status;
 st_origin | st_received | st_last_event |       st_last_event_ts        | st_last_received |      st_last_received_ts      |   st_last_received_event_ts   | st_lag_num_events |   st_lag_time
-----------+-------------+---------------+-------------------------------+------------------+-------------------------------+-------------------------------+-------------------+-----------------
         2 |           1 |    5000000138 | 2019-11-12 14:54:34.786548+09 |       5000000137 | 2019-11-12 14:54:25.378416+09 | 2019-11-12 14:54:24.777618+09 |                  1| 00:00:13.089255
(1 行)


「st_last_event」と「st_last_received」がMaster-Slave間のトリガイベントを表しており、
更新は「st_lag_time」が一定間隔(数十秒以下)であれば正常に行われています。


[WEBサーバー][CMSサーバー]共通

自動起動、環境変数、ログローテート設定を追加します。
# su -
# cd /usr/local/slony/etc/

自動起動用の設定を作成します。[node-id]は各環境に合わせて変更してください。
# vi slony.service
-------------------------
[Unit]
Description=Slony-I daemon
After=postgresql-12.service

[Service]
Type=simple
PIDFile=/run/replication_node[node-id].pid
ExecStart=/usr/local/slony/bin/slon_start --config=/usr/local/slony/etc/slon_tools.conf node[node-id]
ExecStop=/usr/local/slony/bin/slon_kill

[Install]
WantedBy=multi-user.target
-------------------------


環境変数の設定を作成します。
# vi slony.sh
-------------------------
export PATH="/usr/local/slony/bin:${PATH}"
-------------------------


logrotateによるログローテート設定を作成します[node-id]は各環境に合わせて変更してください。
# vi slony_logrotate
-------------------------
"/var/log/slony1/node[12]/*.log" {
  rotate 5
  daily
  copytruncate
  delaycompress
  compress
  notifempty
  missingok
  su root root
  postrotate
        /usr/local/slony/bin/slon_kill node[node-id] > /dev/null 2>&1
        sleep 10
        /usr/local/slony/bin/slon_start node[node-id] > /dev/null 2>&1
  endscript
  }
-------------------------

作成したファイルを各設定ディレクトリへコピーします。
# cp -ap ./slony.sh /etc/profile.d/
# cp -ap ./slony_logrotate /etc/logrotate.d/
# cp -ap ./slony.service /usr/lib/systemd/system/

Slonyを自動起動に設定します。
# systemctl start slony && systemctl enable slony


※何らかの原因でレプリケーションに失敗する場合はSlonyの初期化を行ってください。

Slonyプロセスを停止します。
# systemctl stop slony

[CMSサーバー]

Postgresqlのslony用のスキーマと設定を削除します。
# slonik_uninstall_nodes | slonik

Slonyを初期化します。
# slonik_init_cluster --config=/usr/local/slony/etc/slon_tools.conf | slonik

MasterでSlonyによるレプリケーション構成を作成します。
# slonik_create_set --config=/usr/local/slony/etc/slon_tools.conf set1 | slonik

Masterのnodeを開始します。
# slon_start --config--config=/usr/local/slony/etc/slon_tools.conf node1

Slaveのnodeを開始します。
# slon_start --config=/usr/local/slony/etc/slon_tools.conf node2

Slaveのレプリケーションを開始します。
# slonik_subscribe_set --config=/usr/local/slony/etc/slon_tools.conf set1 node2 | slonik

**********************************************************************
3. RSAキーペア認証の設定
**********************************************************************

パスなしRsyncが利用できるようにRSAキーペア認証を設定します。

[CMSサーバー]

joruriユーザーのキーペアを生成
# su - joruri -c 'cd && ssh-keygen -t rsa'
パスフレーズは空でenterを押すこと

public keyをメモします。
# cat /home/joruri/.ssh/id_rsa.pub
-------------------------
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzlmMnohZgk9vRsgLeVlwWmlwSuwJA0sbx3J/x8sIu1Vv2ypLHuOaRx6v0cN72VzR1HXV2Lsy5GfBF7LhNBole0DqWE228NLJhzHwGAegbnhsVcphnHYUlm1tV4+bTB/XFzErsTr6Uuok6HlE9nFcFgyTr+c/ifjRkOdLXgk4O1zgzUaj36ld6XB8Bl+f/dCG92hnSP+CTnfeMKk2sUTI8aUZ8QlIblBkL6ydcwxypvpYoUAL9mHKjE/G+fPfOtsh7DwDIgt/7f3+yzclXv2Hhqp5oRQbAKy7H+T/kbZjWDmK/GaCpYBKdoMxmXRvFvHey1MGc2FVRnKv2MJIqeWoQw== joruri@cms
-------------------------


[WEBサーバー]

CMSサーバーのpublic keyをauthorized_keysファイルに追加
# su - joruri -c 'cd && mkdir .ssh && chmod 700 .ssh && touch .ssh/authorized_keys'
# vi /home/joruri/.ssh/authorized_keys
-------------------------
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzlmMnohZgk9vRsgLeVlwWmlwSuwJA0sbx3J/x8sIu1Vv2ypLHuOaRx6v0cN72VzR1HXV2Lsy5GfBF7LhNBole0DqWE228NLJhzHwGAegbnhsVcphnHYUlm1tV4+bTB/XFzErsTr6Uuok6HlE9nFcFgyTr+c/ifjRkOdLXgk4O1zgzUaj36ld6XB8Bl+f/dCG92hnSP+CTnfeMKk2sUTI8aUZ8QlIblBkL6ydcwxypvpYoUAL9mHKjE/G+fPfOtsh7DwDIgt/7f3+yzclXv2Hhqp5oRQbAKy7H+T/kbZjWDmK/GaCpYBKdoMxmXRvFvHey1MGc2FVRnKv2MJIqeWoQw== joruri@web
-------------------------
# chmod 600 /home/joruri/.ssh/authorized_keys

SSH設定にRSAキー認証の有効かとjoruriユーザーを追加
# vi /etc/ssh/sshd_config
-------------------------
RSAAuthentication yes
AllowUsers joruri
-------------------------

SSHを再起動
# systemctl restart sshd.service


**********************************************************************
4. RSYNCの設定
**********************************************************************

CMSサーバーからWEBサーバーへのRsyncを設定します。
file_transferを有効にすることで、ページ書き出し処理時にRsync転送処理も実行されるようになります。

[CMSサーバー]

# su - joruri

$ vi /var/www/joruri/config/application.yml
-------------------------
  # ファイル転送機能
  file_transfer: true
-------------------------


$ vi /var/www/joruri/config/rsync.yml
-------------------------
production:
  bin: rsync
  opts: -lptzv --delete -e "ssh -p 22"
  dests:
    - path: joruri@192.168.0.2:/var/www/joruri/
-------------------------


コンフィグファイルの転送設定
$ mkdir /home/joruri/shell
$ vi /home/joruri/shell/file_sync.sh
-------------------------
# WEBサーバー
rsync -avz --delete --copy-links -e ssh /var/www/joruri/sites/ 192.168.0.2:/var/www/joruri/sites/
-------------------------

$ vi /home/joruri/shell/site_conf_sync.sh
-------------------------
# WEBサーバー
rsync -avz --delete --copy-links -e ssh /var/www/joruri/config/nginx/servers/ 192.168.0.2:/var/www/joruri/config/nginx/servers/
rsync -lptzv --delete -e ssh /var/www/joruri/sites/*/ 192.168.0.2:/var/www/joruri/tmp/sites/*/
rsync -avz --delete -e ssh /var/www/joruri/tmp/reload_servers.txt 192.168.0.2:/var/www/joruri/tmp/
-------------------------

$ chmod 755 /home/joruri/shell/file_sync.sh
$ chmod 755 /home/joruri/shell/site_conf_sync.sh

$ crontab -e
-------------------------
# file transfer
#*/30 * * * *  /home/joruri/shell/file_sync.sh > /home/joruri/shell/file_sync.log
# site conf transfer
29,59 * * * *  /home/joruri/shell/site_conf_sync.sh > /home/joruri/shell/site_conf_sync.log
-------------------------
$ exit

**********************************************************************
5. WEBサーバーの管理画面URLを無効化
**********************************************************************

[CMSサーバー]

/_systemのURLを無効化する設定を追加
# su - joruri
$ mkdir /var/www/joruri/config/nginx/servers/site.d
$ vi /var/www/joruri/config/nginx/servers/site.d/deny_systems.conf
-------------------------
  location ~ ^/_system {
    try_files $uri $uri/index.html @proxy;
    deny all;
  }
-------------------------

$ mkdir /var/www/joruri/config/nginx/servers/ssl_site.d
$ cp -arp /var/www/joruri/config/nginx/servers/site.d/deny_systems.conf /var/www/joruri/config/nginx/servers/ssl_site.d/deny_systems.conf
$ exit

**********************************************************************
6. アンケートフォーム等の取り込み設定
**********************************************************************

WEBサーバーで受け付けた情報をCMSサーバーに取り込むためのデータベース接続設定です。

[CMSサーバー]

# su - joruri

$ cd /var/www/joruri/config
$ cp -ap database.yml database.yml_`date "+%Y%m%d"`
$ vi database.yml
-------------------------
#末尾に追記
production_pull_database:
  <<: *default
  database: joruri_production
  username: joruri
  password: joruripass
  host: 192.168.0.2
-------------------------

$ exit

サービス再起動
# su -
# systemctl restart joruri_delayed_job
# systemctl restart joruri_unicorn
# systemctl restart nginx


以上