AlmaLinux9へWebサーバー(Apache)をインストールしよう

 WebサーバーはApache HTTP Server(Apache)をインストールします。nginx?取り合えずApacheで困らないので...気が向いたらその内に。ずいぶんと広まっている気もしますが。

 AlmaLinux 9では、Apacheの動作モデルのデフォルトがprefork(CentOS 7)からeventモデルに変わっています。だから設定にどうのということはなく、粛々とインストールします。

 

Apache HTTPをインストールしよう

 まずはさくっとインストールします。

$ sudo dnf install httpd

インストールされたパッケージは次の通りです。

=======================================================================
Package Arch Version Repository Size
=======================================================================
Installing:
httpd x86_64 2.4.62-1.el9_5.2 appstream 45 k
Installing dependencies:
almalinux-logos-httpd noarch 90.5.1-1.1.el9 appstream 18 k
apr x86_64 1.7.0-12.el9_3 appstream 122 k
apr-util x86_64 1.6.1-23.el9 appstream 94 k
apr-util-bdb x86_64 1.6.1-23.el9 appstream 12 k
httpd-core x86_64 2.4.62-1.el9_5.2 appstream 1.4 M
httpd-filesystem noarch 2.4.62-1.el9_5.2 appstream 12 k
httpd-tools x86_64 2.4.62-1.el9_5.2 appstream 79 k
mailcap noarch 2.1.49-5.el9 baseos 32 k
Installing weak dependencies:
apr-util-openssl x86_64 1.6.1-23.el9 appstream 14 k
mod_http2 x86_64 2.0.26-2.el9_4.1 appstream 162 k
mod_lua x86_64 2.4.62-1.el9_5.2 appstream 58 k

Transaction Summary
=======================================================================
Install 12 Packages

続いてApache HTTP を自動起動に登録し起動します。(最近は--nowを付けてenable/startを一コマンドの記載が多いみたいです)

$ sudo systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

起動状態を"systemctl status httpd"で確認します。

$ sudo systemctl status httpd

202503-almalinux9-status-httpd.jpg

 正常に起動できていると "active (running)"を緑で表示します。もしエラーが発生していると該当箇所が暗赤で表示します。

 DNSにサーバーのドメインが未登録でも"http://vpsに割り当てられたIPアドレス/"をWebブラウザで開けば、次の画面を表示するはずです。
このページは、定義ファイル"/etc/httpd/conf.d/welcome.conf"により、ディレクトリ"/usr/share/httpd/noindex"内を表示しています。

202503-almalinux9-httpd-testpage.jpg

もっともVPSコントロールパネルでパケットフィルターを開いていないと、Webブラウザは何も表示せずにタイムアウトしていることと思います。
KVM外側のパケットフィルターのポート(80番、443番)が閉じているからです。

 

ポート80/443を開放しよう

 まずはさくらのVPSコントロールパネルより、パケットフィルターを設定してWebをチェックしてください。

202503-almalinux9-vps-packetfilter-web.jpg

 OS側のファイアウォール(firewalld)については、さくら側からはどちらか一方(KVM外側か内側か)に設定するようにと記載しています。

 firewalldを有効にする場合は次の通りです。httpおよびhttpsが開放されたことを確認します。SSHのポート番号を変更している場合、そのポートを有効化しましょう。

[usera@localhost ~]$ sudo systemctl enable --now firewalld
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
[usera@localhost ~]$ sudo firewall-cmd --add-service=http --permanent
success
[usera@localhost ~]$ sudo firewall-cmd --add-service=https --permanent
success
[usera@localhost ~]$ sudo systemctl reload firewalld
[usera@localhost ~]$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens3
sources:
services: cockpit dhcpv6-client http https ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

これで再度Webブラウザで開き表示されればOKです。"welcome.conf"をそのまま残しておくと "/.noindex.html"をアクセスで上の画像を表示してしまいます。削除すると後のアップデートで復活してしまうので、welcome.conf内はすべてコメントアウトします。(自分はコピー後に、先頭コメント5行程度を残し削除)

$ sudo vim /etc/httpd/conf.d/welcome.conf

(すべてコメントアウト)

公開用ディレクトリをセットアップしよう 

 公開用のディレクトリをセットアップします。
今回は、ユーザーディレクトリ下に"www"を作成し、各コンテンツを配置します。userbは自分のユーザー名と置き換えてください。

/home/userb
  └ www
    ├ htdocs ドキュメントルート(html や publicというひともいますね)
    ├ log   アクセスログ
    └ cgi-bin (必要であれば。Perlスクリプト等を置きます)

歴史的慣習だと思うのですが、"/home"を"/usr/home"でもアクセスできるようシンボリックリンクを作成していることもありますのでそれを設定します。実際"/usr/home/~"とするWebアプリケーションが見られます。作成を間違えるとおかしなことになるので要注意です。別に無くともと思いますが(自分の中には残っている...)。今は/var/wwwで記事にされる方が多いので化石かもしれません。

$ sudo ln -s /home/ /usr/home
$ ls -l /usr | grep home
lrwxrwxrwx 1 root root 6 Apr 1x 16:35 home -> /home/

ユーザーホームディレクトリのデフォルトパーミッションは 700 なのでこのままではApache HTTPからアクセスできません。パーミッションを変更します。

$ chmod 711 /home/userb

次に、~/www 以下のディレクトリを作成します。ドキュメントについては、CMS等を利用するときにhttpdのアカウント(apache)がファイルを生成することがあるので、パーミッションを777へ変更します。静的コンテンツを使用するのみであればパーミッションの変更は必要ありません。運用でパーミッションに主張を持っていられる方もいるでしょうが、ここはひとりサーバーなので...

[userb@localhost ~]$ mkdir www
[userb@localhost ~]$ mkdir www/htdocs
[userb@localhost ~]$ mkdir www/log
[userb@localhost ~]$ mkdir www/cgi-bin
[userb@localhost ~]$ ls -l www
total 12
drwxr-xr-x 2 userb userb 4096 Mar 31 16:40 cgi-bin
drwxr-xr-x 2 userb userb 4096 Mar 31 16:39 htdocs
drwxr-xr-x 2 userb userb 4096 Mar 31 16:40 log

 標準的な設置(例 /var/www/vhost)だと次のようになるでしょうか。"/var/www/vhost/html"の所有権を運用ユーザー(例えばuserbユーザー)に変更します。

/var/www
  ├ html    apacheインストール時にhttp.confから指定
  ├ cgi-bin   同上
  │
  └ vhost
    ├ html  ドキュメントルート
    ├ log   アクセスログ(サイト定義毎
    └ cgi-bin (必要であれば)

 

次に、Apacheの設定ファイル "/etc/httpd/conf/httpd.conf"を編集し、いくつか変更します。変更前にバックアップを取り、編集します。

sudo cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
sudo vim /etc/httpd/conf/httpd.conf

変更は次の通りです。(変更部分はコメントで残しておきます。()内は説明書き)

(もしlogでRefererやUser-Agentが無いなと思ったときは青行を追加)
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common


(もし、文字コードにShift-JISなどが存在するときはOff、あるいは個別virtualHostに文字コードを設定)
AddDefaultCharset UTF-8
(あるいは)
AddDefaultCharset Off

(Perlスクリプトを使用するとき)
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi
AddHandler cgi-script .cgi

(以下は追記)
(ドメイン毎に定義ファイルを記述するために準備)
IncludeOptional domain.d/*.conf

(サーバーバージョンなど出力しない)
ServerTokens Prod

各ドメインの定義ファイルを保存するディレクトリを、"domain.d"で準備します。なぜこの名前かは、仕事上サーバー管理を委託していた会社がそうだっただけで他意はありません。他の定義と混在するよりは分けた方が無難だと思います。

$ cd /etc/httpd
$ sudo mkdir domain.d
$ ls
conf conf.d conf.modules.d domain.d logs modules run

Apache HTTPは、定義ファイルを"/etc/httpd/httpd.conf"内のIncludeディレクティブやIncludeOptionalディレクティブの出現順位により検索します。ディレクトリ内はファイル名順です。多くの定義は後から出現した設定で上書きされます。

実際の順位は、httpd.confの初期設定だと、 "conf.modules.d/*.conf"、"conf.d/*.conf"、追加した "domain.d/*.conf"となります。

"domain.d/"に二つのファイルを作成します。(fooやexample.comは読み替えてください)
"00-default.conf"はIPアドレスでアクセスしたとき表示します。

/etc/httpd/domain.d/00-default.conf

<VirtualHost _default_:80>
ServerName VPSのIPアドレス
DocumentRoot /home/foo/www/htdocs
CustomLog /home/foo/www/log/access_log combined env=!nolog
ErrorLog /home/foo/www/log/error_log
<Directory "/usr/home/foo/www/htdocs">
Require all granted
</Directory>
</VirtualHost>

"/cgi-bin/"が不要な方は削除してください。そのときはhttp.conf内の"/cgi-bin/"定義もコメントアウトしたほうがよいかと思います

/etc/httpd/domain.d/01-example.conf

<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /home/foo/www/htdocs
CustomLog /home/foo/www/log/access_log combined env=!nolog
ErrorLog /home/foo/www/log/error_log
Alias /cgi-bin/ "/home/foo/www/cgi-bin/"
<Directory /home/foo/www/htdocs>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory /home/foo/www/cgi-bin>
Options FollowSymLinks ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

設定ファイルや定義ファイルを更新したのでApache HTTPを再起動します。

$ sudo systemctl restart httpd
(エラーが起きたときは、次で確認)
$ sudo systemctl status httpd
(起動しているサイト情報などを確認するには)
$ sudo httpd -S

これで、"/home/foo/www/htdocs"に"index.html"を配置すれば、ウェブブラウザで"http://www.example.com/"(読み替えてください)とすれば表示できるはずです。

 もし、ウェブブラウザに"403 Forbidden"を表示した場合でユーザーディレクトリ下にコンテンツを配置しているときは、ホームディレクトリのパーミッションが不足している可能性があります。"ls -l /home"でパーミッション設定を確認し修正してください。

 

autoindexを解除

 AlmaLinux 9でサイト定義を追加してautoindexの動作を確認しましたが、"403 Forbidden"を表示して、autoindexが機能していないように見えます。(サイトを追加せず、conf.d/welcome.confを無効にすると、/var/www/htmlのファイルリスト(空)を表示するので一応機能はしている)

 何かのタイミングで動作することがあるかもしれないので、autoindex機能は無効としたほうが無難です。

202004-autoindex-enable.png

無効とするには、"/etc/httpd/conf.modules.d/00-base.conf"ファイルの"mod_autoindex.so"をロードする行をコメントアウト、"/etc/httpd/conf.d/autoindex.conf"ファイルをすべてコメントアウトします(autoindex.confをリネームや削除すると後の アップデートで復活することがある)。

$ sudo vim /etc/httpd/conf.modules.d/00-base.conf

(次の行をコメントアウト)
#LoadModule autoindex_module modules/mod_autoindex.so
$ sudo vim /etc/httpd/conf.d/autoindex.conf

(すべてコメントアウト)

 

MPMのチューニング

 Apacheを運用していく過程で調整する項目ですが、ここで取り上げておきます。ブログを公開する程度では初期値の運用でほぼ問題ありません。しかし、MaxConnectionsPerChildが初期値"0"のままだとゴミが溜まるような気がして少し気持ち悪いので、/etc/httpd/conf.modules.d/10-mpmevent.confを作成して調整します。

 MaxConnectionsPerChildは運用に合わせて調整されるようですが、1000前後を設定する記事を見かけます。

/etc/httpd/conf.modules.d/10-mpmevent.conf

<IfModule mpm_event_module>
        StartServers             2
        MinSpareThreads          25
        MaxSpareThreads          75
        ThreadLimit              64
        ThreadsPerChild          25
        MaxRequestWorkers        150
        MaxConnectionsPerChild   1250
</IfModule>

 

  1. AlmaLinux9をさくらのVPSでインストールしよう
  2. AlmaLinux9を初期セットアップしよう
  3. AlmaLinux9へWebサーバー(Apache)をインストールしよう
  4. AlmaLinux9へPHP(8.4)をインストールしよう
  5. AlmaLinux9へTLS証明書(Let's Encrypt)を導入しよう
  6. ALmaLinux9へMariaDBをインストールしよう(10.5 => 10.11)
  7. AlmaLinux9へメールサーバー(Postfix/Dovecot)をインストールしよう
  8. AlmaLinux9へDKIM、DMARCを設定しよう

前へ

AlmaLinux9を初期セットアップしよう

次へ

AlmaLinux9へPHP(8.4)をインストールしよう