## 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 以上