【VirtualBox】開発環境を作る – Apache編 【CentOS】

web

こんにちは、なかだ(@newNakata)です。

忘れた頃にやって来ます。
前回に引き続きですので、本稿のスタートは前回投稿した状態を指します。
是非前回の投稿【VirtualBox】開発環境を作る – OS編 【CentOS】も覗いてみてください。
この度扱うhttpd(apache)はパッケージインストール、ソースインストールのどちらも記載します。

構成

  • Virtual Box 6.1.16
  • CentOS(Linux)
  • Apache(HTTPD) ← 本稿はここ
  • MySQL(MariaDB)
  • PostgreSQL
  • PHP

準備

Virutal Boxを起動し、続いて仮想マシンを起動します。
以降はSSHクライアントのTera Tarmを使って作業を行います。
Tera Tarmを使ってログインしてください。

firewalldについて

ファイアーウォールとは
簡単に言うと、インターネットを通して侵入してくる不正アクセスから守るためのセキュリティシステムです。

「ん?」って思いますよね。僕もです。
ここではfirewalldが起動していた場合、設定しないと繋がらない(ブラウザに表示されない)もんだと思ってください。
以上を踏まえ、以前にVirtual Box側での設定も既にしてありますので本稿ではfirewalldは停止させ、以降は基本的に起動しないようにします。
これが立ち上がっている事によって、障害(ブラウザに表示されない等)の原因がどこにあるのかなどの判断が難しくなる時がある為です。
※停止せず設定する場合を本稿の最後の「その他」に載せています。

サービスが起動しているか確認します。

systemctl status

systemctlコマンドは簡単に説明するとサービスを管理するコマンドです。
(systemdがLinuxのシステムとサービスを管理するデーモン)

自動起動してちゃんと立ち上がっているので、止めます。

systemctl stop firewalld

先ほどのコマンドで確認するとfirewalldが消えていればOKです。
次に、次回の仮想マシン起動から以降、自動起動しない様にします。

systemctl disable firewalld

これで次回から起動しませんので、毎回毎回止める必要がなくなります。
前置きが長くなってしまったため、ポート設定する場合は本稿の最後に載せておきます。

それでは本題へ。

パッケージ、ソースインストールの違い

簡単に言うと、パッケージインストールは簡単だけど型にハマっており、ソースインストールは面倒(難しい)だけど自由、と言うイメージを持って貰えると良いかと思います。
どちらが良いのかと言うと、利用シーンに合わせてどちらでも良いと思います。
各環境(会社とか)でポリシーなどもあると思うので本当にケースバイケースです。

・パッケージインストール
 yumコマンドなどで手軽にインストールできる。
 依存関係のパッケージも自動でインストールしてくれる為、手間がかからない。
 レポジトリに無いパッケージはインストールできない。
 インストールオプションが指定できない。

・ソースインストール
 最新版を利用でき、インストールオプションも指定できる。
 インストールディレクトリを任意に決められるため、複数のバージョンを混在
 させることができる。
 インストールに必要な依存関係のパッケージも都度インストールする必要があ
 るため、インストールに時間がかかる。

Apache(httpd)とは

無償で利用できるオープンソースのWebサーバー(HTTPサーバー)ソフトウェアです。
ざっくり言うと、お使いのPCやスマホからwebブラウザを使ってホームページを閲覧させるために最初に必要になるものです。
ピンと来ない方への比喩は色々ありますが、最初はピンと来ないでいいのでとりあえずにっちもさっちもいるんだと思っていれば間違いありません。
余談ですがWebサーバーソフトウェアとしては他にNginx(エンジンエックス)などもあります。

パッケージインストール

パッケージインストールとは

前回の投稿でも少し触れましたが、yumコマンドを使用してのインストール方法を指します。
yumコマンドはCentOSが提供するリポジトリを見て(使って)パッケージを探しに行きます。

リポジトリとは
Linuxが必要なアプリケーションを見つけ出せる様にインターネット上のどこのサーバにアプリケーションが格納されているかを記載したファイルになります。

そう。ただのファイルです。
/etc/yum.repos.d 以下にそのファイルがあります。
リポジトリはその他にもEPELレポジトリやREMIレポジトリがあります。
CentOSが提供するリポジトリ以外はサードパーティ製のレポジトリとなり、CentOSのサポート対象外、つまり自己責任での使用となります。
自己責任と言うと「使ってはダメなんじゃ・・・」と思うかもしれませんが、何の問題もありません。

インストール作業

この度はCentOSが提供するリポジトリを使ってインストールします。

searchコマンドでhttpdパッケージがあるか確認します。

yum search httpd

パッケージが存在する様なので、インストールバージョンを確認してみます。

yum info httpd

この度のインストールバージョンはhttpd-2.4.6になります。

早速インストールしてみましょう。

yum install -y httpd

完了しました。
パッケージがインストールされたか確認してみましょう。

rpm -qa | grep httpd

パッケージインストール前に上記コマンドを入れてもhttpdは表示されません。
ただし、CentOSをインストールする時に選択するソフトウェアによっては最初から入っています。
【VirtualBox】開発環境を作る – OS編 【CentOS】の必要最低限の設定(3箇所)に関連情報があります。

では早速起動してみましょう。

systemctl start httpd

このコマンド入力よるレスポンスの表示はありませんので以下のコマンドで起動確認します。

systemctl status

起動が確認できました。
パッケージインストールなので自動でapacheユーザー追加、/var以下にwww/htmlディレクトリ作成などの処理も行われています。
余談ですが、httpdパッケージをアンインストールした場合、www/htmlディレクトリは一緒に削除されますが、apacheユーザーはそのまま残ったりなど、完全に消すには手動で削除する必要があります。

ブラウザからアクセスしてみましょう。
本稿の環境の現時点では

http://192.168.56.102

になります。
以下が表示されれば正しく動作しています。

次回以降、仮想マシンを立ち上げた時にhttpdも自動で立ち上がる様にします。

systemctl enable httpd

systemdに反映されているか確認してみましょう。

systemctl list-unit-files | grep httpd

|(パイプ)で接続してhttpdと言う文字をgrep(指定した文字列を検索する時に使用するコマンド)で指定と言う意味です。

enableになっているため、次回から自動でhttpdが起動されます。

パッケージインストールは以上となります。

ソースインストール

ソースインストールとは

任意のサイトより任意のバージョンのソース群(zipやtar.gzなど)をPCにダウンロードまたはサーバ内に取得します。
apacheをインストールする際に依存関係にあるパッケージについては事前にインストールしておく必要があります。
configure、make、make installの順にインストール作業を手動で行います。
configure時にオプションも任意で選択でき、インストールパスも指定できます。

OSインストール時の環境などによっても前後の作業が異なって来る為、本稿ではあくまでも前回投稿した内容の状態でのインストールになります。

インストール作業

まず、httpdインストール前の前準備として以下のパッケージをインストールします。

yum install -y wget pcre-devel expat-devel openssl-devel

・wget
 指定したURLのファイルをダウンロードする為に使います。
・pcre-devel
 これが無いとhttpdのcofigure時にエラーが出ます。
・expat-devel
 これが無いとapr-utilイストール時にエラーが出ます。
・openssl-devel
 後述するconfigureオプションで指定したmod_sslを使用するために必要になります。

続いてhttpdとapr(apacheのライブラリセット)をダウンロードします。
赤枠のURLをコピーし、wgetコマンドを使用しサーバ内にダウンロードします。
ダウンロードするディレクトリは慣例的に/usr/local/srcを指定していますが、任意で構いません。
aprについてはhttpdをインストールする時に必要なんだな程度で大丈夫です。

APR、APR-util

cd /usr/local/src
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.7.0.tar.gz
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.6.1.tar.gz

cdで移動し、wgetコマンドでコピーしたURLからファイルをダウンロードします。

HTTPD

cd /usr/local/src
wget https://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.48.tar.gz

こちらも上記aprの時同様、cdで移動し、コピーしたURLからhttpdファイルをダウンロードします。

これでtar.gzファイルが3ファイルダウンロードされました。
次にtarコマンドを使ってtar.gzファイルを解凍します。

tar xzvf apr-1.7.0.tar.gz
tar xzvf apr-util-1.6.1.tar.gz
tar xzvf httpd-2.4.48.tar.gz

解凍後のファイル一覧が表示され解凍が完了します。
解凍後は以下の様に.tar.gzが無い各ディレクトリが作成されます。

aprはhttpdに内包する形でhttpdをインストールしたいと思います。
解凍したapr、apr-utilディレクトリをhttpdのsrclibの下にリネームした状態でmvコマンドを使って移動させます。

mv apr-1.7.0 httpd-2.4.48/srclib/apr
mv apr-util-1.6.1 httpd-2.4.48/srclib/apr-util

次にhttpdディレクトリに移動しcofigure、make、make intallを行いますが、その前に簡単に解説します。

・configure
 configureはコマンドでなく、configureというスクリプトファイルを実行します。
 実行する事でインストールに必要な環境変数やライブラリが正しく設定、設置され
 ているかなどがチェックされ、結果MakeFileが作成されます。
 このconfigureを実行する時に各オプションの指定も行います。

・make
 configureで作成されたMakeFileに基づいてコンパイルが行われます。
 こちらはコマンドで、オプション、引数無しで実行します。
 主にビルドを行います。

・make install
 makeコマンドでコンパイルされたアプリケーションのインストールを行います。
 makeで作成したファイル群をディレクトリにコピーします。

上記を行う事で画面に色々処理が流れます。
本稿の通り行っても環境によってはエラーが出るかもしれません。
色々処理を行ってよくわからなくなった場合はさっさとディレクトリを削除し、tar.gzの解凍からやり直してください。
configure、makeコマンドを実行してもファイルがhttpdの外に出る事はありません。

ではhttpdに移動しconfigureを流しましょう。
この度は以下の通りconfigureオプションを指定します。

cd httpd-2.4.48
"./configure" \
"--prefix=/usr/local/apache" \
"--disable-include" \
"--disable-filter" \
"--disable-charset-lite" \
"--disable-version" \
"--disable-asis" \
"--disable-cgid" \
"--disable-cgi" \
"--disable-negotiation" \
"--disable-actions" \
"--enable-userdir" \
"--enable-ssl" \
"--enable-rewrite" \
"--with-included-apr" \
"--enable-so" \
"--with-mpm=prefork" \
"$@"

経験上、上記オプションで大体の開発には事足ります。
各オプションの説明は長くなるのでここでは割愛します。
注目は–prefix=/user/local/apacheの箇所で、make installされたhttpdはapacheと言うディレクトリで/usr/localに作成されます。
理由は次回投稿で詳しく解説します。

特にエラー表示もなく、上記の感じで処理が止まったら完了です。
続いてmakeコマンドを実行します。

make

makeはconfigureに比べると処理が長くかかります。
特にエラーも無く、上記の感じで処理が止まれば完了です。
続いてmake installコマンドを実行します。

make install

makeと何が違うのかこれだけではわかりませんが、上記のような感じで処理が止まれば完了(=インストール完了)となります。
cofigureオプションで設定した/usr/local以下にapacheディレクトリが作成されています。
では早速起動と言いたいところですが、未だに起動スクリプト(systemdサービスファイル)がhttpdソース群に用意されていないため、起動スクリプトを作成します。

vi /etc/systemd/system/httpd.service

viコマンドはLinuxに標準で入っているテキストエディタです。
上記コマンドはviで/etc/systemd/system以下のhttpd.serviceファイルを編集(指定のファイルが無ければ新規作成)と言う意味です。
この度は/etc/systemd/system以下にhttpd.serviceファイルは無いため、何も表示されない状態で開きます。
その状態で iキー を押下するとinsertモードになります。

insertモードの状態で以下を張り付けてください。
TeraTarmであれば右クリックで張り付けてくれます。

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
EnvironmentFile=/usr/local/apache/conf/httpd.conf
ExecStart=/usr/local/apache/bin/apachectl -k start
ExecReload=/usr/local/apache/bin/apachectl -k graceful
ExecStop=/usr/local/apache/bin/apachectl -k stop
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

貼り付けた後で Escキー を押下します。
insertモードが消え(解除)ます。
この状態で :wq と入力し、エンターを押下します。
:でコマンドを受け付け、wで書き込み、qでvi終了と言う意味です。

次に、上記で作成したサービスファイルをsystemd(サービス管理デーモン)に反映させます。

systemctl daemon-reload

systemdに反映されているか確認してみましょう。

systemctl list-unit-files | grep httpd

|(パイプ)で接続してhttpdと言う文字をgrep(指定した文字列を検索する時に使用するコマンド)で指定と言う意味です。

httpd.serviceが表示されれば反映されています。
ちなみに先ほどのパイプ以降を削除してコマンドを実行するとsystemdに登録されているサービスの一覧が表示されます。
では起動してみましょう。

systemctl start httpd

このコマンド入力よるレスポンスの表示はありませんので以下のコマンドで起動確認します。

systemctl status

起動が確認できました。
ブラウザからアクセスしてみましょう。
本稿の環境の現時点では

http://192.168.56.102

になります。

次回以降、仮想マシンを立ち上げた時にhttpdも自動で立ち上がる様にします。

systemctl enable httpd

systemdに登録されているか確認した時(この時はdisabled)と同じコマンドで、以下の様にenabledになっていれば自動起動の設定完了です。

ソースインストールは以上となります。

まとめ

本稿はここまでとなります。
apacheのインストールもそれほど難しくなく用意できるなと思って貰えれば嬉しいです。
これでhtml、css、javascriptはサーバにソースを置いて実行する事が可能になりました。

パッケージインストールとソースインストールどちらも読んでいただいた方はpathや表示の違いがあるのがわかると思います。
次回はその解説をしながら初期apache設定+αを載せたいと考えています。

その他

firewalld設定

ファイアウォールが起動された状態でhttpdの初期ページなどをブラウザから閲覧すると以下の様にでるかと思います。

CentOS7からこのfirewalldが実装されたのですが、firewalldにはゾーンと言う概念(カテゴリとテンプレートのように思って貰えれば大丈夫かと思います)があり、9種類のゾーンが存在しています。
本稿では各ゾーンの詳細説明は割愛します。

現状の設定確認を見ます。

firewall-cmd --list-all

現在publicゾーンが設定されています。
初期設定で設定されるのがこのpublicゾーンなのですが、初期設定ゾーンの確認は下記のコマンドでおこなえます。

firewall-cmd --get-default-zone

publicゾーンはenp0s3とenp0s8に当てられており、dhcpv6-clientとsshのサービスのみ許可されています。
セキュリティシステム全般の考え方として基本的には全て拒否、必要に応じて任意で許可をしなければいけない、のが一般的です。
設定を見る限りポートが開いていないためhttp(80/tcp)と本稿では設定していませんがhttps(443/tcp)ポートを開けます。

以下がコマンドですが、1行ずつ流すと画像の様になります。
–permanentオプションを付ける事で恒久的な設定となります。
恒久的設定の場合は反映に再読み込みが必要なため、reloadを行います。

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

上記コマンドを流した後で最初に確認で流した–list-allコマンドで確認します。

80番ポートと443番ポートが開きました。
ブラウザで表示できなかったhttpの初期ページをリロードしてみてください。
表示されると思います。

参考サイト