Amazon Linux2上に、LAMP環境ならぬLNPP環境を構築する手順です。
コマンドには、適宜sudoをつけて実行してください。
LAMPとの比較
今回構築するLNPP環境を、お馴染みLAMP環境と比較すると以下の通り。
LNPP | LAMP | |
---|---|---|
OS | Linux | Linux |
WEBサーバ | Nginx | Apache |
DB | PostgreSQL | MySQL |
プログラミング言語 | PHP | PHP |
WEBサーバをApacheではなく、Nginx、DBをMySQLではなく、PostgreSQLにしています。
※呼び方間違ってたら教えてください。
環境、バージョン情報
- OS: Amazon Linux2
- WEBサーバ: Nginx1.18.0
- DB: PostgeSQL 11.5
- プログラミング言語: PHP 7.4.11
- クライアントPC: Windows10(PuTTYにてAmazon Linux2に接続)
手順
1. タイムゾーンの変更
まず、日本時間で使用するため、Amazon Linux2自体のタイムゾーンの設定を変更します。
以下のコマンドを実行し、/etc/sysconfig/clockを編集しましょう。
vi /etc/sysconfig/clock
以下の通り、記入し、保存します。
ZONE="Asia/Tokyo"
UTC=true
2. ソフトウェアのインストール
まず、Amazon Linux2環境にSSH接続して、環境の構築に必要な各種ソフトウェアをインストールします。
今回は、Amazon Linux2のExtras Libraryのお力を借りることにしました。
(1) 以下のコマンドを実行し、Extras Libraryで利用可能なトピックの一覧を確認します。
amazon-linux-extras
初期状態では以下のようになっているはず。
・・(以上省略)
35 kernel-ng available [ =stable ]
36 BCC available [ =0.x =stable ]
37 mono available [ =5.x =stable ]
38 nginx1=latest available [ =stable ]
39 ruby2.6 available [ =2.6 =stable ]
40 mock available [ =stable ]
41 postgresql11=latest available [ =11 =stable ]
42 php7.4=latest available [ =stable ]
43 livepatch available [ =stable ]
44 python3.8 available [ =stable ]
45 haproxy2 available [ =stable ]
(以下省略)・・
(2) Nginx, PostgreSQL, PHPをインストールします。
以下3つのコマンドを順に実行しましょう。
amazon-linux-extras install nginx1
amazon-linux-extras install postgresql11
amazon-linux-extras install php7.4
※うちPostgreSQLは、psqlのコマンドがインストールされるだけのようなので、普通にインストールもします(以下のコマンドを実行すればOK!)
yum install postgresql-server postgresql-devel postgresql-contrib
(3) 再度、amazon-linux-extrasコマンドを実行し、Nginx, PostgreSQL, PHPが有効になっていることを確認します。
amazon-linux-extras
以下のように、available → enabledに変わっていればOK!
・・(以上省略)
35 kernel-ng available [ =stable ]
36 BCC available [ =0.x =stable ]
37 mono available [ =5.x =stable ]
38 nginx1=latest enabled [ =stable ]
39 ruby2.6 available [ =2.6 =stable ]
40 mock available [ =stable ]
41 postgresql11=latest enabled [ =11 =stable ]
42 php7.4=latest enabled [ =stable ]
43 livepatch available [ =stable ]
44 python3.8 available [ =stable ]
45 haproxy2 available [ =stable ]
(以下省略)・・
3. Nginx
(1) まず、以下のコマンドを実行し、Nginxの設定を確認しましょう。
vi /etc/nginx/nginx.conf
HTTP接続の場合のドキュメントルートは、
/usr/share/nginx/html
ですので、配下にWEBページで表示させたいファイルを作成します(もちろん設定変更してもOK)
ちなみに、該当箇所は以下(rootと記載のある部分)。
・・(以上省略)
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
(以下省略)・・
(2) 以下の通り実行して、PHPの設定内容を表示する、index.phpを作成しましょう。
vi /usr/share/nginx/html/index.php
ファイルが開いたら、insertモードで以下の内容をコピペ→保存します。
<?php
phpinfo();
(3) Nginxを起動します。
systemctl start nginx.service
(4) ブラウザで以下のURLを叩いて、PHP設定内容が表示されることを確認します。
http://パブリック IPv4 DNS/index.php
※パブリック IPv4 DNSはAWSのコンソール(EC2)より、確認できます。
4. PostgreSQL
続いてPostgreSQLの設定を行います。
(1) まず、以下のコマンドを実行して初期化をしましょう。
postgresql-setup initdb
(2) 設定ファイルの格納先を確認します。
find / -name pg_hba.conf
自分の場合は、以下の通りでした。
/var/lib/pgsql/data/pg_hba.conf
(3) 設定ファイルを開き、以下の通り内容を変更して、一時的にパスワードがなくてもログインできるようにします(後続の手順で設定)。
vi /var/lib/pgsql/data/pg_hba.conf
■変更前
・・(以上省略)
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
(以下省略)・・
↓ (「ident」(2ヶ所)を「trust」に変更)
■変更後
・・(以上省略)
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
(以下省略)・・
(4) PostgreSQLを起動し、ログイン → パスワード設定します。
systemctl start postgresql.service
psql -h localhost -p 5432 -U postgres
「postgres=#」と表示されたらログインできているので、以下のDDLを実行してパスワード設定しましょう。
alter role postgres with password 'postgres';
※上記では、ユーザー: postgresのパスワードをpostgresに設定しています。
(5) 設定ファイルを以下の通り変更して、パスワードなしではログインできないようにします。
・・(以上省略)
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
(以下省略)・・
※(3)の「■変更後」の「trust」(2ヶ所)を「md5」に変更しています。
(6) 日本時間で使用するため、PostgreSQLのタイムゾーンの変更を行います。
以下のコマンドを実行して、設定ファイルpostgresql.confを検索しましょう。
find / -name postgresql.conf -type f
自分の場合は、以下にありました。
/var/lib/pgsql/data/postgresql.conf
(7) postgresql.confを開いて、タイムゾーンをAsia/Tokyoに設定しましょう。
ログファイルのタイムゾーンを設定するlog_timezoneも合わせて変更しておくとよいでしょう。
・・(以上省略)
log_timezone = 'Asia/Tokyo'
・・(途中省略)・・
timezone = 'Asia/Tokyo'
(以下省略)・・
(8) postgresql.confの設定を保存したら、PostgreSQLを再起動して、変更を反映させます。
systemctl restart postgresql.service
(9) 念のため、PostgreSQLにログインして、変更が反映されているか確認しておきましょう。
-- ログイン
psql -h localhost -p 5432 -U postgres
-- ログイン後、以下のコマンドを実行
select current_timestamp;
日本時間が表示されればOKです!
(10) 続いて、PDO接続するための、pdo_pgsqlが存在するか確認します(今回はPHP→PostgreSQLの接続にPDOを使用するため)
php -m | grep pdo
pdo_pgsqlが表示されなければ、以下コマンドを実行してインストールします。
yum install --enablerepo=remi,remi-php74 php-pgsql
(11) fpm-phpを再起動して、変更を反映させます。
systemctl restart php-fpm
※WEBサーバがApacheの場合はApacheの再起動なのですが、Nginxの場合はfpm-phpが再起動の対象となります。
(12) ブラウザから接続確認するためのpostgres.phpを作成しましょう。
vi /usr/share/nginx/html/postgres.php
insertモードにて、以下の通り記述→保存。
<?php
$DBHOST = "127.0.0.1";
$DBPORT = "5432";
$DBNAME = "postgres";
$DBUSER = "postgres";
$DBPASS = "postgres";
try{
//DB接続
$dbh = new PDO("pgsql:host=$DBHOST;port=$DBPORT;dbname=$DBNAME;user=$DBUSER;password=$DBPASS");
print("接続成功".'<br>');
}catch(PDOException $e){
print("接続失敗".'<br>');
print($e.'<br>');
die();
}
//データベースへの接続を閉じる
$dbh = null;
?>
※ソースコードは、@ga_ku さんの PHPでPostgreSQLに接続する方法 | Qiitaより拝借しました(一部改変)。
(13) ブラウザで以下のURLを叩いて、「接続成功」と表示されればOK!
http://パブリック IPv4 DNS/postgres.php
これにて、環境構築 → ブラウザからの動作確認が一通りできました!
終わりに
Apache, MySQLもいいけれど、あまり馴染みのないNginx, PostgreSQLにも触れてみたくって。
特にPostgreSQLとPHPの連携のところ(PDO)で躓いたけど、できてよかったです。
変更履歴
日付 | 変更内容 |
---|---|
2021/02/14 | タイムゾーンの変更手順を追加 |
参考
LAMPとの比較
手順
1. タイムゾーンの変更
2. ソフトウェアのインストール
- Amazon Linux 2 を実行している EC2 インスタンスに Extras Library からソフトウェアパッケージをインストールする方法を教えてください。 | aws
- Extras library (Amazon Linux 2) | aws
- Amazon linux2にpostgresqlをインストールする手順 | 瀬戸内の雲のように