🔥

第6話 LaravelのためのApache導入編 ~ 実践!Hyper-Vで開発環境構築! CentOS7+VSCode+Laravel

2024/07/02に公開

はじめに

これはLaravel開発環境構築のためにhyper-VでCentOS7をインストール済み
そこから初めてLaravel開発環境を構築したい人向けの記事です。
そして、本記事はApacheの導入を解説します。

前提

  • Hyper-Vにインストール済みのCentOS7(ver: 7.9)
    この記事ではHyper-VにインストールされたCentOS7にLaravelを開発環境として
    構築するために必要な準備について解説します。

    CentOS7のバージョン確認するにはCentOSを起動して以下コマンドを実行してください。

    cat /etc/centos-release
    

    Linux release 7.9.2009 (core)
    と表示されればOKです

    もしそうでなければ、以下記事を参考に導入してから本記事を閲覧頂ければと思います。

  • 本記事は以下の要件導入を目指し、以下の状態を前提としています。

    • Apache 2.4.58 --- 未導入
    • MariaDB 10.4.32 --- 未導入
    • PHP 8.2.12 --- 未導入
    • composer (出来るだけ最新版) --- 未導入

本題のまえに・・・

この記事は上記の記事の内容を実施済みであることを前提に解説します。

前提は違えど自身の環境を把握して記事の内容との差分を理解して置き換えて読める方
このまま閲覧頂ければと思います。

本記事からしばらくはゴリゴリにCentOS7でのお話になります。

本題

ApacheはWebサーバーのソフトウェアです。
ですが、そもそもWebサーバーとはなんでしょうか?

簡単に説明すると要求されたリクエストに対してWeb関連サービスを提供するソフトウェアになります。
LaravelはWebアプリケーションフレームワークです。
Laravelで開発されたアプリケーションはサービスそのものではありますが、LaravelはWebアプリケーションだけを開発するフレームワークなのでそれだけではせっかく開発したWebアプリケーションを使用者に届けることは出来ないのです。

勿論開発段階でもそれがWebアプリケーションとして機能しているかの確認テストのための実行環境としても必須になります。

そのため今回はWebサーバーとしてApacheを導入していきます。

そしてApacheを導入するためには以下の作業が必要です。

  • Apacheのインストール
  • Apacheの設定
    • httpd.confの設定
    • firewallの設定
    • 自動起動設定

では、早速導入していきましょう。

Apache 2.4.58 の導入

まず、現在導入できるApacheのバージョンを確認しましょう。

CentOS7
# Apacheのバージョン確認。Apacheは[httpd]
[root@CentOS7 ~]# yum info httpd

# 実行結果
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
利用可能なパッケージ
名前                : httpd
アーキテクチャー    : x86_64
バージョン          : 2.4.6
リリース            : 99.el7.centos.1
容量                : 2.7 M
リポジトリー        : updates/7/x86_64
要約                : Apache HTTP Server
URL                 : http://httpd.apache.org/
ライセンス          : ASL 2.0
説明                : The Apache HTTP Server is a powerful, efficient, and extensible
                    : web server.

残念ながら私の環境ではバージョンが足りないようです。

そしてApache 2.4.58は以下のリポジトリが必要になります。

  • epel (Fedoraが提供するRedHat向けのパッケージ開発プロジェクトの名称)
  • ius (Linux向けのパッケージ開発の有志プロジェクトの名称)

私の環境ではepelは導入済みのためこのままiusの導入をしていきます。

iusリポジトリの導入

CentOS7
# iusリポジトリの導入
yum -y install https://repo.ius.io/ius-release-el7.rpm

Apache 2.4.58のインストール

CentOS7
# Apacheに必要なモジュールも含めてインストール
yum -y install httpd24u-devel.x86_64 httpd24u-manual.noarch

# インストールされるもの
======================================================================================================
Package                       アーキテクチャー バージョン                    リポジトリー       容量
======================================================================================================
インストール中:
httpd24u-devel                x86_64           2.4.58-1.el7.ius              ius               221 k
httpd24u-manual               noarch           2.4.58-1.el7.ius              ius               2.4 M
依存性関連でのインストールをします:
apr15u                        x86_64           1.5.2-2.ius.el7               ius               112 k
apr15u-devel                  x86_64           1.5.2-2.ius.el7               ius               194 k
apr15u-util                   x86_64           1.5.4-3.ius.el7               ius                93 k
apr15u-util-devel             x86_64           1.5.4-3.ius.el7               ius                77 k
cyrus-sasl                    x86_64           2.1.26-24.el7_9               updates            88 k
cyrus-sasl-devel              x86_64           2.1.26-24.el7_9               updates           310 k
expat-devel                   x86_64           2.1.0-15.el7_9                updates            58 k
httpd24u                      x86_64           2.4.58-1.el7.ius              ius               1.4 M
httpd24u-filesystem           noarch           2.4.58-1.el7.ius              ius                28 k
httpd24u-tools                x86_64           2.4.58-1.el7.ius              ius                92 k
libbrotli                     x86_64           1.0.9-10.el7                  epel              308 k
libdb-devel                   x86_64           5.3.21-25.el7                 base               39 k
libnghttp2                    x86_64           1.33.0-1.3.el7                epel               69 k
mailcap                       noarch           2.1.41-2.el7                  base               31 k
openldap-devel                x86_64           2.4.44-25.el7_9               updates           805 k
依存性関連での更新をします:
cyrus-sasl-lib                x86_64           2.1.26-24.el7_9               updates           156 k
expat                         x86_64           2.1.0-15.el7_9                updates            83 k
openldap                      x86_64           2.4.44-25.el7_9               updates           356 k

トランザクションの要約
======================================================================================================
インストール  2 パッケージ (+15 個の依存関係のパッケージ)
更新                       (  3 個の依存関係のパッケージ)

総ダウンロード容量: 6.9 M

インストール確認

CentOS7
# インストール済みの[httpd]を確認
[root@CentOS7 ~]# yum list installed | grep httpd
httpd24u.x86_64                      2.4.58-1.el7.ius               @ius
httpd24u-devel.x86_64                2.4.58-1.el7.ius               @ius
httpd24u-filesystem.noarch           2.4.58-1.el7.ius               @ius
httpd24u-manual.noarch               2.4.58-1.el7.ius               @ius
httpd24u-tools.x86_64                2.4.58-1.el7.ius               @ius

# インストールされたhttpdのバージョンを確認
[root@CentOS7 ~]# httpd -v
Server version: Apache/2.4.58 (IUS)
Server built:   Oct 26 2023 16:56:39

よし、Apache 2.4.58のインストールが出来ました。

Apache 2.4.58 の設定

このままではApacheはまだ起動できません。
次に必要な設定を行っていきます。

httpd.confの設定

試しに早速httpdを起動してみましょう。

CentOS7
# 起動するぞい!
[root@CentOS7 ~]# systemctl start httpd

# エラーが出たぞい!?
Job for httpd.service failed. See "systemctl status httpd.service" and "journalctl -xe" for details.

# エラーを確認するぞい!
[root@CentOS7 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: failed (Result: protocol) since 日 2024-06-30 22:26:26 JST; 2min 21s ago
     Docs: man:httpd.service(8)
  Process: 6696 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)
 Main PID: 6696 (code=exited, status=0/SUCCESS)
   Status: "Reading configuration..."

 630 22:26:26 CentOS7 systemd[1]: Starting The Apache HTTP Server...
 630 22:26:26 CentOS7 httpd[6696]: AH00558: httpd: Could not reliably determine the server'...sage
 6月 30 22:26:26 CentOS7 httpd[6696]: httpd (pid 6608) already running
 6月 30 22:26:26 CentOS7 systemd[1]: Failed to start The Apache HTTP Server.
 6月 30 22:26:26 CentOS7 systemd[1]: Unit httpd.service entered failed state.
 6月 30 22:26:26 CentOS7 systemd[1]: httpd.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

# とりあえず、httpd.confのチェックをしてみるぞい!
[root@CentOS7 ~]# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::7b58:efe7:d3b7:d130. Set the 'ServerName' directive globally to suppress this message
Syntax OK

AH00558: httpd: fe80::7b58:efe7:d3b7:d130 を使用して、サーバーの完全修飾ドメイン名を確実に特定できませんでした。このメッセージを抑制するには、「ServerName」ディレクティブをグローバルに設定します。
と言っているようです。

ということは、/etc/httpd/conf/httpd.confでそれを設定する必要がありそうですね。

CentOS7
# httpd.confを編集
vi /etc/httpd/conf/httpd.conf


ServerNameはデフォルトではコメントアウトされています。
今回は新たにServerName localhost:80と追記して上書き保存しました。

そしてhttpd.confに変更を加えてた時は反映のためにhttpdの再起動が必要になります。

CentOS7
# httpdを再起動
[root@CentOS7 ~]# systemctl restart httpd

# またエラーが出たぞい!?
Job for httpd.service failed. See "systemctl status httpd.service" and "journalctl -xe" for details.

# ここでエラー内容が確認できました。
[root@CentOS7 ~]# cat /var/log/httpd/error_log
[Sun Jun 30 21:46:03.882679 2024] [core:notice] [pid 6607:tid 6607] SELinux policy enabled; httpd running as context unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[Sun Jun 30 21:46:03.883367 2024] [suexec:notice] [pid 6607:tid 6607] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Jun 30 21:46:04.025329 2024] [http2:warn] [pid 6608:tid 6608] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.
[Sun Jun 30 21:46:04.025740 2024] [lbmethod_heartbeat:notice] [pid 6608:tid 6608] AH02282: No slotmem from mod_heartmonitor
[Sun Jun 30 21:46:04.027545 2024] [mpm_prefork:notice] [pid 6608:tid 6608] AH00163: Apache/2.4.58 (IUS) configured -- resuming normal operations
[Sun Jun 30 21:46:04.027559 2024] [core:notice] [pid 6608:tid 6608] AH00094: Command line: 'httpd'

[Sun Jun 30 21:46:04.025329 2024] [http2:warn] [pid 6608:tid 6608] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.

ちょっと何言ってるか分からないですね。
ちょっと日本語に翻訳してみましょう。
[Sun Jun 30 21:46:04.025329 2024] [http2:warn] [pid 6608:tid 6608] AH10034: MPM モジュール (prefork.c) は mod_http2 ではサポートされていません。 MPM は、サーバー内での処理方法を決定します。 HTTP/2 にはこの点でさらに多くの要求があり、現在選択されている MPM では対応できません。これは勧告的な警告です。サーバーは引き続き動作しますが、HTTP/2 プロトコルは非アクティブになります

ふむふむ、Webサーバーとして実行は出来ているHTTP/2とやらが使用できないようです。
さて、どうしましょう。ここからは技術選定の話になってしまいそうです。
簡単に説明すると、MPMとはマルチプロセシングモジュールの略称でマルチスレッドの概念が分からないと選定が出来ない部分のお話になります。
今回の記事は初心者向けですので出来るだけ簡単でハマらない方に判断を倒します。

結論→今出ているエラーをガン無視します!!

CentOS7
# httpd.confを編集してエラーをガン無視しちゃう♪
vi /etc/httpd/conf/httpd.conf


LogLevelcore:errorに変更して上書き保存します。

次にOSを再起動します。

CentOS7
# この場合systemctl restartで反映されないので再起動する
reboot

再起動後以下コマンドでhttpdを実行

CentOS7
# httpdを起動
systemctl start httpd

# httpdのステータス確認
[root@CentOS7 ~]# systemctl status httpd

# 実行結果
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 月 2024-07-01 22:17:45 JST; 8min ago
     Docs: man:httpd.service(8)
 Main PID: 1385 (httpd)
   Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─1385 /usr/sbin/httpd -DFOREGROUND
           ├─1386 /usr/sbin/httpd -DFOREGROUND
           ├─1387 /usr/sbin/httpd -DFOREGROUND
           ├─1388 /usr/sbin/httpd -DFOREGROUND
           ├─1391 /usr/sbin/httpd -DFOREGROUND
           └─1395 /usr/sbin/httpd -DFOREGROUND

 7月 01 22:17:44 CentOS7 systemd[1]: Starting The Apache HTTP Server...
 7月 01 22:17:45 CentOS7 systemd[1]: Started The Apache HTTP Server.

起動成功です!!
これでApacheのインストールはできました。

firewallの設定

さてさて、早速ブラウザでアクセスしてみましょう。
私のCentOS7のIPアドレスは172.16.10.2です。
アドレスバーにhttp://172.16.10.2と打ってアクセスしてみましょう。

・・・まあ、こうなります。
初期状態ではhttp(ポート:80)は開いていません。
このポートを開けないとhttpの通信を受け付けられない=アクセスできないのでポートを開けていきます。
以下のコマンド(firewall-cmd)を実行します。

CentOS7
# Apache(http)のサービスを永続的にポートを開ける
firewall-cmd --zone=public --add-service=http --permanent

# 変更反映の為にリロードする
firewall-cmd --reload

# 反映を確認
firewall-cmd --list-all

# 実行結果
[root@CentOS7 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

services:httpが設定されました。これでfirewallの設定は完了です。
試しに再度ブラウザのアドレスバーにhttp://172.16.10.2と打ってアクセスしてみましょう。

ついにWebサーバーにアクセスできました!

自動起動設定

あと、もう一息です。
ひとまずWebサーバーにアクセスできるようになりましたが、このままでは再起動したときにアクセスできなくなりますのでhttpdサービスの自動起動設定を行います。

CentOS7
# enableオプションで自動起動設定にする
systemctl enable httpd

これでOKです。

Apache 2.4.58 の動作確認

  1. 再起動してアクセス出来るかを確認する
    以下コマンドで再起動後ブラウザでアクセスしてください。

    CentOS7
    reboot
    


    この画面が表示されたらOKです。
    表示されない場合は自動起動設定が出来ていないかもしれません。
    再度設定を行ってください。

  2. テストページを作ってちゃんとアクセスできるかを確認する
    せっかくなので簡単なhtmlファイルを作って表示させてみましょう!

    CentOS7
    # パス移動
    cd /var/www/html/
    
    # htmlファイルを新規作成
    touch ./index.html
    
    # 新規作成したhtmlファイルを編集
    vi ./index.html
    

    こんな感じで適当に作ってみました。
    内容は本当に適当で大丈夫です。
    これを上書き保存したあと再度ブラウザでアクセスしてみましょう。

    ちゃんと自分が作成したページに置き換わってますね!

動作確認も問題なさそうです。

さいごに

Apache難しいですよね・・・。実際ちゃんとやろうとするととても難しいものだと思います。
良くある初心者向けのApache導入の記事では理由やそうしないとどうなるのかの説明なしに端的な手順だけの説明が多い気がします。
裏を返せばそれなりに説明しようとするとそのための前提知識が必要なので補足説明が多くなったり、そもそも最適な設定は必要要件次第なためこうするべきと言い切れないことが多いのだなと感じました。
今回の記事はあくまで最小要件で補足説明を多めにした結果記事が長くなりました。

Discussion