Quantcast
Channel: PHP7.4タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 113

Raspberry PiでApache2.4+PHP7.4をソースコンパイルしてWebサーバー構築 - 3.MySQLを使う

$
0
0

前提と準備

Linuxサーバー構築の記事

前回はApache2.4にPHP7.4をソースコンパイルでWebアプリ環境を構築しましたが、残念なことに、標準でRaspberry Pi向けのLinuxは、MySQLをサポートしておらず、RPMやAPTのリポジトリにも存在しません。ですが、外部MySQLサーバーを接続することは可能です。

簡単なためにWebサーバーと一体でデータベースのMySQLを構築したいと思っても、Raspberry Piの場合はそうにはいかず、たとえインストールできたとしても、microSDの書き込みには非常に不向きなので、今後ラズパイがM.2 SSD相当のストレージに対応しているラインアップを展開すれば、MySQLのサポートも可能かもしれないですが…(✿・ω・)それまではとにかくMySQLを無理にラズパイに導入してストレージにエラーが出ても、またもや本末転倒だしなぁ…

環境

  • Webサーバープログラム:Apache 2.4.46 + PHP 7.4.10
  • クライアント:Windows10 Pro
  • サーバーのアーキテクチャ:Raspberry Pi 3B+(armv8搭載) Linuxのディストリビューション:openSUSE 15.1 Leap(64bit) / Raspberry Pi OS 2020.08版(32bit)
  • 別途用意する端末:MySQLサーバー(私の場合はCentOS 8.1にMySQL 8.0を構築しました)

前提

  • ユーザーはrootでインストール(私の検証ではadminという管理者アカウントにて、そこからsudoで処理しています)
  • openSUSEではファイアウォールはfirewalldを使う(ディストリビューション独自のファイアウォールコマンドは使用しない)。ラズパイのRaspberry Pi OSでは、firewalldについて、IPv6周りの連動が糞だったので、Debian系標準のufwを使用することにしました。
  • 前回の記事のApache+PHP導入を完了していること

サーバー条件

IPアドレス

  • クライアント:192.168.1.11
  • Webサーバー:192.168.1.22 (前回まで192.168.1.18でしたが、DBで使われていたので、ラズパイのIPアドレスを変更しました)
  • データベースサーバー:192.168.1.18 (ラズパイで使ってたのと重複していたので、ラズパイの方を192.168.1.22に変更しました)
  • 所属ネットワークセグメント:192.168.1.0/24 Webサーバー+MySQL

パッケージを個別ダウンロードしてインストールする機能とバージョン(2020年6月時点)

  • zlib-1.2.11.tar.gz
  • apr-1.7.0.tar.gz
  • apr-util-1.6.1.tar.gz
  • httpd-2.4.46.tar.gz
  • php-7.4.10.tar.gz

それ以外の必要なパッケージは、ディストリビューションの標準パッケージコマンド(dnfやaptなど)でインストールし、個別ダウンロードは不要です。

ダウンロードについては、公式サイトにアクセスして、そこからダウンロードしてFTPで転送するか、ダウンロードファイルのURLさえわかれば、wgetで入手することもできますが、入手方法は省略しています。

作業手順

MySQLクライアントの導入

MariaDBクライアントツールのインストール

MySQLコマンドを管理するクライアントに、「MySQL」と明確なパッケージは、ラズパイ向けLinuxには含まれていないため、MariaDBクライアントをインストールしました。

openSUSE15.1(RaspberryPi)
# zypper -n install mariadb-client
RaspberryPiOS(2020.08)
# apt-get -y install mariadb-client

これで、MySQLコマンドがラズパイから使えるようになりました。

MySQLサーバーでの準備

サーバーでのユーザーとデータベース

今回は、CentOS 8.1にMySQLサーバーを構築した仮想マシンを使うので、この記事で構築したデータベースを使ってみます

  • データベース名:manutest
  • テストユーザー名:test
  • テストユーザーパスワード:test1
  • 文字コード:UTF-8
  • MySQLサーバーのIPアドレス:192.168.1.18

なおパスワードは私的都合で「test0」から「test1」に変えました。

MySQLサーバー上での準備

最初にMySQLが他の端末からアクセスできるように、MySQLサーバーでいろいろ準備します。

MySQLのrootでログインします。

MySQLサーバー(CentOS8.1)
[このコマンドに限り、MySQLサーバー上で実施するものです]
# mysql -u root -p
Enter password:  ← MySQLのrootパスワードを入力

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| manutest           |  ← 作成したデータベースが表示される
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> CREATE USER 'test'@'192.168.1.22' IDENTIFIED BY 'test1';
↑ ラズパイのIPアドレス「192.168.1.22」向けのユーザー名「test」を作成する

mysql> GRANT ALL ON manutest.* TO 'test'@'192.168.1.22';
↑ データベース「manutest」に対して「test」が「192.168.1.22」から全機能を使える

エラーがなく「Query OK, 0 rows affected」が表示されれば、データベースとユーザーは作成完了。

つまり、MySQLとApacheが同一のサーバーマシンにある場合は「localhost」で済んだが、今回はラズパイ→MySQLサーバーからという、他のサーバーにアクセスするので、以下のように、ユーザー名+@マーク+ホスト、というように、

CREATE USER '<ユーザー名>'@'<ラズパイのホスト>' IDENTIFIED BY '<パスワード>';
GRANT ALL ON <データベース名>.* TO '<ユーザー名>'@'<ラズパイのホスト>';

というような指定が必要だということですね(˶ ・ᴗ・ )੭

MySQLサーバーでは、CentOSでfirewalldの開放も必要でしたね(˶ ・ᴗ・ )੭**

MySQLサーバー(CentOS8.1)
[このコマンドに限り、MySQLサーバー上で実施するものです]
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
# firewall-cmd --reload

MySQLのポートは3306/TCPなので、そのポートを開放することで、MySQLサーバーにPHPなんかがアクセスできるということ…

Raspberry Pi→MySQLサーバーに接続できるか確認

MySQLサーバーでの作業はここまで。
では、Raspberry Piに戻って、MySQLを使えるか試します。mysqlコマンドで「-h」オプションでホストを指定できます

RaspberryPi(ラズパイOS・openSUSE15.1)
# mysql -h 192.168.1.18 -u test -p
Enter password:  ← パスワード「test1」を入れる
(中略)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| manutest           |  ← 作成したデータベースが表示されれば成功
+--------------------+
2 rows in set (0.00 sec)

ラズパイ→DBサーバー接続成功!!

ちゃんとテーブルの中身も参照できるまでに至りました!!( ˶˙ᵕ˙˶ )

PHPからMySQLサーバーを使う

PHPからMySQLの接続を確認

MySQLサーバーには、前回仮想マシンのCentOSで構築したように、テスト用テーブルを使ってみます。

テーブル名:testtb

idnamememo
INTVARCHAR(64)VARCHAR(256)
必須属性PRIMARY KEYNOT NULL初期値NULL
その他属性AUTO_INCREMENT--

まずはテーブルを使う前に、PHPでMySQLに接続できるかちゃんと確かめないといけません(*˘ᗜ˘*;)

接続確認ページを作ります

# cd ~
# vi connect.php
connect.php
<?php$dsn='mysql:dbname=manutest; host=192.168.1.18';$usr='test';$pass='test1';try{$db=newPDO($dsn,$usr,$pass);print'Connection successful.';$db=NULL;}catch(PDOException$e){die('Connect error : '.$e->getMessage());}?>

これを、Apache導入時にインストールした先のWebページの格納場所 /usr/local/apache2/htdocs/に移動します。

# mv connect.php /usr/local/apache2/htdocs/

PHPページの配置なので、特にApacheを再起動することは不要なので、https://[LinuxサーバーのIPアドレス]/connect.php と入力して確認。192.168.1.18はMySQLサーバーで使われていて、ラズパイLinuxサーバーのIPアドレスは192.168.1.22なので、ブラウザでhttps:~の後に、192.168.1.22/connect.phpをURLを入力してアクセス。

ラズパイ上のPHP→DBサーバー接続
やっと成功した!!⑅︎◡̈︎*

PHPからMySQLにデータを登録できるかを確認

続いて、いよいよデータが登録できるかを確認します。
再びWebページを作ります。

まずは登録フォームから。

# vi test_form.html
test_form.html
<!DOCTYPE html><html><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>テストページ - Test page</title></head><body><formmethod="POST"action="test_form.php"><inputtype="text"name="name"/><inputtype="text"name="memo"/><inputtype="submit"value="Submit"/></form></body></html>

続いて、フォームから受け取ったデータをMySQLデータベースへ追加するPHPを作成

# vi test_form.php
test_form.php
<!DOCTYPE html><html><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>テスト入力 - Test insert</title></head><body><?phpfunctiongetDb(){$dsn='mysql:dbname=manutest; host=192.168.1.18';$usr='test';$pass='test1';try{$db=newPDO($dsn,$usr,$pass);$db->exec('SET NAMES utf8');}catch(PDOException$e){die('Connect error : '.$e->getMessage());}return$db;}try{$db=getDb();$stt=$db->prepare('INSERT INTO testtb (name, memo) VALUES (:one, :two)');$stt->bindValue(':one',$_POST['name']);$stt->bindValue(':two',$_POST['memo']);$stt->execute();print$_POST['name'].' - '.$_POST['memo'].' : Insert OK.';$stt=$db->query("SELECT * FROM testtb");?><tableborder="1"><?phpwhile($row=$stt->fetch(PDO::FETCH_ASSOC)){?><tr><td><?phpprint$row['name'];?></td><td><?phpprint$row['memo'];?></td></tr><?php}?></table><?php$db=NULL;}catch(PDOException$e){die('Process error : '.$e->getMesssage());}?></body></html>

上記2ファイルをApacheのWebページデータの場所へ。

# mv test_form.* /usr/local/apache2/htdocs/

では、ブラウザでhttps://[IPアドレス]/test_form.htmlにアクセスして、データを登録してみると…

ラズパイPHP→DBサーバー操作

これも登録成功しました!(˶ ・ᴗ・ )੭⚐⚑
PCより非力かつストレージもmicroSDというDBの読み書きに不向きなラズパイだからこそ、外部のDB用のサーバーと一緒に外部アクセスすることで、ラズパイもDBを扱えることが実感できた瞬間です

あとがき

Raspberry PiはPCと比べて非力でストレージもmicroSDなので、PCと全く同じようなサーバー構築だと、メモリ不足やデータベースの非対応やらで比較的道のりは険しい一方で、省電力という恩恵ならではのメリットもまたあるということを、今回の構築を通して感銘したな…とも思う(♥´꒳`*)

今後と次回

PHPによるWebアプリサーバー構築のほかにも、Java(OpenJDK)によるWebアプリサーバーについても、構築に触れてみたい


Viewing all articles
Browse latest Browse all 113

Trending Articles