CentOS7に最新のPostgreSQL

テスト環境のCentOS7に入れてあるPostgreSQLが古いので、バージョンアップして最新に。その時の、作業メモ。

1.インストール

yumのままだとPostgreSQL9.2になっているので、最新をRPMから入れる。

(PostgreSQL公式)PostgreSQL: Linux downloads (Red Hat family)

このページで、1.バージョン、2.プラットフォーム、3.アーキテクチャーを選べば、4に必要なコマンドが出てくるので、それを実行。

$ yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ yum install -y postgresql13-server
$ /usr/pgsql-13/bin/postgresql-13-setup initdb
$ systemctl enable postgresql-13
$ systemctl start postgresql-13

事前に、前のバージョンは、停止して、自動起動も止める。

$ systemctl stop postgresql
$ systemctl disable postgresql

環境設定等は、以下が参考になる。

(Qiita)PostgreSQL スーパーユーザの環境変数設定

2.DB復元

バックアップファイルから、DBを復元する。

1)postgresユーザーになって、psqlコマンドを起動し、データベースとロールを作成。

$ su - postgres
$ psql
psql (13.1)
Type "help" for help.
postgres=# CREATE DATABASE xxxxxx;
CREATE DATABASE
postgres=# CREATE ROLE xxxxxx SUPERUSER LOGIN PASSWORD 'xxxxx';
CREATE ROLE
postgres=# \q

2)DBの復元

$ pg_restore -d xxxxx バックアップファイル

3.接続設定

新しいバージョンの定義ファイルを修正して、従来と同じ方法で接続できるようにする。

(定義ファイルの場所)

/var/lib/pgsql/13/data/

開発環境からの接続を許可するように、以下ファイルを修正。

$ diff pg_hba.conf.org pg_hba.conf
86a87
host all all 111.111.111.111/32 scram-sha-256    ※111.111.111.111:開発環境のIPアドレス

$ diff postgresql.conf.org postgresql.conf
62a63
listen_addresses = '*'

ファイアウォールでPostgreSQLのポートが閉じられているなら、開く。

4.ポート変更する場合

セキュリティー上、あるいは複数バージョンを同時に立ち上げる等でポート変更する場合。

1)設定ファイルのポートを変更して再起動

# diff postgresql.conf.org postgresql.conf
64c64
< #port = 5432                          # (change requires restart)
---
> port = 9999                           # (change requires restart) 

# systemctl restart postgresql-13

2)ファイアウォールのPostgreSQLのポートを変更、または追加

両方のバージョンを並行運用することも考えて、13は別サービスとして登録。

サービス定義ファイルの場所に移動して、サービス定義ファイルをコピーして、ポートを修正する。

# cd /usr/lib/firewalld/services
# cp postgresql.xml postgresql-13.xml
# vi postgresql-13.xml   ※portの設定を変更
# firewall-cmd --permanent --add-service=postgresql-13
# firewall-cmd --reload
# firewall-cmd --list-all ※確認

※ちなみに、yumで入れたPostgreSQL9.2もポート番号を変えたい場合、サービス起動ファイルに、ポートが書かれているのでこちらを変更する必要がある。

# vi /usr/lib/systemd/system/postgresql.service
    ※Environment=PGPORT=5432 を変更して、サービス再登録
# systemctl stop postgresql
# systemctl disable postgresql
# systemctl enable postgresql
# systemctl start postgresql
# systemctl status postgresql  ※ポート変更されていることを確認

CentOSサーバーにGit

GitHubにソースを置きたくないので(一応、4月から無料でもprivateにできるが)、自前のサーバーにGitを立てることにした。Gitの公式ドキュメントは以下。

Gitドキュメント(日本語)

とりあえず、Gitサーバー立てるのは、以下を参考に。

4.4 Gitサーバー – サーバーのセットアップ

0)方針

  • 個人の開発端末のVisual Studio 2019のローカルレポジトリーのバックアップ用。
  • 端末は複数(自宅、外)あるので、共有とする。
  • 公開サーバー上に置くので、アクセスはポート変更済みのSSHで鍵認証。
  • ユーザーはgit操作しかできないユーザーとする。

1)Gitインストール

$ yum install git

2)Gitユーザー作成

git用のユーザーを作成する。この時、ログインシェルをgitに制限したものgit-shellを指定。

$ adduser --shell=/usr/bin/git-shell git

3)SSH公開鍵の登録

クライアント側の公開鍵を登録するために、gitユーザーにsuする。

$ su -s /bin/bash - git

クライアント側(開発PC端末)のSSH公開鍵(/tmp/id_rsa.john.pub)を登録する。※公開鍵が未作成の場合は、以下手順(5-1)で作成した公開鍵を登録。

$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
 ※viで編集するでもOK

4)プロジェクトの初期化

空の共有のhogeプロジェクトを作成。

$ cd
$ mkdir hoge.git
$ cd hoge.git
$ git init --bare --shared
 ※gitユーザーでしか使わないのが、後の為、一応、shared

5)Windows側のSSH設定

Windows PowerShellを起動して、SSHの設定を行う。ちなみに、Visual Studio 2019のGitで使うSSHコマンドは以下に入っている

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\usr\bin

5-1)SSH公開鍵の作成

ssh-keygenコマンドで、鍵を作成する。鍵を作成したら、公開鍵(端末側の、~/.ssh/id_rsa.pub)を、サーバー側の~/.ssh/authoraized_keysに追加登録する。※上記手順3にて

4.3 Gitサーバー – SSH 公開鍵の作成

$ ssh-keygen

5-2)既知ホストの追加&接続確認

Gitサーバー(xxx.gijutsu.comで、SSHポートが9999の場合)に接続して、クライアント側の既知ホストに登録する。

$ ssh -p 9999 -l git xxx.gijutsu.com

この時、既知ホストに追加するか聞いてくるので、yesを入力。その後は、以下のシェルエラーとなればOK。

Last login: Tue Dec 1 10:13:25 2020
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to xxx.gijutsu.com closed.

6)Visual StudioからのPush

作成したGitサーバーのhogeプロジェクトにプッシュする場合は、リモートURLは以下を指定。

ssh://git@xxx.gijutsu.com:9999/~/hoge.git

Visual Studio 2019では、「Git 」から「Gitレポジトリの作成」で、「既存のリモート」を選択して、上記のリモートURLを入力する。

Visual Studio 2019 - Gitレポジトリの作成

バックアップ設定

以下、バックアップの方針に基づいて、CentOSサーバー間で、バックアップ設定した手順。

0.環境

転送元サーバー:CentOS 8.2

  • ホスト名(例):www.xxservice.com
  • グローバルアドレス(例):222.222.222.222
  • プライベートネットワークアドレス(例):10.10.10.1
  • sshdポート(例):7777
  • バックアップを実行するユーザー(例):appuser

転送先サーバー1:CentOS 7.8

  • ホスト名(例):bak1.xxservice.com
  • プライベートネットワークアドレス(例):10.10.10.200
  • sshdポート(例):8888

転送先サーバー2:CentOS 7.8

  • ホスト名(例):bak2.xxservice.com
  • 転送元サーバーとは別拠点で、プライベートネットワーク未接続
  • sshdポート(例):9999

1.転送先サーバーの設定

バックアップ用ユーザー(例):backupuser

バックアップディレクトリ(例):/home/backupuser/xxservice/

1-1)sshd_configの修正

/etc/ssh/sshd_configの設定が以下となるようにする。

  • ホストベース認証を有効
  • ホストベース認証の既知ホストは、ユーザーディレクトリ下を許可
  • ユーザーディレクトリ下の.shostsを有効にする。
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
HostbasedAuthentication yes
# Change to yes if you don't trust ~/.ssh/known_hosts for HostbasedAuthentication 
IgnoreUserKnownHosts no 
# Don't read the user's ~/.rhosts and ~/.shosts files 
IgnoreRhosts no

後、プライベートネットワークでは逆引きできない。余計なログを出さないようにUseDNSがyesの場合は、noに変更する。

UseDNS no

設定変更後に、設定の読み込み。

$ systemctl reload sshd

1-2)rootユーザーへのスイッチ禁止

/etc/pam.d/suで、以下を設定し、rootユーザへのスイッチを禁止する。

auth required pam_wheel.so use_uid root_only

1-3)バックアップ用ユーザー作成

$ adduser backupuser

1-4)バックアップ用ディレクトリ作成

$ su - backupuser
[backupuser ~]$ mkdir xxservice

1-5)既知ホストの追加

バックアップユーザーで、転送元サーバーにssh接続を試みて、公開鍵を取得して既知ホストに登録する。

※転送先サーバー1の場合
[backupuser ~]$ ssh -p 7777 10.10.10.1

※転送先サーバー2の場合
[backupuser ~]$ ssh -p 7777 www.xxservice.com

既知ホストに追加するかと聞いてくるので、yesで登録すると、~/.ssh/known_hostsに登録される。

ポート番号が入った形で登録されるので、viコマンドで修正する。

※転送先サーバー2の場合、以下のように修正する

[www.xxservice.com]:7777,[222.222.222.222]:7777 (公開鍵) 
↓
www.xxservice.com,222.222.222.222 (公開鍵)

1-6).shostsの設定

viコマンドで、.shostsファイルを作成し、中身は以下とする。転送元サーバーのIPアドレスを設定する。

※転送先サーバー1の場合

10.10.10.1 appuser 

※転送先サーバー2の場合

222.222.222.222 appuser 

パーミッションを変更して、.shostsファイルを見えないようにする。

[backupuser ~]$ chmod 600 .shosts

2.転送元サーバーの設定

2-1)ssh_configの修正

従来はssh_configを直接修正していたが、CentOS 8.2 では、以下ディレクトリにファイル追加するのが作法みたい。

/etc/ssh/ssh_config.d/99-hostbase.confを、以下内容で作成する。

HostbasedAuthentication yes
EnableSSHKeysign yes

2-2)既知ホストの追加と接続確認

以下コマンドで接続し、既知ホストに追加するかと聞いてくるので、yesで登録する。

※転送先サーバー1への接続
[appuser ~]$ ssh -p 8888 -l backupuser 10.10.10.200

※転送先サーバー2
[appuser ~]$ ssh -p 9999 -l backupuser bak2.xxservice.com

問題なければ、無事にログインできる。

2-3)バックアップ処理の登録

以下のコマンドを作成して、実行権を付けて、cron実行する。

2-3-1)バックアップコマンド

do_backupという名前で以下ファイルを作成する。timeコマンドで実行時間を計測しながら、低優先度でバックアップを実行する。

引数は、バックアップサーバーのアドレス、ポート、バックアップファイルの接尾辞で、このコマンドは、バッチから引数を渡されて実行される。

【do_backup】

#!/bin/sh
#
alias dotime='time ionice -c 2 -n 7 nice -n 19'

# param
if [ $# -ne 3 ]; then
  echo "param error!!"
  exit 1
fi
BACKUP_SERVER=$1
BACKUP_SERVER_PORT=$2
BACKUP_SUFFIX=$3

# file setting
BIN_DIR=(コマンドの配置ディレクトリ)
BACKUP_DIR=(バックアップファイルを置くディレクトリ)
BACKUP_LOG="$BACKUP_DIR/bak_$BACKUP_SUFFIX.log"

BACK_FILE_DB="$BACKUP_DIR/dbbak_$BACKUP_SUFFIX"

APP_DIR=(アプリケーションデータのディレクトリ)
BACK_APP_DIR="$BACKUP_DIR/appdata/"

TRNS_DB_DIR="/home/backupuser/xxservice/"
TRNS_APP_DIR="/home/backupuser/xxservice/appdata/"

#--------------------------------------------------
# Start
echo "---- START : `date`"  > $BACKUP_LOG

####################
# DB
echo "---- DB S : `date`"  >> $BACKUP_LOG
(dotime $BIN_DIR/do_db_backup $BACK_FILE_DB &>> $BACKUP_LOG) &>> $BACKUP_LOG

echo "---- DB GZIP S : `date`"  >> $BACKUP_LOG
(dotime gzip -f $BACK_FILE_DB &>> $BACKUP_LOG) &>> $BACKUP_LOG

####################
# APP
echo "---- APP S : `date`"  >> $BACKUP_LOG
(dotime rsync -auv --rsync-path="ionice -c 2 -n 7 nice -n 19 rsync" \
  $APP_DIR $BACK_APP_DIR &>> $BACKUP_LOG) &>> $BACKUP_LOG

####################
# Transfer

# transfer DB backup
echo "---- TRN DB S : `date`"  >> $BACKUP_LOG
(dotime scp -P $BACKUP_SERVER_PORT $BACK_FILE_DB.gz ubackup@$BACKUP_SERVER:$TRNS_DB_DIR \
  &>> $BACKUP_LOG) &>> $BACKUP_LOG

# transfer APP backup
echo "---- TRN APP S : `date`"  >> $BACKUP_LOG
(dotime rsync -auvz -e "ssh -p $BACKUP_SERVER_PORT" $BACK_APP_DIR \
  ubackup@$BACKUP_SERVER:$TRNS_APP_DIR  &>> $BACKUP_LOG) &>> $BACKUP_LOG

# End
echo "---- END : `date`"  >> $BACKUP_LOG

最初のrsyncで、–rsync-path=”ionice -c 2 -n 7 nice -n 19 rsync”オプションを付けているのは、受信側も同じアプリサーバーのため優先度を下げている。転送時には付けていないのは、転送先サーバーはバックアップ専用のため、優先度を気にしなくていいため。

2-3-2)DBバックアップコマンド

do_db_backupという名前で以下ファイルを作成する。3-1)バックアップコマンドから呼ばれるコマンドで、DBに応じたコマンドを作成する。

【do_db_backup】

※MariaDBの例

#!/bin/sh
#
#  $1: backup file name
#

mysqldump --user=(DBユーザー) --password=(DBパスワード) --single-transaction (データベース名) > $1

※PostgreSQLの例

#!/bin/sh
#
#  $1: backup file name
#

pg_dump -Fc -b (データベース名)> $1

2-3-3)実行コマンド

バッチで実行するための、以下の2つのファイルを作成する。

【BACKUP_HOURLY】

#!/bin/sh
#

BACKUP_SERVER=10.10.10.200
BACKUP_SERVER_PORT=8888
BACKUP_SUFFIX=h`date +%H`

(コマンドの配置ディレクトリ)/do_backup \
  $BACKUP_SERVER $BACKUP_SERVER_PORT $BACKUP_SUFFIX

【BACKUP_DAILY】

#!/bin/sh
#

BACKUP_SERVER=bak2.xxservice.com
BACKUP_SERVER_PORT=9999
BACKUP_SUFFIX=d`date +%d`

(コマンドの配置ディレクトリ)/do_backup \
  $BACKUP_SERVER $BACKUP_SERVER_PORT $BACKUP_SUFFIX

2-4)cron設定

“crontab -e”で、実行コマンドをスケジューリングする。

毎時42分と、毎日3時13分にバックアップする設定の例。

# m h dom mon dow command
42 * * * * (コマンドの配置ディレクトリ)/BACKUP_HOURLY
13 3 * * * (コマンドの配置ディレクトリ)/BACKUP_DAILY

ConoHa VPS のプライベートネットワーク設定

手順は以下ページにある。

https://support.conoha.jp/v/privatenetwork/

振り当てられたIPv4アドレスを、自分で設定する必要がある。

CentOS8では、コンソールで設定する場合は、nmcliコマンドを使うのが推奨されているらしい。

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/getting-started-with-system-administration_configuring-basic-system-settings#configuring-a-static-ethernet-connection-using-nmcli_configuring-and-managing-network-access

マニュアルに従い、IPv4アドレスを以下のように設定した。

1)デバイスの確認

nmcli device status

デバイスeth1があるが、まだコネクションが定義されていない状態。

2)コネクションの設定

コネクション名もeth1として、アドレスは10.10.10.3の場合、以下のように設定した。

nmcli connection add con-name eth1 ifname eth1 type ethernet
nmcli connection modify eth1 ipv4.address 10.10.10.3/24
nmcli connection modify eth1 ipv4.method manual
nmcli connection modify eth1 connection.autoconnect yes

3)コネクションのDown/Up

nmcli connection down eth1
nmcli connection up eth1

デバイス状態にて、eth1もconnectedとなったことが確認できた。

4)セキュリティー設定

デフォルトではpublicの設定が適用されるが、プライベート用の設定を適用する。

Apache2.4とPHP7.4の連携

動作中のシステムを、そろそろ各種バージョンアップした新サーバーに移す作業に入ったが、新サーバーで、ApacheからPHPが動作しなかった。

新サーバーのバージョン

CentOS8.2
Apache2.4.37
PHP7.4.10

原因

以前のApacheのデフォルトが 、MPM prefork だったのが、今回は MPM event になっていた。

(確認)

/etc/httpd/conf.modules.d/00-mpm.confの中を見ると、ロードするモジュールがMPM eventのモジュールに変わってる。

対応

以前のpreforkにするということも考えられるが、MPM eventで突き進むことにした。

連携するために追加でやったことは、以下。

1.php-fpmの有効化

php-fpmをサービス起動するように設定

systemctl enable php74-php-fpm
systemctl start php74-php-fpm

2.mod_proxy_fcgiを有効化

今までは、/etc/httpd/conf.modules.d/00-proxy.confは、すべてコメントアウトしていたが、以下を有効にする。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so