77Lifeworkベータ版

77Lifeworkベータ版

IT関係の話(ツール開発・インフラ構築)をメインとして、その他私の趣味や雑記用のブログです。ここに書いた内容が少しでも参考になれば嬉しいです。

Apacheを複数起動(複数インスタンスを構成)する

はじめに

今回はLinux(CentOS)上にApacheをインストールし、複数の独立したインスタンスとして起動する方法を書いていきます。
ここでは2つのインスタンスを起動しますが、それぞれのインスタンスへのアクセスはポート番号で区別することとします。
(もちろん、IPアドレスでも区別できます)

アクセスする時のイメージは下図のような感じです。
f:id:J-back:20191110232259j:plain:w600

構成情報

CentOS 7.7(1908)
Apache 2.4.41
・ポート番号
 インスタンス1:80
 インスタンス2:8080

Apacheインストール準備

今回はApacheのソースファイルをダウンロードし、コンパイルしてインストールする方法で進めます。
Apacheコンパイルにはいくつかパッケージが必要なので、先にインストールしておきます。

まずは以下のパッケージをyumでインストールします。実行前にはインターネットと接続できること、DNSサーバが設定されていて名前解決ができることを確認しておきましょう。

yum -y install gcc pcre pcre-devel expat-devel

Apacheのソースファイルをコンパイルするためには「apr」と「apr-util」が必要なので、これらのソースファイルを以下のリンク先からダウンロードします。tar.gz形式を選択しましょう。
apr.apache.org


ここでは「apr-1.6.5」と「apr-util-1.6.1」をダウンロードしました。基本的に最新版を使用で問題ないと思います。
以下の「apr-x.x.x」と「apr-util-x.x.x」は適宜ダウンロードしたバージョンに読み替えてください。
ダウンロードしたtarファイルをSCP等でインストール先のサーバに配置します。今回は「/tmp」に置きました。
f:id:J-back:20191112232627p:plain:w600

以下コマンドで解凍します。

cd /tmp
tar -zxvf apr-1.6.5.tar.gz
tar -zxvf apr-util-1.6.1.tar.gz


aprを「/opt/apr-1.6.5」にインストールします。

cd /tmp/apr-1.6.5/
./configure --prefix=/opt/apr-1.6.5
make
make install

下記のエラーが出た場合にはconfigureファイルを編集します。

rm: cannot remove 'libtoolT': No such file or directory

以下のように変更し、保存したら再度上記のコマンドを実行します。

vi /tmp/apr-1.6.5/configure

変更前:
$RM "$cfgfile"
変更後:
$RM -f "$cfgfile"

f:id:J-back:20191112233058p:plain:w600



次にapr-utilを「/opt/apr-util-1.6.1」にインストールします。このとき、先ほどインストールした「apr-x.x.x」を指定します。

cd /tmp/apr-util-1.6.1/
./configure --prefix=/opt/apr-util-1.6.1 --with-apr=/opt/apr-1.6.5
make
make install


また、Apacheの実行用ユーザを作成しておきます。

useradd -s /sbin/nologin apache
groupadd apache
usermod -aG apache apache

Apacheコンパイル

以下のダウンロードページからApacheのソースファイルをダウンロードします。
httpd.apache.org


最新版のtar.gz形式のソースファイルを選択しましょう。
以下、「httpd-x.x.x」はダウンロードしたバージョンに読み替えてください。

f:id:J-back:20191109232457p:plain:w600

ダウンロードしたソースファイルをSCP等でインストール先のサーバに配置します。
ここでは「/tmp」に配置したので、以下コマンドで解凍します。

cd /tmp
tar -zxvf httpd-2.4.41.tar.gz

以下コマンドでコンパイルします。先ほどインストールした「apr-x.x.x」と「apr-util-x.x.x」を指定します。

cd /tmp/httpd-2.4.41/
./configure --prefix=/opt/httpd-2.4.41 --with-apr=/opt/apr-1.6.5 --with-apr-util=/opt/apr-util-1.6.1
make
make install

ここまでで1つ目のApacheをインストールすることができたので、次は2つ目のApacheをインストールしていきましょう。
「/tmp」に展開した「/tmp/httpd-2.4.41」は一度削除し、再度2つ目のApache用にtarファイルを展開します。

cd /tmp
rm -rf httpd-2.4.41
tar -zxvf httpd-2.4.41.tar.gz

その後、2つ目のApacheディレクトリ名を「httpd-2.4.41-ex」として「/opt/httpd-2.4.41-ex」にインストールします。

cd /tmp/httpd-2.4.41
./configure --prefix=/opt/httpd-2.4.41-ex --with-apr=/opt/apr-1.6.5 --with-apr-util=/opt/apr-util-1.6.1
make
make install

これで独立した2つのApacheをインストールすることができました。
最後にインストールしたディレクトリの所有者・グループをapacheに変更しておきましょう。

chown -R apache:apache /opt/httpd-2.4.41
chown -R apache:apache /opt/httpd-2.4.41-ex

IPアドレス・ポートの設定

ここからは、インストールした2つのApacheが使用するIP・ポートを設定します。
今回は以下のように、同じIPアドレス・別々のポートでアクセスするようにしました。

httpd-2.4.41
 ServerRoot:/opt/httpd-2.4.41
 IPアドレス:192.168.1.12
 ポート:80

httpd-2.4.41-ex
 ServerRoot:/opt/httpd-2.4.41-ex
 IPアドレス:192.168.1.12
 ポート:8080


まずは1つ目のインスタンスhttpd-2.4.41」の設定をするため、「/opt/httpd-2.4.41/conf/httpd.conf」をエディタで開きます。

ServerRootが「/opt/httpd-2.4.41」となっていることを確認。
f:id:J-back:20191123141325p:plain:w600


使用するIPとポートの指定部分で「Listen 192.168.1.12:80」と記述します。
f:id:J-back:20191123141540p:plain:w600


UserとGroupは「apache」を指定しておきましょう。
f:id:J-back:20191123141725p:plain:w600


DocumentRootが「/opt/httpd-2.4.41/htdocs」であることを確認します。
f:id:J-back:20191123141843p:plain:w600


ここまでできたら、「/opt/httpd-2.4.41/conf/httpd.conf」を保存して閉じます。

次に2つ目のインスタンスhttpd-2.4.41-ex」の設定ファイル「/opt/httpd-2.4.41-ex/conf/httpd.conf」を開き、
・ServerRootが「/opt/httpd-2.4.41-ex」となっていることを確認
・使用するIPとポートの指定部分で「Listen 192.168.1.12:8080」と記述
・UserとGroupは「apache」を指定
・DocumentRootが「/opt/httpd-2.4.41-ex/htdocs」であることを確認
を実施します。

Apacheをサービスに登録

インストールした2つのApacheをそれぞれ別のサービスとして登録しましょう。
まずは「/etc/systemd/system」に1つ目のインスタンス用として「httpd24.service」というファイルを作成し、中身を以下のように記述します。

[Unit]
Description=httpd24
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=forking
ExecStart=/opt/httpd-2.4.41/bin/apachectl -f /opt/httpd-2.4.41/conf/httpd.conf -k start
ExecReload=/opt/httpd-2.4.41/bin/apachectl -k graceful
ExecStop=/opt/httpd-2.4.41/bin/apachectl -k stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target


2つ目のインスタンスについても同様に「/etc/systemd/system」に「httpd24-ex.service」というファイルを作成し、中身を以下のように記述します。

[Unit]
Description=httpd24-ex
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=forking
ExecStart=/opt/httpd-2.4.41-ex/bin/apachectl -f /opt/httpd-2.4.41-ex/conf/httpd.conf -k start
ExecReload=/opt/httpd-2.4.41-ex/bin/apachectl -k graceful
ExecStop=/opt/httpd-2.4.41-ex/bin/apachectl -k stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

2つのインスタンスのファイルを用意できたら、起動してみましょう。

systemctl start httpd24

以下コマンドで起動できているか確認します。

systemctl status httpd24

f:id:J-back:20191123145904p:plain:w600

同様に、2つ目のインスタンスも起動しましょう。

systemctl start httpd24-ex

以下コマンドでプロセスを確認し、それぞれ起動していればOKです。

ps aux | grep httpd

f:id:J-back:20191123152759p:plain:w600

2つのインスタンスの動作確認

ブラウザを起動して「http://192.168.1.12」にアクセスすると、1つ目のインスタンスが応答しています。
f:id:J-back:20200320163541p:plain:w600

また、「http://192.168.1.12:8080」にアクセスすると、2つ目のインスタンスが応答します。
f:id:J-back:20200320163700p:plain:w600


しかし、この状態だと両方とも初期画面なので、それぞれのインスタンスが応答しているのか分かりずらいですね。
そこで、初期画面にインスタンスの番号を表示するように少し書き換えます。
1つ目のインスタンスの初期画面として表示されるのは「/opt/httpd-2.4.41/htdocs/index.html」なので、これを以下のように編集します。

<html>
    <body>
        <h1>It works!<br></h1>
        Instance1
    </body>
</html>

この状態で再び「http://192.168.1.12」にアクセスすると、以下のように「Instance1」と表示されていますね。
f:id:J-back:20200320173021p:plain:w600



また、2つ目のインスタンスの初期画面として表示されるのは「/opt/httpd-2.4.41-ex/htdocs/index.html」なので、これも以下のように編集します。

<html>
    <body>
        <h1>It works!<br></h1>
        Instance2
    </body>
</html>

こちらも編集後、「http://192.168.1.12:8080」にアクセスすると、「Instance2」が表示されています。
f:id:J-back:20200320173138p:plain:w600

Tomcatの複数起動について

Tomcatをインストールして複数起動させる方法についても以下の記事に記載しています。
www.77-lifework.com

最後に

以上で2つのApacheインスタンスをインストールし、起動させることができました。
最後までお読みいただき、ありがとうございました。