【Linux】LAMP環境に関する学習記録

2024年2月24日

こんにちは、キクです。

本記事は、僕が自己学習で学んだことをブログでアウトプットするシリーズになります。
今回は『LAMP環境』について書いていこうと思います。

それでは、よろしくお願いします。

注意事項

本記事は自己学習としてのアウトプットが目的となります。

そのため、本記事には誤った情報が含まれる可能性もありますが、ご了承ください。

LAMP環境について

LAMP環境とは

4つのオープンソースソフトウェアを使ったWebアプリ開発環境のこと

LAMPは以下4つから構成され、動的なWebサイトの構築に適したOSSの組み合わせである

LAMPの構成要素

  1. Linux(OS)
  2. Apache(サーバ)
  3. MySQL / MariaDB(データベース)
  4. PHP / Python / Perl(プログラミング言語)

主なメリット

  • 基本的にコストがかからない(OSSなので)
  • 高いカスタマイズ性

それぞれの動きと役割

Icons by Icons8

1. ブラウザがWebサーバにアクセス

Webサーバ(Apache)がブラウザからの要求を受ける

主な担当

  • Linux(OS)
  • Apache(サーバ)

2. WebサーバによるWebページ作成開始

Webサーバ(Apache)はブラウザからの要求に従ってWebページ生成に必要なファイルを探し始める

静的ページの場合:見つけたファイルをそのまま提供 -> Step4へ
動的ページの場合:PHPなどのプログラミング言語を利用してファイルの生成を開始 -› Step3へ

主な担当

  • Apache(サーバ)
  • PHP(プログラミング言語)

3. データベースからWebページ生成に必要なデータを取得

PHPとMySQLとで通信を行い、PHPは「商品名」や「値段」などの情報をデータベースから取得してWebページ生成を行う

主な担当

  • PHP(プログラミング言語)
  • MySQL(データベース)

4. WebサーバがブラウザにWebページを提供

静的ページの場合はStep2で見つけたファイル、動的ページの場合はStep3でPHPが完成させたファイルをWebサーバに渡す
その後、Webサーバからブラウザにファイルを提供することでブラウザ側でファイルを最終的な状態に整えて表示する

主な担当

  • Apache(サーバ)
  • PHP(プログラミング言語)

関連調査メモ

ファイアウォール設定

レンタルサーバなど環境によってはデフォルトで80番ポートが空いていないことがある

以下のようなコマンドで許可する

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --reload

80番ポート

Apacheではデフォルトで「80番ポート」を利用して接続を行う
この設定はApacheの設定ファイル「httpd.conf」にて変更することも可能

Apache関連

Apacheの設定ファイル「httpd.conf」にて接続元を制限できる模様

■全許可

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

■全拒否

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all denied
</Directory>

■特定IPアドレスのみ許可

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require xx.xx.xx.xx/xx
</Directory>

MySQL関連

MySQLのパッケージはRHEL / CentOSの標準リポジトリには存在しない
そのため、以下のようなコマンドでMySQL公式リポジトリを追加する必要がある

# yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

リポジトリ取得後はrepoファイル(mysql-community-xxxx.repo)が追加された

[root@homeserver ~]# ll /etc/yum.repos.d/
total 44
-rw-r--r--. 1 root root 4229 Mar  2  2022 centos-addons.repo
-rw-r--r--. 1 root root 2588 Mar  2  2022 centos.repo
-rw-r--r--. 1 root root 1142 Aug 17  2023 epel-cisco-openh264.repo
-rw-r--r--. 1 root root 1621 Aug 17  2023 epel-next-testing.repo
-rw-r--r--. 1 root root 1519 Aug 17  2023 epel-next.repo
-rw-r--r--. 1 root root 1552 Aug 17  2023 epel-testing.repo
-rw-r--r--. 1 root root 1453 Aug 17  2023 epel.repo
-rw-r--r--. 1 root root 2129 Oct 24 13:13 mysql-community-debuginfo.repo
-rw-r--r--. 1 root root 1989 Oct 24 13:13 mysql-community-source.repo
-rw-r--r--. 1 root root 1910 Oct 24 13:13 mysql-community.repo

PHP関連

そもそもPHPってどんなもの?

動的なコンテンツの作成に向いているプログラミング言語
サーバーサイドの言語で、処理はWebサーバ側で行われる

HTMLと組み合わせて使用できたり、MySQLなどのデータベースとの連携が容易といった特徴がある
HTMLで記述したファイルの中にPHPのプログラムコードを埋め込んで記述することも可能で、1つのファイルにまとめられるので便利

また、ショッピングカート機能で「何を」「いくついれて」「合計いくらか」などの処理も実装することもできる

パッケージメモ

php-mysql:PHPからMySQLに接続するために利用
phpmyadmin:ブラウザからMySQLのデータベースを管理できるツール

実機練習(CentOS Stream 9)

今回は下記サイトを参考にさせていただきながら実機での練習をしていこうと思います。

1. Apache

Apacheの導入

1. Apacheインストール

# yum install -y httpd

2. インストール後の確認

[root@homeserver ~]# yum list installed | grep httpd
Failed to set locale, defaulting to C.UTF-8
centos-logos-httpd.noarch          90.4-1.el9                @appstream               
httpd.aarch64                      2.4.57-6.el9              @appstream               
httpd-core.aarch64                 2.4.57-6.el9              @appstream               
httpd-filesystem.noarch            2.4.57-6.el9              @appstream               
httpd-tools.aarch64                2.4.57-6.el9              @appstream

3. Apache起動

[起動]

[root@homeserver ~]# systemctl start httpd.service

[ステータス確認]

[root@homeserver ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
     Active: active (running) since Sat 2024-02-17 21:42:08 UTC; 1min 17s ago
       Docs: man:httpd.service(8)
   Main PID: 864 (httpd)
     Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
      Tasks: 213 (limit: 49472)
        CPU: 629ms
     CGroup: /system.slice/httpd.service
             ├─864 /usr/sbin/httpd -DFOREGROUND
             ├─865 /usr/sbin/httpd -DFOREGROUND
             ├─866 /usr/sbin/httpd -DFOREGROUND
             ├─867 /usr/sbin/httpd -DFOREGROUND
             └─868 /usr/sbin/httpd -DFOREGROUND

Feb 17 21:41:23 homeserver systemd[1]: Starting The Apache HTTP Server...
Feb 17 21:41:46 homeserver httpd[864]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using f>
Feb 17 21:42:08 homeserver httpd[864]: Server configured, listening on: port 80
Feb 17 21:42:08 homeserver systemd[1]: Started The Apache HTTP Server.

4. Apache自動起動設定

[root@homeserver ~]# systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

ファイアウォール設定

1. firewall起動状況の確認

[root@homeserver ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-04-20 00:00:09 UTC; 1 year 9 months ago
       Docs: man:firewalld(1)
   Main PID: 310 (firewalld)
      Tasks: 2 (limit: 49472)
        CPU: 3.583s
     CGroup: /system.slice/firewalld.service
             └─310 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

Apr 20 00:00:07 homeserver systemd[1]: Starting firewalld - dynamic firewall daemon...
Apr 20 00:00:09 homeserver systemd[1]: Started firewalld - dynamic firewall daemon.

2. Apacheアクセス許可設定

[作業前確認]

[root@homeserver ~]# firewall-cmd --list-service --zone=public --permanent
cockpit dhcpv6-client ssh

[許可設定]

[root@homeserver ~]# firewall-cmd --add-service=http --permanent
success

[作業後確認]

[root@homeserver ~]# firewall-cmd --list-service --zone=public --permanent
cockpit dhcpv6-client http ssh

[設定の反映]

[root@homeserver ~]# firewall-cmd --reload
success

3. Apacheへの接続確認(ブラウザ)

接続先URL:http://WebサーバIPアドレス

2. MySQL

1. MySQLリポジトリのインストール

[root@homeserver ~]# yum install https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm

ポイント

上記コマンド実行後はMySQLのリポジトリファイルが追加されている

▼作業前

[root@homeserver ~]# ll /etc/yum.repos.d/
total 32
-rw-r--r--. 1 root root 4229 Mar  2  2022 centos-addons.repo
-rw-r--r--. 1 root root 2588 Mar  2  2022 centos.repo
-rw-r--r--. 1 root root 1142 Aug 17  2023 epel-cisco-openh264.repo
-rw-r--r--. 1 root root 1621 Aug 17  2023 epel-next-testing.repo
-rw-r--r--. 1 root root 1519 Aug 17  2023 epel-next.repo
-rw-r--r--. 1 root root 1552 Aug 17  2023 epel-testing.repo
-rw-r--r--. 1 root root 1453 Aug 17  2023 epel.repo

▼作業後

[root@homeserver ~]# ll /etc/yum.repos.d/
total 44
-rw-r--r--. 1 root root 4229 Mar  2  2022 centos-addons.repo
-rw-r--r--. 1 root root 2588 Mar  2  2022 centos.repo
-rw-r--r--. 1 root root 1142 Aug 17  2023 epel-cisco-openh264.repo
-rw-r--r--. 1 root root 1621 Aug 17  2023 epel-next-testing.repo
-rw-r--r--. 1 root root 1519 Aug 17  2023 epel-next.repo
-rw-r--r--. 1 root root 1552 Aug 17  2023 epel-testing.repo
-rw-r--r--. 1 root root 1453 Aug 17  2023 epel.repo
-rw-r--r--. 1 root root 2129 Oct 24 13:13 mysql-community-debuginfo.repo
-rw-r--r--. 1 root root 1989 Oct 24 13:13 mysql-community-source.repo
-rw-r--r--. 1 root root 1910 Oct 24 13:13 mysql-community.repo

2. MySQLインストール

[root@homeserver ~]# yum install mysql-community-server

メモ

MySQLには以下2パターンがある模様

  1. MySQL Community Server:無償データベース
  2. MySQL Enterprise Edition:有償データベース

3. MySQLバージョン確認

[root@homeserver ~]# mysql --version
mysql  Ver 8.0.36 for Linux on aarch64 (MySQL Community Server - GPL)

4. MySQL起動

[起動]

[root@homeserver ~]# systemctl start mysqld.service

[ステータス確認]

[root@homeserver ~]# systemctl status mysqld.service
● mysqld.service - MySQL Server
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2024-02-17 22:16:09 UTC; 32s ago
       Docs: man:mysqld(8)
             http://dev.mysql.com/doc/refman/en/using-systemd.html
    Process: 2438 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
   Main PID: 2511 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 49472)
        CPU: 41.705s
     CGroup: /system.slice/mysqld.service
             └─2511 /usr/sbin/mysqld

Feb 17 22:15:25 homeserver systemd[1]: Starting MySQL Server...
Feb 17 22:16:09 homeserver systemd[1]: Started MySQL Server.

5. MySQL自動起動設定

[root@homeserver ~]# systemctl enable mysqld.service

6. MySQL管理者ユーザ(root)の初期パスワード設定

[初期パスワード確認]

[root@homeserver ~]# cat /var/log/mysqld.log | grep root
2024-02-17T22:15:50.499949Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: <パスワード>

[初期パスワードおよびその他デフォルト設定の変更]

[root@homeserver ~]# mysql_secure_installation

Securing the MySQL server deployment.

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password: 
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done!

メモ

上記では以下の変更を実施している

  1. root初期パスワードの変更
  2. 匿名ユーザアカウントの削除
  3. リモートからのrootログイン禁止
  4. テスト用データベース(test database)の削除
  5. 設定の反映

7. MySQLへの接続確認

[root@homeserver ~]# mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

3. PHP

1. PHPリポジトリのインストール(REMI)

[root@homeserver ~]# yum install http://rpms.remirepo.net/enterprise/remi-release-9.rpm

ポイント

PHPに関するリポジトリファイルが追加されている

▼作業前

[root@homeserver ~]# ll /etc/yum.repos.d/
total 44
-rw-r--r--. 1 root root 4229 Mar  2  2022 centos-addons.repo
-rw-r--r--. 1 root root 2588 Mar  2  2022 centos.repo
-rw-r--r--. 1 root root 1142 Aug 17  2023 epel-cisco-openh264.repo
-rw-r--r--. 1 root root 1621 Aug 17  2023 epel-next-testing.repo
-rw-r--r--. 1 root root 1519 Aug 17  2023 epel-next.repo
-rw-r--r--. 1 root root 1552 Aug 17  2023 epel-testing.repo
-rw-r--r--. 1 root root 1453 Aug 17  2023 epel.repo
-rw-r--r--. 1 root root 2129 Oct 24 13:13 mysql-community-debuginfo.repo
-rw-r--r--. 1 root root 1989 Oct 24 13:13 mysql-community-source.repo
-rw-r--r--. 1 root root 1910 Oct 24 13:13 mysql-community.repo

▼作業後

[root@homeserver ~]# ll /etc/yum.repos.d/
total 56
-rw-r--r--. 1 root root 4229 Mar  2  2022 centos-addons.repo
-rw-r--r--. 1 root root 2588 Mar  2  2022 centos.repo
-rw-r--r--. 1 root root 1142 Aug 17  2023 epel-cisco-openh264.repo
-rw-r--r--. 1 root root 1621 Aug 17  2023 epel-next-testing.repo
-rw-r--r--. 1 root root 1519 Aug 17  2023 epel-next.repo
-rw-r--r--. 1 root root 1552 Aug 17  2023 epel-testing.repo
-rw-r--r--. 1 root root 1453 Aug 17  2023 epel.repo
-rw-r--r--. 1 root root 2129 Oct 24 13:13 mysql-community-debuginfo.repo
-rw-r--r--. 1 root root 1989 Oct 24 13:13 mysql-community-source.repo
-rw-r--r--. 1 root root 1910 Oct 24 13:13 mysql-community.repo
-rw-r--r--. 1 root root 1895 Jan  9 09:47 remi-modular.repo
-rw-r--r--. 1 root root  880 Jan  9 09:47 remi-safe.repo
-rw-r--r--. 1 root root 1518 Jan  9 09:47 remi.repo

2. PHPのインストール

[root@homeserver ~]# yum install php 

3. PHPバージョン確認

[root@homeserver ~]# php -v
PHP 8.0.30 (cli) (built: Aug  3 2023 17:13:08) ( NTS gcc aarch64 )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies

4. 関連パッケージのインストール

Webサイトやアプリケーションを動作させるために必要なパッケージのインストール

[root@homeserver ~]# yum install php-mbstring php-gd php-mysqlnd php-pdo

メモ

各パッケージの役割

  • php-mbstring:日本語が扱えるようになる
  • php-gd:画像が扱えるようになる
  • php-mysqlnd:PHPとMySQLの連携が可能になる
  • php-pdo:PHPのPDOクラスを使用する

苦戦メモ

最初は「php-mysqlnd」ではなく「php-mysql」をインストールしようとしていた
しかし、以下のエラーにより失敗した

All matches were filtered out by modular filtering for argument: **php-mysql**
Error: Unable to find a match: php-mysql

そもそも「php-mysql」というパッケージが見当たらない?

[root@homeserver ~]# dnf search php-mysql
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:51:52 ago on Sun Feb 18 21:01:14 2024.
====================================================== Name Matched: php-mysql =======================================================
php-mysqlnd.aarch64 : A module for PHP applications that use MySQL databases
php74-php-mysqlnd.aarch64 : A module for PHP applications that use MySQL databases
php80-php-mysqlnd.aarch64 : A module for PHP applications that use MySQL databases
php81-php-mysqlnd.aarch64 : A module for PHP applications that use MySQL databases
php82-php-mysqlnd.aarch64 : A module for PHP applications that use MySQL databases
php83-php-mysqlnd.aarch64 : A module for PHP applications that use MySQL databases

下記サイトの内容的に「php-mysql」と「php-mysqlnd」はメモリ使用量や機能に若干の違いはあるものの、位置付けとしては同じである可能性が高い

AWS環境でのチュートリアルでも「php-mysqlnd」をインストールしていた

今回は「php-mysqlnd」を用いて作業を進めた

4. 動作確認

事前準備

1. 参考サイトより素材ダウンロード

SQLファイル名:prefecture_data.sql
PHPファイル名:index.php

データベース作成 / データの準備

1. MySQLへの接続(root)

[root@homeserver ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

mysql>

2. ユーザ「lampuser」作成

mysql> CREATE USER lampuser@localhost IDENTIFIED BY '<パスワード>';
Query OK, 0 rows affected (0.09 sec)

メモ

以下のパスワードポリシーに従う必要がありそう

  •  英大文字を含む
  • 英小文字を含む
  • 数字を含む
  • 記号を含む
  • 8文字以上

3. 検証用データベース「lamp_test」を作成

mysql> CREATE DATABASE lamp_test CHARACTER SET UTF8;
Query OK, 1 row affected, 1 warning (0.01 sec)

4. ユーザ「lampuser」へ検証用データベース「lamp_test」に権限を与える

mysql> GRANT ALL ON lamp_test.* TO lampuser@localhost;
Query OK, 0 rows affected (0.01 sec)

5. ユーザ「lampuser」での再接続

mysql> exit
Bye

[root@homeserver ~]# mysql -u lampuser -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 9
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

mysql>

6. データベース確認

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lamp_test          |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql>

テーブル作成 / データのインポート

1. LAMPサーバに動作確認用SQLファイル「prefecture_data.sql」を格納

2. データベース「lamp_test」へのデータ流し込み

[root@homeserver ~]# mysql -u lampuser -D lamp_test -p < prefecture_data.sql 
Enter password:
[root@homeserver ~]#

3. データベース「lamp_test」のデータ確認

[MySQLへの接続]

[root@homeserver ~]# mysql -u lampuser -D lamp_test -p
Enter password: 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 11
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

mysql>

[テーブルデータ確認]

mysql> SELECT * FROM prefectures;
+----+--------------+
| id | name         |
+----+--------------+
| 24 | 三重県       |
| 26 | 京都府       |
| 41 | 佐賀県       |
| 28 | 兵庫県       |
|  1 | 北海道       |
| 12 | 千葉県       |
| 30 | 和歌山県     |
| 11 | 埼玉県       |
| 44 | 大分県       |
| 27 | 大阪府       |
| 29 | 奈良県       |
|  4 | 宮城県       |
| 45 | 宮崎県       |
| 16 | 富山県       |
| 35 | 山口県       |
|  6 | 山形県       |
| 19 | 山梨県       |
| 21 | 岐阜県       |
| 33 | 岡山県       |
|  3 | 岩手県       |
| 32 | 島根県       |
| 34 | 広島県       |
| 36 | 徳島県       |
| 38 | 愛媛県       |
| 23 | 愛知県       |
| 15 | 新潟県       |
| 13 | 東京都       |
|  9 | 栃木県       |
| 47 | 沖縄県       |
| 25 | 滋賀県       |
| 43 | 熊本県       |
| 17 | 石川県       |
| 14 | 神奈川県     |
| 18 | 福井県       |
| 40 | 福岡県       |
|  7 | 福島県       |
|  5 | 秋田県       |
| 10 | 群馬県       |
|  8 | 茨城県       |
| 42 | 長崎県       |
| 20 | 長野県       |
|  2 | 青森県       |
| 22 | 静岡県       |
| 37 | 香川県       |
| 39 | 高知県       |
| 31 | 鳥取県       |
| 46 | 鹿児島県     |
+----+--------------+
47 rows in set (0.00 sec)

ソースファイル(.php)のアップロード / 動作確認

1. LAMPサーバのドキュメントルートに動作確認用PHPファイル「index.php」を格納

[ドキュメントルート確認]

[root@homeserver ~]# cat /etc/httpd/conf/httpd.conf | grep DocumentRoot
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/var/www/html"
    # access content that does not live under the DocumentRoot.

[アップロード]

(base) MacBook-Pro:~ user$ scp /Users/user/Downloads/lamptest_source/index.php root@WebサーバIPアドレス:/var/www/html
root@WebサーバIPアドレス's password: 
index.php                                                         100%  864   512.0KB/s   00:00    
(base) MacBook-Pro:~ user$

[PHPファイルの修正]

データベースへの接続情報として「DB_PASSWORD」部分を修正

<?php
  define('DSN', 'mysql:host=localhost;dbname=lamp_test;charset=utf8');
  define('DB_USERNAME', 'lampuser');
  define('DB_PASSWORD', 'DBユーザのパスワード');

  try {
    $_db = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
    $_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  } catch(PDOException $e){
    echo $e->getMessage();
    exit;
  } 

  $stmt = $_db->query("SELECT * FROM prefectures ORDER BY id ASC");
  $prefectures = $stmt->fetchAll(PDO::FETCH_ASSOC);
  
  function escape($s){
    return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
  } 
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>lamp-test</title>
  </head>
  <body>
    <ul>
    <?php foreach($prefectures as $prefecture): ?>    
      <?php echo "<li>".escape($prefecture['name'])."</li>" ?> 
    <?php endforeach ?>
    </ul>
  </body>
</html>

2. ドキュメントルートの設定変更

ドキュメントルートディレクトリをWebサーバ(Apache)が実行できるように所有者/所有グループを変更

[作業前確認]

[root@homeserver ~]# ll /var/www/
total 8
drwxr-xr-x. 2 root root 4096 Dec 14 13:17 cgi-bin
drwxr-xr-x. 2 root root 4096 Feb 20 21:28 html

[設定変更]

[root@homeserver ~]# chown -R apache:apache /var/www/html/

[作業後確認]

[root@homeserver ~]# ll /var/www/
total 8
drwxr-xr-x. 2 root   root   4096 Dec 14 13:17 cgi-bin
drwxr-xr-x. 2 apache apache 4096 Feb 20 21:28 html

所有グループに対する書き込み権限追加

[設定変更]

[root@homeserver ~]# chmod -R 775 /var/www/html/

[作業後確認]

[root@homeserver ~]# ll /var/www/
total 8
drwxr-xr-x. 2 root   root   4096 Dec 14 13:17 cgi-bin
drwxrwxr-x. 2 apache apache 4096 Feb 20 21:28 html

メモ

今回はrootユーザで操作しているため実施しないが、ドキュメントルートへソースファイルを作成できるようにするために、グループ名「Apache」にWebサーバの管理者ユーザを追加したりする模様

# gpasswd -a ユーザ名 apache

3. 動作確認

[Apacheの再起動]

[root@homeserver ~]# systemctl restart httpd.service

[ブラウザからWebサーバにアクセス]

接続先URL:http://WebサーバIPアドレス/index.php

苦戦メモ

ソースファイル「index.php」にブラウザからアクセスできない

接続先URL:http://WebサーバIPアドレス/index.php

ドキュメントルートにindex.htmlを格納したら、それにはアクセスできた

接続先URL:http://WebサーバIPアドレス/index.html

PHP動作確認でよく利用される「phpinfo.php」を作成してアクセスを試してみたら接続成功

接続先URL:http://WebサーバIPアドレス/phpinfo.php

index.phpを「test.php」という名前でコピーしてアクセスを試みたら接続成功

接続先URL:http://WebサーバIPアドレス/test.php

作業PCからSCPで再度ソースファイル「index.php」を所定のディレクトリ「/var/www/html/」にアップロードし直したら接続成功

接続先URL:http://WebサーバIPアドレス/index.php

原因の推測

SCPでLAMP環境にソースファイルをアップロードする際に、一度誤って「/root」にアップしてしまった
その後、手動でmvコマンドにより「/var/www/html」に移動した

一度アップロード済みのindex.phpを削除し、再度「/var/www/html」に直接アップロードしたら無事にアクセスできるようになったので、もしかしたら「/root」に格納したことでファイルの権限関係が制限されていたのかもしれない

参考情報

参考:はじめてのLAMP環境構築 〜 LAMP環境とは?
参考:初めてのLAMP環境構築(Linux) 
参考:CentOS 7 に LAMP 環境を構築する手順 (Apache, MySQL, PHP) 
参考:centOS Strem9でApache,PHP,MySQLを設定する
参考:CentOS Stream 9にLAMP環境を構築しました!

-学習記録, Linux
-,