LAMP環境の作成

LinuxOS の AlmaLinux上にLAMP環境を作成します

ネットワーク関連設定

NICの設定

ネットワークデバイスの設定では、コマンドで nmtui を打つと下図左が表示される

# nmtui

最初の画面で、システムのホスト名を設定するから左図の画面を出し、ホスト名を入力したら<OK>を選択し、クリックする。

最初の画面に戻ったら、<OK>を押して終了する。

以上で ssh ログインができるようになります。

# ssh root@192.168.12.202

基本パッケージのインストール

開発ツールなど、基本的なパッケージをインストールしておきます。
# dnf -y groupinstall base
# dnf -y groupinstall development
# dnf -y groupinstall network-tools

パッケージのアップデート

インストール済みのパッケージを、最新版にアップデートします。

# dnf -y update

不要サービスの停止

下記のコマンドを実行

# systemctl disable atd
# systemctl disable kdump
# systemctl disable mdmonitor

SELINUXの設定

SELINUXの設定では、デフォルトの設定から、いくつかの設定を変更する必要があります。

setools-consoleのインストール
# dnf -y install setools-console


メールの送信がブラウザの、「お問い合わせ」から出来るようにします

メールが送信できるようにするため、次の操作を行います
# setsebool -P httpd_can_sendmail=1


注意! ディレクトリ/varの下の/www/html はApacheをインストールした後にコンテキストの設置を行います。Apacheインストール前にはこのフォルダは有りません!

Webルート、/var/www/html/ に次のコンテキストの設定を行います

# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?"
コンテキストの設定をファイルに反映させます
# restorecon -R -v /var/www/html/

WordPressで、モジュールの更新やテーマの更新が出来るようにします

# setsebool -P domain_can_mmap_files=1 
# setsebool -P httpd_graceful_shutdown=1

firewalld設定

・現在の設定の確認
# firewall-cmd --list-all
public(active)
target: default
icmp-block-inversion: no
interfaces: enpp0s3 enp0s8
sources:
services: cockpit ddhcpv6-client ssh
ports:
(略)

初期設定では publicゾーンの cockpit、dhcpv6-client、ssh サービスが許可されています。

cockpit と dhcpv6-client を使わない場合は、削除しておきましょう。

# firewall-cmd --remove-service=cockpit --permanent
# firewall-cmd --remove-service=dhcpv6-client --permanent

追加で HTTP(80/tcp) と HTTPS(443/tcp) を許可しておきます

# firewall-cmd --add-port=80/tcp --permanent
# firewall-cmd --add-port=443/tcp --permanent

設定を読込みます

#  firewall-cmd --reload
・設定を確認します
# firewall-cmd --list-all
-----(以下の表示であればOK)----- public (active)
target: default
icmp-block-inversion: no
interfaces: enp2s0
sources:
services: ssh
ports: 80/tcp 443/tcp
(略)

Chrony設定(NTP)

タイムゾーンを日本に変更

# timedatectl set-timezone Asia/Tokyo
・NTPサーバーを変更します。
# vi /etc/chrony.conf
pool 2.cloudlinux.pool.ntp.org iburst
 ↓
pool ntp.nict.jp
chronyd を再起動
# systemctl restart chronyd
自動起動設定
# systemctl enable chronyd
・10分ほど経過したら動作を確認します。
# chronyc sources -v
-----(以下のような表示があればOK)----- 
^+ ntp-a3.nict.go.jp 1 6 77 59 +972us[ +972us] +/- 5667us
^- ntp-b2.nict.go.jp 1 6 77 61 +1423us[+1423us] +/- 3830us
^* ntp-a2.nict.go.jp 1 6 77 62 +269us[ +547us] +/- 4458us

chronyd はゆっくり時刻を同期します。時刻があまりにもズレている場合は、下記コマンドを実行して即時同期してください。(ntpdateコマンドは廃止されました)

# chronyc makestep

メールサーバーソフトPostfixのインストール

メールサーバーを構築する場合、送信メールサーバー(SMTPサーバー)と受信メールサーバー(POP/IMAPサーバー)の構築が必要です。
ここでは、送信メールサーバーにはPostfixをインストールしますが、お問い合わせの送信のみに限定するので、受信メールサーバーはインストールしません。このため、メールサーバーを不正な中継サーバーにさせないようにする設定は不要です。

# dnf -y install postfix   ← Postfixインストール
# dnf -y install mailx

PostFixの設定を行います

main.cfの編集

# vi /etc/postfix/main.cf ← Postfix設定ファイル編集
94行目
myhostname = east19-mikas.com        ← 追加(自FQDN名を指定)
   注意!この部分で、hostnameは、インターネット上で有効である必要が有ります!

102行目
mydomain = east19-mikas.com         ← 追加(ドメイン名を指定)
   注意!この部分で、hostnameは、インターネット上で有効である必要が有ります!
118行目
myorigin = $mydomain            ← 追加(ローカルからのメール送信時の送信元メールアドレス@以降にドメイン名を付加)

135行目
inet_interfaces = localhost       ←外部からのメール受信は許可しない(送信専用サーバーとする)

183行目
mydestination = $myhostname, localhost.$mydomain, localhost    ←変更しない(自ドメイン宛メールは受診しない)

591行目
smtpd_banner = $myhostname ESMTP unknown         ← 追加(メールサーバーソフト名の隠蔽化)
以上は、main.cfの設定内容

master.cfの編集

次はmaster.cfファイルの編集です。

# vi /etc/postfix/master.cf        ← master.cf編集
17行目
submission inet n   -    n    -   -  smtpd ← 行頭の#を削除(SUBMISSIONポート有効化)

21行目
-o smtpd_sasl_auth_enable=yes ← 行頭の#を削除(SUBMISSIONポートでSMTP認証有効化)

PostFixの再起動

# systemctl restart postfix      ← Postfix再起動
# systemctl enable postfix       ← Postfix自動起動設定

root宛メールの送信先を変更します

# vi /etc/aliases
-----(下記を最終行に追加)-----

 root: <自分のメールアドレス>
メールエイリアスのDBファイルを更新します

# newaliases
root宛のメールが、自分のメールアドレス宛に届くことを確認します

# echo test | mail -s "test mail" root

サードパーティリポジトリの追加

EPEL
# dnf config-manager --set-enabled powertools
# dnf -y install epel-release
# dnf -y update
Remi
# rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-8.rpm
# rpm --import http://rpms.remirepo.net/RPM-GPG-KEY-remi
Remi リポジトリを有効化
# dnf config-manager --set-enabled remi

Remi リポジトリから PHP7.4 をインストールされるように php:remi-7.4 モジュールをインストールします。

# dnf -y module reset php
# dnf -y module install php:remi-7.4

【補足】
AlmaLinux OS 8 にはパッケージ管理に Application Streams という機能があり、インストールするミドルウェアのバージョンを簡単に変更できるようになっています。そして特定のバージョン(例えば、PHP7.4)のパッケージをまとめたものを「モジュール(module)」と呼びます。

モジュールの一覧は以下のコマンドで確認できます。 dnf module list

各種ミドルウェアのインストール

※バージョンは2021年9月1日時点のものです。

Apache httpd(2.4.37-39)
# dnf -y install httpd-devel
# dnf -y install mod_ssl
PHP(7.4.23-1)
# dnf -y install php
# dnf -y install php-devel
# dnf -y install php-pdo
# dnf -y install php-mysqlnd
# dnf -y install php-mbstring
# dnf -y install php-gd
# dnf -y install php-pear
# dnf -y install composer
# dnf -y install php-pecl-apc-devel
# dnf -y install zlib-devel
MySQL(8.0.21-1)
# dnf -y install mysql-devel
# dnf -y install mysql-server

PHPの設定

・PHPの設定
# vi /etc/php.ini 

expose_php = On
 ↓
expose_php = Off

;date.timezone =
 ↓
date.timezone = 'Asia/Tokyo'

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
 ↓
error_reporting = E_ALL & ~E_NOTICE
php-fpm を自動起動を設定し起動します。
# systemctl enable --now php-fpm

モジュール版の PHP とは違い php-fpm にはいくつか注意点があります。以下を確認しておきましょう。

  • PHP はデフォルトで FastCGI Process Manager (FPM) を使用します (スレッド化された httpd で安全に使用できます)。
  • php_value 変数および php-flag 変数は httpd 設定ファイルで使用されなくなり、代わりに プール設定の /etc/php-fpm.d/*.conf で設定する必要があります。
  • PHP スクリプトのエラーと警告のログは、/var/log/httpd/error.log ではなく /var/log/php- fpm/www-error.log ファイルに記録されます。
  • PHP の max_execution_time 設定変数を変更するときは、変更した値に合わせて httpd ProxyTimeout 設定を増やす必要があります。
  • PHP スクリプトを実行するユーザーが、FPM プール設定 (/etc/php-fpm/d/www.conf ファイ ル、apache ユーザーがデフォルト) に設定されるようになりました。
  • 設定を変更した場合、または新しい拡張機能をインストールした場合は、php-fpm サービスを 再起動する必要があります。

15.1.2. PHP への主な変更点 | RHEL 8 の導入における検討事項 より引用

Apache httpd の設定

不要なコンフィグを読込まないようにしておきます。
# mv -i /etc/httpd/conf.d/autoindex.conf /etc/httpd/conf.d/autoindex.conf.org
# mv -i /etc/httpd/conf.d/userdir.conf /etc/httpd/conf.d/userdir.conf.org
# mv -i /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.org
オリジナルのコンフィグをバックアップ
# mv -i /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
・コンフィグを作成します。
# vi /etc/httpd/conf/httpd.conf

httpd.confの内容は下記のリンクをクリックして表示される内容をコピー・貼り付けします

Apache httpd の自動起動を設定し起動ます。
# systemctl enable --now httpd

サーバー証明書の作成

サーバー証明書は、My認証局としてブラウザにインポートしたサーバーで作成します。作成時、ドメイン名をサーバーのドメイン名とする必要が有ります。

この件は別項で説明します

Apache HTTPS(SSL/TLS)の設定

SSL設定ファイルのオリジナルをバックアッップします
# mv -i /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.org
SSL設定ファイルを作成します。
# vi /etc/httpd/conf.d/ssl.conf

ssl.confの内容は下記のリンクをクリックして表示される内容をコピー・貼り付けします

関連記事:安全な SSL/TLS 設定にするための10のポイント(Apache httpd 2.4)
 

Apache httpd を再起動します。
# systemctl restart httpd

WEBブラウザで HTTPSで接続できることを確認します。

【補足】
自己署名のサーバー証明書の場合は警告が表示され、接続できない場合があります。FireFox で「危険性を承知で続行」ボタンを押して接続するか、Google Chrome の場合は「thisisunsafe」とタイプすると接続できます。

MySQL 8.0 の設定

・MySQLの設定ファイルに以下を追加します。
# vi /etc/my.cnf.d/mysql-server.cnf
slow_query_log=ON
slow_query_log_file=/var/log/mysql/slow_query.log
long_query_time=1.0

log_timestamps=SYSTEM
skip-character-set-client-handshake

【補足】
MySQL 8.0 ではセキュリティ強化のためデフォルトの認証プラグインが「caching_sha2_password」に変更になっています。しかし、現状ではほとんどのWebアプリケーション(WordPressやZabbixなど)が caching_sha2_password に対応していません。

そのため AlmaLinux の MySQL 8.0 パッケージでは以下の設定ファイルで、認証プラグインを「mysql_native_password」に変更してくれています。

# cat /etc/my.cnf.d/mysql-default-authentication-plugin.cnf
(略)
default_authentication_plugin=mysql_native_password
MySQL の自動起動を設定し起動します。
# systemctl enable --now mysqld

mysql_secure_installation の実行

初期状態では、rootユーザーがパスワードなしで MySQLに接続できるようになっていますのでパスワードを設定しておきます。

mysql_secure_installation コマンドを実行すると、root ユーザーのパスワードを変更し、不要なユーザーやDBも削除してくれます。パスワードは、8文字以上で英数大文字小文字と記号が含まれていないとポリシー違反で弾かれてしまいますので注意です。パスワードポリシーを変更したい場合は「--use-default」オプションなしで実行してください。
# mysql_secure_installation --use-default

(略)
Please set the password for root here.

New password: <新しいパスワード>

Re-enter new password: <新しいパスワード>
(略)
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
(不要なユーザーやDBを削除)
All done!

ログローテーション設定

設定ファイルのバックアップ用ディレクトリを作成しておきます。
# mkdir /etc/logrotate.off

Apacheログのローテーション設定

オリジナルの設定ファイルをバックアップします
# mv -i /etc/logrotate.d/httpd /etc/logrotate.off/
・設定ファイルを作成します
# vi /etc/logrotate.d/httpd

/var/log/httpd/*log {
      daily
      missingok
      dateext
      rotate 60
      create 644 apache apache
      sharedscripts
      postrotate
          /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
     endscript
} 
・確認します
# logrotate -v /etc/logrotate.d/httpd
-----(下記のような表示があればOKです)----- (略)
rotating pattern: /var/log/httpd/*log after 1 days (60 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/httpd/access_log
(略)

MySQLログのローテーション設定

オリジナルの設定ファイルをバックアップします mv -i /etc/logrotate.d/mysqld /etc/logrotate.off/

# mv -i /etc/logrotate.d/mysqld /etc/logrotate.off/
・設定ファイルを作成します
# vi /etc/logrotate.d/mysqld

/var/log/mysql/*log {
  daily
  missingok
  dateext
  rotate 60
  sharedscripts
  postrotate
     if test -x /usr/bin/mysqladmin && \    /usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf ping &>/dev/null
     then
     /usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf flush-logs
   fi
   endscript
} 
・MySQL の root ユーザのパスワードファイルを作成
# vi /root/.my.cnf

[mysqladmin]
user=root
password="<パスワード>"

パスワードを書いているのでパーミッションを変更

# chown root:root /root/.my.cnf
# chmod 600 /root/.my.cnf
・確認します
# logrotate -v /etc/logrotate.d/mysqld
-----(下記のような表示があればOKです)----- (略)
rotating pattern: /var/log/mysql/*log after 1 days (60 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/mysql/mysqld.log
(略)

自動起動の設定確認

# systemctl list-unit-files | grep -e httpd.service -e php-fpm.service -e mysqld.service -e chronyd.service
-----(下記のような表示であればOKです)----- 

chronyd.service                enabled
httpd.service                  enabled
mysqld.service                enabled
php-fpm.service               enabled
一度OSを再起動して、各種サービスが起動している事を確認しましょう。
# shutdown -r now
(再起動後に以下を実行)
# ps aux | grep -e httpd -e php-fpm -e mysqld -e chronyd
上部へスクロール