Amazon Linux 2 で LAMP (Linux/Apache/PHP/MariaDB)サーバー構築

開発環境系AWS, Linux

AWS EC2 インスタンスの Amazon Linux 2 で LAMP 環境を構築する手順。
Amazon Linux 2 専用パッケージみたいなのがあって、 PHP と MariaDB をセットでインストールできる。

Amazon Linux 2 では、 Amazon Linux Extras というバージョン管理システムみたいのができて、 amazon-linux-extras リポジトリに PHP の最新版とか nginx とか、 PostgreSQL とかがあって、ここからインストールすることができる。そして、 Amazon Linux Extras の売りは、 Amazon がサポートしている(パッケージの)新バージョンが使えることらしい。

スポンサーリンク

EC2 インスタンスの作成

  1. インスタンス作成のとき、「手順 1 : Amazon マシンイメージ (AMI) を選択」で Amazon Linux 2 を選択。

    Amazon linux2 AMI
    STEP 1 : Choose an Amazon Machine Image (AMI)
  2. 「手順 6 : セキュリティグループの設定」で、 SSH (ポート 22)、 HTTP (ポート 80)、 HTTPS (ポート 443) を開けておく。「ルールの追加」ボタンを押して、ルールを入力する。

    Security Group Config on AWS
    STEP 6 : Security Group Config on AWS

Route 53 や ロードバランサーとかその他の設定は [AWS] Bitnami WordPress構築 – AWS設定編 を参照してください。

LAMP サーバーをインストール

  1. EC2 インスタンスに SSH で接続する
    $ ssh -i ~/.ssh/ファイル名.pem ec2-user@SERVER-IP
  2. ソフトウェアパッケージを更新( -y オプションを指定すると、確認メッセージを表示しないで更新される)
    $ sudo yum update
  3. amazon-linux-extras リポジトリの一覧を表示
    $ amazon-linux-extras list
    ...
    11  vim                      available    [ =8.0 ]
    13  ruby2.4                  available    [ =2.4.2  =2.4.4 ]
    15  php7.2                   available    \
          [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
            =7.2.16  =7.2.17  =7.2.19 ]
    16  php7.1                   available    \
          [ =7.1.22  =7.1.25  =7.1.27  =7.1.28  =7.1.30 ]
    17  lamp-mariadb10.2-php7.2  available    \
          [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
            =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13
            =10.2.10_7.2.14  =10.2.10_7.2.16  =10.2.10_7.2.17
            =10.2.10_7.2.19 ]
    18  libreoffice              available    [ =5.0.6.2_15  =5.3.6.1 ]
    ...
  4. 「17 lamp-mariadb10.2-php7.2」 をインストールする。(このパッケージのことを Amazon Linux では「トピック」と呼ぶらしい。)
    amazon-linux-extras リポジトリに MySQL は入っていない。 MariaDB は、 MySQL の後継なので特にこだわりがなければ MariaDB でいい。
    $ sudo amazon-linux-extras install lamp-mariadb10.2-php7.2 php7.2

    途中で、 Is this ok [y/d/N]: と聞かれるので、 y と入力する。

  5. PHP バージョン確認
    $ php -v
    PHP 7.2.19 (cli) (built: Jun 12 2019 20:39:39) ( NTS )
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

    amazon-linux-extras リポジトリ一覧にある、 PHP 7.2 系の最新( 7.2.19 )がインストールされる。

  6. amzn2extra-lamp-mariadb10.2-php7.2 トピックからインストールできる PHP拡張モジュール一覧を確認
    $ yum list php* | grep amzn2extra-lamp-mariadb10.2-php7.2
    
    php-cli.x86_64            7.2.19-1.amzn2.0.1 @amzn2extra-lamp-mariadb10.2-php7.
    php-common.x86_64         7.2.19-1.amzn2.0.1 @amzn2extra-lamp-mariadb10.2-php7.
    php-fpm.x86_64            7.2.19-1.amzn2.0.1 @amzn2extra-lamp-mariadb10.2-php7.
    php-json.x86_64           7.2.19-1.amzn2.0.1 @amzn2extra-lamp-mariadb10.2-php7.
    php-mysqlnd.x86_64        7.2.19-1.amzn2.0.1 @amzn2extra-lamp-mariadb10.2-php7.
    php-pdo.x86_64            7.2.19-1.amzn2.0.1 @amzn2extra-lamp-mariadb10.2-php7.
    php.x86_64                7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-bcmath.x86_64         7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-dba.x86_64            7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-dbg.x86_64            7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-devel.x86_64          7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-embedded.x86_64       7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-enchant.x86_64        7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-gd.x86_64             7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-gmp.x86_64            7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-intl.x86_64           7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-ldap.x86_64           7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-mbstring.x86_64       7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-odbc.x86_64           7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-opcache.x86_64        7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-apcu.x86_64      5.1.12-3.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
                              5.1.12-3.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-igbinary.x86_64  2.0.7-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
                              2.0.7-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-imagick.x86_64   3.4.4-1.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
                              3.4.4-1.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-libsodium.x86_64 2.0.21-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-mcrypt.x86_64    1.0.1-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-memcached.x86_64 3.0.4-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-msgpack.x86_64   2.0.2-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
                              2.0.2-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-oauth.x86_64     2.0.2-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-redis.x86_64     4.3.0-1.amzn2      amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-ssh2.x86_64      1.1.2-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-uuid.x86_64      1.0.4-3.amzn2.0.1  amzn2extra-lamp-mariadb10.2-php7.2
    php-pecl-zip.x86_64       1.15.2-3.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-pgsql.x86_64          7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-process.x86_64        7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-pspell.x86_64         7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-recode.x86_64         7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-snmp.x86_64           7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-soap.x86_64           7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-xml.x86_64            7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2
    php-xmlrpc.x86_64         7.2.19-1.amzn2.0.1 amzn2extra-lamp-mariadb10.2-php7.2

    右側に @ がついているのはインストール済み。
    amzn2extra-lamp-mariadb10.2-php7.2 トピックをインストールすると、いくつかの拡張モジュールは、一緒にインストールされる。

  7. php 拡張モジュールのインストール
    $ sudo yum install php-devel php-gd php-mbstring php-xml

    php-mbstring (日本語とかのマルイチバイト文字を扱う)、 php-gd (画像処理に使う)、 php-develphp-xml をインストールする。(特に使う予定ないなら入れなくてもいい。)
    php-mbstring は、 phpMyAdmin の依存ファイルなので、 phpMyAdmin 使うならインストール必須。

  8. yum で Apache 、 MariaDB をインストール
    $ sudo yum install -y httpd mariadb-server
  9. Apache 起動
    $ sudo systemctl start httpd
  10. システムが起動する度に自動で Apache が起動する設定
    $ sudo systemctl enable httpd
  11. httpd が有効であるか確認
    $ sudo systemctl is-enabled httpd
    enabled
  12. MariaDB 起動
    $ sudo systemctl start mariadb
  13. MariaDB 自動起動設定
    $ sudo systemctl enable mariadb
  14. MariaDB が有効であるか確認
    $ sudo systemctl is-enabled mariadb
    enabled

MariaDB のセキュリティ設定

データベース の root アカウントは、デフォルトではパスワードがないので、ここで設定する。
そのため、 root のパスワードを パスワードジェネレーター とか使って生成し、保管しておく。そのあと下記コマンドを実行。

$ sudo mysql_secure_installation

Enter current password for root... と出るけど、初回はパスワードないのでそのまま Enter 押す。
Set root password? [Y/n] パスワード設定しますか?と聞かれるので、 Y と入力。
New password:  新しいパスワードを入力。画面に入力した文字は表示されないので、入力したら Enter 。
確認のため、もう一度新しいパスワードの入力を求められるので、入力して Enter 。

4 つの質問が出てくるので、全部 Y と入力する。
Remove anonymous users? [Y/n] (匿名ユーザーアカウントを削除するか?)
Disallow root login remotely? [Y/n] (リモートルートログインを無効にするか?)
Remove test database and access to it? [Y/n] (テストデータベースを削除するか?)
Reload privilege tables now? [Y/n] (権限テーブルを再ロードするか?)

これで、 Elastic IP でアクセスすると、Apache テストページが表示される。

パーミッションの設定

Cyberduck からファイル編集( ec2-user に権限必要)とか、プログラムからディレクトリやファイルにアクセス( apache に権限必要)するには, ec2-user を apache グループに追加し、 Apache ドキュメントルート( /var/www )に、 apache グループのパーミッションを与える。

  1. ec2-user を apache グループに追加
    $ sudo usermod -a -G apache ec2-user
  2. ログアウトする
    $ exit
  3. 再ログインする
  4. apache グループの存在確認
    $ groups
    ec2-user adm wheel apache systemd-journal
  5. Apache ドキュメントルートのグループ所有権を apache グループにする
    $ sudo chown -R ec2-user:apache /var/www
  6. 所有権とパーミッションを設定
    $ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
    $ find /var/www -type f -exec sudo chmod 0664 {} \;
  7. 設定の確認
    $ ls -l /var/www
    drwxrwsr-x 2 ec2-user apache 6 Apr  4 18:10 cgi-bin
    drwxrwsr-x 2 ec2-user apache 6 Apr  4 18:10 html

動作確認

phpinfo を表示してみる
$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

上記のパーミッションの設定とかが正しければ、これでファイルが作成される。
http://Elastic IP/phpinfo.php でアクセスすると、 phpinfo の画面が表示される。

タイムゾーン変更

デフォルトでは UTC となっているので、太平洋標準時(パシフィック・タイムゾーン)に変更する。

  1. 現在のタイムゾーンを確認
    $ timedatectl
          Local time: Thu 2019-08-15 22:52:03 UTC
      Universal time: Thu 2019-08-15 22:52:03 UTC
            RTC time: Thu 2019-08-15 22:52:03
           Time zone: n/a (UTC, +0000)
         NTP enabled: yes
    NTP synchronized: no
     RTC in local TZ: no
          DST active: n/a
  2. タイムゾーン一覧を表示
    $ timedatectl list-timezones
    ...
    America/Toronto
    America/Tortola
    America/Vancouver
    America/Whitehorse
    America/Winnipeg
    America/Yakutat
    America/Yellowknife
    ...

    いっぱい出てくるから、キーボードの「下」押して必要なタイムゾーンを探す。
    一覧の表示を終了するには、 q を押す。

  3. タイムゾーンを設定する
    $ sudo timedatectl set-timezone America/Vancouver
    日本時間は
    $ sudo timedatectl set-timezone Asia/Tokyo
MariaDB のタイムゾーン( system_time_zone 変数)のデフォルトは、 OS のタイムゾーン(つまり、ここで設定したタイムゾーン)が設定される。
タイムゾーンを確認する SQL
select @@time_zone;
select @@system_time_zone;

phpMyAdmin のインストール

PHP 拡張モジュールのインストールしていないなら php-mbstring をインストールすること。
$ sudo yum install php-mbstring -y
$ sudo systemctl restart httpd
$ sudo systemctl restart php-fpm
  1. Apache ドキュメントルートに移動
    $ cd /var/www/html
  2. wget コマンドで phpMyAdmin をダウンロード
    $ wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
    AWS 公式のチュートリアルには、「https://www.phpmyadmin.net/downloads で最新の phpMyAdmin リリース用のソースパッケージを選択します。」と書いてあるけど、バージョンを選択(phpMyAdmin-4.9.0.1-all-languages.tar.gz)して wget コマンド打つとエラーになった。。。
    $ wget https://www.phpmyadmin.net/downloads/phpMyAdmin-4.9.0.1-all-languages.tar.gz
    --2019-08-16 00:00:00--  https://www.phpmyadmin.net/downloads/phpMyAdmin-4.9.0.1-all-languages.tar.gz
    Resolving www.phpmyadmin.net (www.phpmyadmin.net)... 111.181.169.26
    Connecting to www.phpmyadmin.net (www.phpmyadmin.net)|111.181.169.26|:443... connected.
    HTTP request sent, awaiting response... 404 Not Found
    2019-08-16 00:00:00 ERROR 404: Not Found.
  3. phpMyAdmin フォルダを作成し、パッケージを展開
    $ mkdir phpMyAdmin && tar -xvzf phpMyAdmin-4.9.0.1-all-languages.tar.gz -C phpMyAdmin --strip-components 1
  4. ファイル を削除
    $ rm phpMyAdmin-4.9.0.1-all-languages.tar.gz
  5. http://domain.com または Elastic IP/phpMyAdmin にアクセスしてみる
    ログイン情報
    ユーザー : root
    パスワード : Maria DB のルートパスワード

php.ini の設定

$ sudo vi /etc/php.ini
# HTTP ヘッダ に PHP のバージョンを記載しない
# expose_php = On
expose_php = Off
# メモリ上限
# memory_limit = 128M
memory_limit = 512M
# エラーログのパス
# error_log = errors.log
error_log = /var/log/php_errors.log
# POST送信のサイズ
# post_max_size = 8M
post_max_size = 20M
# アップロードファイルのサイズ
# upload_max_filesize = 2M
upload_max_filesize = 20M
# timezoneの設定
# date.timezone =
date.timezone = America/Vancouver
# 最大実行時間(秒)
max_execution_time = 120
# デフォルトエンコーディング
mbstring.internal_encoding = UTF-8
# 文字コード検出のデフォルト値
mbstring.detect_order = auto
Syntax の確認
$ sudo service httpd configtest
# サービス再起動
$ sudo systemctl restart httpd
$ sudo systemctl restart php-fpm

確認・再起動コマンド一覧

使う機会はあるのに忘れるので。。。自分用

# MariaDB 起動
sudo systemctl start mariadb

# apache再起動
$ sudo systemctl restart httpd

# php-fpm再起動
$ sudo systemctl restart php-fpm

# php-fpmが動いてることを確認するコマンド
ps ax | grep php-fpm

# MariaDB バージョン確認
mysql -u root -e 'status' -p

# apacheバージョン確認
httpd -v

# PHP バージョン確認
php -v

Posted by Agopeanuts