FreeBSD13.2にPostgreSQL 15をインストールする(後編)

Author: Amasaki Shinobu (雨崎しのぶ)

Twitter: @amasaki203

Posted on: 2023-09-14 JST

概要

本稿では、FreeBSD 13.2のサーバーに、前編でインストールしたPostgreSQLについて、phpPgAdminを経由してウェブブラウザ上からアクセスする方法について、できるだけ詳細に述べる。

ウェブサーバーApache HTTP Server 2.4(apache24)とPHP FastCGI Process Manager(php-fpm)をインストールして、ウェブアプリケーションphpPgAdminを実行できる環境を提供するのが本稿の目標である。

目次

目標

前編ではPostgreSQLをインストールし、LAN内の他のホストからコマンドライン経由でアクセスすることを達成できた。続いて後編では、以下を目標に、その実行方法について述べる。

後編の目標

  • phpPgAdminをインストールして、LANのホストのブラウザからアクセスできるようにする。

これの実現には以下のWebサーバーパッケージをインストールして稼働させる必要がある。

  • Apache HTTP Server(apache24
  • PHP FastCGI Process Manager(php-fpm

インストールする環境

以下にハードウェアとOS、ネットワークについての要点を挙げる。

  • OS:FreeBSD 13.2-RELEASE
    • シェルはzshを使用する(コードブロックにはプロンプト%を使用していることに注意)
    • sudoが使用可能なことを前提とする。
  • ハードウェア:Fujitsu Esprimo D583/KX
    • メモリ:DDR3 32GB
    • CPU: Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz (4コア)
    • ストレージ:Sandisk SSD Plus 240GB
    • NIC
      • Intel(R) PRO/1000 PT 82572EI (Copper)
      • RealTek 8168/8111 PCIe Gigabit Ethernet
  • ネットワーク
    • Intel: 192.168.0.243/24
    • RealTek: 192.168.11.13/24
    • 192.168.0.0/24ネットワークと192.168.11.0/24ネットワークはブリッジを介して接続されている。

前準備

ユーザーとデータベースの追加

PostgreSQLサーバーにユーザー(ロール)とデータベースを追加する。

ここではユーザーshinobuと、データベースsandboxを追加することにする。

最初に、creteuserコマンドでユーザーshinobuを追加する。

% createuser -h localhost -U postgres shinobu

このコマンドはlocalhostのPostgreSQLサーバーに、管理者postgresの権限でアクセスし、新規ユーザーshinobuを追加するコマンドである。

新規ユーザーにパスワードを設定するには、データベースにpsqlコマンドでアクセスして、以下のように設定する。

% psql -h localhost -U shinobu postgres
psql (15.4)
Type "help" for help.

postgres=> alter role shinobu with password 'hogepasswdfuga';
ALTER ROLE

パスワード文字列hogepasswdfugaは各々自分のものに読み替えて設定して欲しい。

次に、cretedbコマンドでデータベースsandboxを作成する。

% createdb -h localhost -U postgres sandbox

このコマンドはlocalhostのPostgreSQLサーバーに、管理者postgresの権限でアクセスし、新規データベースsandboxを追加するコマンドである。

PHP 8.1をインストールする

php 8.1(php81)をportsからインストールする。

% cd /usr/ports/lang/php81
% sudo make config

設定画面は次の通り。ここでFPMにチェックが入っていることを確認して、ビルドを実行する。

php81-config

ビルドを実行する(依存関係のパッケージの設定はデフォルトで進めることにする)。

% sudo make

gettext-runtimeなど、php81が要求するよりも古いバージョンのパッケージがすでにインストールされている場合は、当該パッケージのディレクトリに行き、そこでmake deinstallを実行してアンインストールをした上で、再びphp81のディレクトリでmakeコマンドを実行する必要がある。

以下のような出力がなされれば、php81のビルドは完了である。

--- all ---

Build complete.
Don't forget to run 'make test'.
===>  Staging for php81-8.1.23
===>   Generating temporary packing list
Installing PHP SAPI module:       embed
Installing PHP CLI binary:        /usr/ports/lang/php81/work/stage/usr/local/bin/
Installing PHP CLI man page:      /usr/ports/lang/php81/work/stage/usr/local/man/man1/
Installing PHP FPM binary:        /usr/ports/lang/php81/work/stage/usr/local/sbin/
Installing PHP FPM defconfig:     /usr/ports/lang/php81/work/stage/usr/local/etc/
Installing PHP FPM man page:      /usr/ports/lang/php81/work/stage/usr/local/man/man8/
Installing PHP FPM status page:   /usr/ports/lang/php81/work/stage/usr/local/share/php/fpm/
Installing phpdbg binary:         /usr/ports/lang/php81/work/stage/usr/local/bin/
Installing phpdbg man page:       /usr/ports/lang/php81/work/stage/usr/local/man/man1/
Installing PHP CGI binary:        /usr/ports/lang/php81/work/stage/usr/local/bin/
Installing PHP CGI man page:      /usr/ports/lang/php81/work/stage/usr/local/man/man1/
Installing build environment:     /usr/ports/lang/php81/work/stage/usr/local/lib/php/build/
Installing header files:          /usr/ports/lang/php81/work/stage/usr/local/include/php/
Installing helper programs:       /usr/ports/lang/php81/work/stage/usr/local/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/ports/lang/php81/work/stage/usr/local/man/man1/
  page: phpize.1
  page: php-config.1
====> Compressing man pages (compress-man)
===> Staging rc.d startup script(s)

make installでインストールを実行する。

% sudo make install
===>  Installing for php81-8.1.23
===>  Checking if php81 is already installed
===>   Registering installation for php81-8.1.23
Installing php81-8.1.23...
===> SECURITY REPORT:
      This port has installed the following files which may act as network
      servers and may therefore pose a remote security risk to the system.
/usr/local/lib/libphp.so
/usr/local/bin/php
/usr/local/bin/php-cgi
/usr/local/sbin/php-fpm

      If there are vulnerabilities in these programs there may be a security
      risk to the system. FreeBSD makes no guarantee about the security of
      ports included in the Ports Collection. Please type 'make deinstall'
      to deinstall the port if this is a concern.

      For more information, and contact details about the security
      status of this software, see the following webpage:
https://www.php.net/

php-fpmの起動

php-fpmの設定ファイル/usr/local/etc/php-fpm.d/www.confを見ると、php-fpmのリスニングポートは9000番であることを確認できる。これは、後でApacheのプロキシ設定を行う際に必要となるので覚えておく。

% grep "^listen =" /usr/local/etc/php-fpm.d/www.conf
listen = 127.0.0.1:9000

次に、/etc/rc.confphp_fpm_enable="YES"を記述してスタートアップを有効にする。

% sudo vi /etc/rc.conf
php_fpm_enable="YES"

最後にphp-fpmのサービスを起動してPHPのインストールは完了である。

% sudo service php-fpm start
Performing sanity check on php-fpm configuration:
[13-Sep-2023 19:43:28] NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful

Starting php_fpm.

Apache HTTP Server 2.4をインストールする

Apache HTTP Server 2.4(通称Apache2、FreeBSDではapache24)は、ここではデフォルトのビルドオプションで構わないため、pkgコマンドでインストールすることにする。もし必要があれば、portsでインストールしてもよい。

% sudo pkg install apache24

Message from apr-1.7.3.1.6.3_1:

--
The Apache Portable Runtime project removed support for FreeTDS with
version 1.6. Users requiring MS-SQL connectivity must migrate
configurations to use the added ODBC driver and FreeTDS' ODBC features.
=====
Message from apache24-2.4.57_1:

--
To run apache www server from startup, add apache24_enable="yes"
in your /etc/rc.conf. Extra options can be found in startup script.

Your hostname must be resolvable using at least 1 mechanism in
/etc/nsswitch.conf typically DNS or /etc/hosts or apache might
have issues starting depending on the modules you are using.


- apache24 default build changed from static MPM to modular MPM
- more modules are now enabled per default in the port
- icons and error pages moved from WWWDIR to DATADIR

   If build with modular MPM and no MPM is activated in
   httpd.conf, then mpm_prefork will be activated as default
   MPM in etc/apache24/modules.d to keep compatibility with
   existing php/perl/python modules!

Please compare the existing httpd.conf with httpd.conf.sample
and merge missing modules/instructions into httpd.conf!

aprapache24についてのメッセージが出る。ここでは後者のメッセージについて一つずつ読んでいこう。

To run apache www server from startup, add apache24_enable="yes" in your /etc/rc.conf. Extra options can be found in startup script.

「スタートアップ時にapache Webサーバーを実行するには、apache24_enable="yes"を、あなたの/etc/rc.confに記述してください。その他の選択肢はスタートアップスクリプトに記述されています。」

これに書かれている通り、/etc/rc.confに記述する必要がある。他にもapache24_http_accept_enable="YES"を指定したいので、ここでは/etc/rc.conf.dディレクトリにapache24ファイルを新規作成して、これらを記述することにする。

% sudo vim /etc/rc.conf.d/apache24
apache24_enable="YES"
apache24_http_accept_enable="YES"

続くメッセージは次の通り。

Your hostname must be resolvable using at least 1 mechanism in /etc/nsswitch.conf typically DNS or /etc/hosts or apache might have issues starting depending on the modules you are using.

「あなたのホスト名は、通常はDNSまたは/etc/hostsなどの/etc/nsswitch.confに含まれる少なくとも1つのメカニズムを使用して名前解決可能である必要があります。そうではない場合、使用しているモジュールに応じて、Apacheが起動しないか問題が発生する可能性があります。」

今回はIPアドレスを指定してのアクセスしか想定していないので、この注意書きは無視することにする。

次に、

  • apache24 default build changed from static MPM to modular MPM

  • more modules are now enabled per default in the port

  • icons and error pages moved from WWWDIR to DATADIR

    If build with modular MPM and no MPM is activated in httpd.conf, then mpm_prefork will be activated as default MPM in etc/apache24/modules.d to keep compatibility with existing php/perl/python modules!

「以下の変更点があります:

  • apache24のデフォルトビルドが静的MPMからモジュールMPMに変更されました。
  • このportのデフォルトで、より多くのモジュールが有効になりました。
  • アイコンとエラーページは、WWWDIRからDATADIRに移動しました。

モジュラーMPMでビルドし、httpd.confでMPMが有効化されていない場合、既存のphp/perl/pythonモジュールとの互換性を維持するために、etc/apache24/modules.d内でmpm_preforkがデフォルトのMPMとして有効化されます。」

ここで、MPMとは、multi-processing module の略称で、Apacheの並列処理に関連するモジュールである。このモジュールにはprefork/worker/eventの3種類の振る舞いがあり、本稿ではeventを選択することにする。これはこのセクションの最後のコードリストで記述する。

最後にhttpd.confに関する注意書きがある。

Please compare the existing httpd.conf with httpd.conf.sample and merge missing modules/instructions into httpd.conf!

「既存のhttpd.confhttpd.conf.sampleを比較し、欠けているモジュールや指示をhttpd.confに統合してください!」

今回はApacheを新規インストールしたので古いhttpd.confは存在しない。

さて、上に述べてきた注意点を含めて、今回使用するhttpd.confは本セクションの最後に示す。

このファイルで重要な点は、次の部分である。

<FilesMatch "\.php$">
        SetHandler "proxy:fcgi://127.0.0.1:9000/"
</FilesMatch>

これは、拡張子.phpへのリクエストを、fcig://127.0.0.1:9000に、すなわちphp-fpmに渡して、PHPでの処理させることを指示するディレクティブである。これを記述しないとphpPgAdminは動作しない。

加えて、ここでphpPgAdminに関わるファイルについても述べておく。httpd.confは、その最後の行にInclude命令がある通り、/usr/local/etc/apache24/Includesディレクトリに含まれる.conf拡張子を持つファイルをインクルードする。このディレクトリにphppgadmin.confファイルを以下の通りに記述して作成しておく。

% sudo vim /usr/local/etc/apache24/Includes/phppgadmin.conf
Alias /phppgadmin "/usr/local/www/phpPgAdmin"
<Directory "/usr/local/www/phpPgAdmin">
    DirectoryIndex index.php
    AllowOverride All
    Options FollowSymlinks
    Require ip 192.168.0.0/24 192.168.11.0/24
</Directory>

このファイルでは、Webサーバーの/phppgadminへのアクセスを、/usr/local/www/phpPgAdminディレクトリにエイリアスを作成して参照させることを指示している。ここで注意するのは、後で述べるが、phpPgAdminはそのアプリケーションファイルを/usr/local/www/phpPgAdminにインストールすることである。

また、ディレクトリへのアクセスはindex.phpを参照するように指定している。これらにアクセスできるIPアドレスの範囲を、ローカルネットワークに限定している。

httpd.confファイルを示す:

% grep -v -e "^\s*#" -e "^\s*$" /usr/local/etc/apache24/httpd.conf
ServerRoot "/usr/local"
Listen 80
LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
LoadModule authn_file_module libexec/apache24/mod_authn_file.so
LoadModule authn_core_module libexec/apache24/mod_authn_core.so
LoadModule authz_host_module libexec/apache24/mod_authz_host.so
LoadModule authz_groupfile_module libexec/apache24/mod_authz_groupfile.so
LoadModule authz_user_module libexec/apache24/mod_authz_user.so
LoadModule authz_core_module libexec/apache24/mod_authz_core.so
LoadModule access_compat_module libexec/apache24/mod_access_compat.so
LoadModule auth_basic_module libexec/apache24/mod_auth_basic.so
LoadModule reqtimeout_module libexec/apache24/mod_reqtimeout.so
LoadModule filter_module libexec/apache24/mod_filter.so
LoadModule mime_module libexec/apache24/mod_mime.so
LoadModule log_config_module libexec/apache24/mod_log_config.so
LoadModule env_module libexec/apache24/mod_env.so
LoadModule headers_module libexec/apache24/mod_headers.so
LoadModule setenvif_module libexec/apache24/mod_setenvif.so
LoadModule version_module libexec/apache24/mod_version.so
LoadModule proxy_module libexec/apache24/mod_proxy.so
LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
LoadModule unixd_module libexec/apache24/mod_unixd.so
LoadModule status_module libexec/apache24/mod_status.so
LoadModule autoindex_module libexec/apache24/mod_autoindex.so
LoadModule dir_module libexec/apache24/mod_dir.so
LoadModule alias_module libexec/apache24/mod_alias.so
IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.conf
<IfModule unixd_module>
User www
Group www
</IfModule>
ServerAdmin shinobu@localnet.home
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/usr/local/www/apache24/data"
<Directory "/usr/local/www/apache24/data">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "/var/log/httpd-error.log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "/var/log/httpd-access.log" common
</IfModule>
<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
    TypesConfig etc/apache24/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>
<IfModule proxy_html_module>
    Include etc/apache24/extra/proxy-html.conf
</IfModule>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
<FilesMatch "\.php$">
    SetHandler "proxy:fcgi://127.0.0.1:9000/"
</FilesMatch>
Include etc/apache24/Includes/*.conf

ここで、コメントアウト部分は含まれていないことに注意されたい。

phpPgAdminをインストールする

さて、本題のphpPgAdminのインストールへ話題を移そう。

phpPgAdminのportは/usr/ports/databases/phppgadminのディレクトリにある。

make configで設定できるオプションは存在しないので、そのままmakeコマンドでビルドをして構わない。

% cd /usr/ports/databases/phppgadmin
% sudo make
% sudo make install

インストールすると、/usr/local/wwwディレクトリにphpPgAdminディレクトリが作成され、そこにphpファイルなどからなるWebアプリケーションの本体となるファイルが配置される。

メインの設定ファイルはconf/config.inc.phpであり、classes/database/Connection.phpにはデータベースへの接続を管理する設定がある。

ここで後者にはPostgreSQLバージョン15に関するドライバーの記述が欠けているので、78行目付近に以下のように1行追加する。

% sudo vi /usr/local/www/phpPgAdmin/classes/database/Connection.php
                // Detect version and choose appropriate database driver
                switch (substr($version,0,2)) {
                        case '15': return 'Postgres'; break; // <-- NEW
                        case '14': return 'Postgres'; break;
                        case '13': return 'Postgres13'; break;
                        case '12': return 'Postgres12'; break;
                        case '11': return 'Postgres11'; break;
                        case '10': return 'Postgres10'; break;
                }

cf. Debian 12 Bookworm : PostgreSQL 15 : phpPgAdmin インストール : Server World

phpPgAdminへアクセスする

Webサーバーを起動する

ここでApache24を起動する。

% sudo service apache24 start

起動メッセージに

Syntax OK
Starting apache24.

と表示されれば、起動は完了である。

ここで上のセクションで起動しておいたphp-fpmのサービスの状態を確認しておこう。次のコマンドを実行する。

% service php-fpm status
php_fpm is running as pid 5477.

実行中のプロセスIDが表示されれば正常に動作している。

ブラウザでphpPgAdminを開く

ブラウザのURLにhttp://192.168.11.13/phppgadminと入力して、以下の画面が表示されれば成功である。

phpPgAdmin - Top

「サーバー」を選択するとログイン画面が表示される。

phpPgAdmin - Login

上のセクションで作成しておいたユーザー名とパスワードを入力する。画面が遷移して、データベースsandboxが表示されているのを確認できれば、本稿の目標は達成された。

phpPgAdmin - Database list