【VirtualBox】開発環境を作る – Apache設定編 【CentOS】
こんにちは、なかだ(@newNakata)です。
前回(【VirtualBox】開発環境を作る – Apache編 【CentOS】)に引き続き、最低限のapacheの初期設定を踏まえつつ、パッケージインストールとソースインストールの差を解説します。
本稿では少々面倒かもしれませんが、基本的にコマンドは使わず必要なファイルを直接編集していきます。
何故かは準備の項目を是非読んでもらえると嬉しいです。
目次
構成
Virtual Box 6.1.16CentOS(Linux)- Apache(HTTPD) ← 本稿はまだここ
- MySQL(MariaDB)
- PostgreSQL
- PHP
準備
※この作業は必須ではありませんので不要な場合は読み飛ばしてください。
設定の最初の投稿になるため、まず最初にrcsをインストールします。
RCSについて
初期のバージョン(ファイルの差分)管理システムの1つで、かなり古くからあります。
1ファイルずつ操作を行い、複数のユーザーが同時に同じファイルを操作する事は想定していません。
(運用ルールで -l を必ず付けるなどである程度は回避できるかと思います)
本稿は個人の環境なため、共有サーバでの運用は考えていません。
ですが、サーバ内にゴミ(日付付き同名ファイルなど、例えばhttp.conf_2021xxxx)を置かない様にする事はとても大切です。
そして最も大切なのはコミットログとコメントを残す事です。
コミット時のコメントは後で見返す時に何を行ったのかがわかるものにしていけば、上記の日付付き同名ファイルを残す必要もありません。
もちろん、過去にコミットした状態との差分比較やファイルを取り出す事もできます。
確認とインストール
rpmコマンドで確認を行い既にパッケージがインストールされている場合は不要です。
rpm -qa | grep rcs
インストールされていない場合はインストールします。
yum install -y rcs

簡単な使い方
今回は/etcの下にあるhostsファイルを対象に解説します。
一通りコマンドの流れは以下の通りです。
cd /etc
mkdir RCS
rlog hosts
ci -u hosts
co -l hosts
vi hosts
ci -u hosts
rcsdiff -u -r1.1 -1.2 hosts
1行目
etcディレクトリへ移動します。
2行目
RCSディレクトリを作成します。
既に作成済の場合は2行目は不要です。
以降の作業を行った後でこのディレクトリを見て頂ければわかると思いますが、このディレクトリにRCS管理ファイルが作成されます。
3行目
RCSファイルのログメッセージ他、関連情報の表示コマンドです。
RCSで管理されているか確認します。

hostsファイルはRCSで管理されていないファイルでした。
4行目
ファイルをロックせず(-u)にチェックインコマンド(ci)によってrcsに登録します。
コミットメッセージ入力(>>)になるため、適切なメッセージ(今回はinitial commit)を入力します。
表示内容の通り .(ピリオド) を入力し、完了します。

ちなみにRCS管理されていた場合で3行目を再度入力すると以下の様に表示されます。

headの部分がリビジョンで、今は1.1です。
コミットが繰り返されるとこれが増えていきます。
descriptionがコミットメッセージになります。
5行目
RCS管理されているファイルを他ユーザーに操作させないためにロック状態(-l)でチェックアウト(co)します。
rlogコマンドで確認するとlocksの下にロック中のユーザーとリビジョンが表示されます。

6行目
viコマンド(【VirtualBox】開発環境を作る – Apache編 【CentOS】のインストール作業項目の最後の方)を使って何かしら変更を加えます。
7行目
4行目同様にアンロック状態でファイルをチェックインします。
アンロックチェックインは複数人で管理する場合、誰が変更を行うかわからないためのエチケットのようなものです。
ちなみに、一人で管理しているとこの最後のチェックインを放置する傾向があるので、最後はチェックインで終わる事を心掛けると後々の手間が無くなります。
変更が加えられた状態でチェックインを行ったため、headのリビジョンも更新されました。
rlogコマンドで確認してみてください。
8行目
更新される前と後での更新箇所比較になります。
RCS管理のファイルを比較コマンド(rcsdiff)で表示します。
unified 出力形式(-u)オプションは好きずきなので無くてもいいですが、僕は>(<)表記よりも+(-)表記の方が好きです。
diffの基本は比較元の古いファイル(今回では-r1.1)が左、比較したい新しいファイル(今回では-r1.2)が右ですので、hostsファイルのリビジョン1.1状態のファイルを元に、1.2で何が変更(今回は+なので追加)されたかが確認できます。

前置きが長くなってしまいましたが、RCSについてはここでは以上です。
RCSを不要とする方もいらっしゃると思うので、以降は直接は記載しませんが、基本的に変更するファイルはRCSで管理すると思って貰えれば嬉しいです。
では早速apacheの設定に行ってみましょう。
apache GroupとUserについて
パッケージインストール | 〇 |
ソースインストール | ✕ |
上記通り、パッケージインストールでは自動で作成されているますが、ソースインストールではされていません。
よってこの項目ではパッケージインストールを元に、ソースインストール時の作業を記載します。
GroupとUserとは
本稿関連ではrootユーザーしかありませんので、基本的には全ての権限があり何でも行えます。
この「どのユーザー(の権限)は何ができるか」を効率よく管理するためにGroupが使用されます。
簡単に言うと、今後開発の時に沢山出て来る「permission denied」はほぼこの権限が関係しています。
apache groupの追加
groupの管理ファイルは /etc 以下にあるgroupファイルになります。
どのようなgroupがあるのかもこのファイルを閲覧する事で確認できます。
viコマンドでgroupファイルを開き、以下を最下段に追加してください。
apache:x:48:
書式は以下の通りです。
第1フィールド:第2フィールド:第3フィールド:第4フィールド
第1フィールド → グループ名
第2フィールド → 暗号化されたパスワードもしくはx(文字)
第3フィールド → 一意のグループID(GID)
第4フィールド → サブグループユーザーアカウント
第2フィールドの x は文字列でOK、第3フィールドのGIDも48でOKですので、あのまま張り付けて貰って大丈夫です。
本稿では割愛しますが、グループに新しくコマンドでユーザーを追加する時パスワード入力を必要とする場合はgpasswdコマンドでグループパスワードを設定してください。
上記コマンドで設定された情報は/etc/gshadowファイルにあります。
以上で終了です。
つまり、1行追加するだけです。
apache userの追加
Linuxのユーザー管理ファイルは /etc 以下にあるpasswdファイルになります。
どのようなユーザーがあるのかもこのファイルを閲覧する事で確認できます。
viコマンドでpasswdファイルを開くか vipw と入力するだけでpasswdファイルがviで開かれます。
以下を最下段に追加してください。
apache:x:48:48:Apache:/usr/local/apache:/sbin/nologin
書式は以下の通りです。
第1フィールド:第2フィールド:第3フィールド:第4フィールド:第5フィールド:第6フィールド:第7フィールド
第1フィールド → ユーザー(ログイン)名
第2フィールド → 暗号化されたパスワードもしくはx(文字)
第3フィールド → 一意のユーザーID(UID)
第4フィールド → グループID(GID)
第5フィールド → コメント(名前など)
第6フィールド → ホームディレクトリのパス
第7フィールド → ログイン シェル
長いわ。
第2フィールドの x は文字列でOK、第3フィールドのUIDも48(GIDと同じ)でOKです。
第4フィールドは存在しない一意のIDでも設定は可能ですが意味はありませんので存在するGIDを指定します。
第6フィールドのホームディレクトリはインストール時のパスになります。
第7フィールドですが、ログインを想定しないユーザーには慣例的に /sbin/nologin と記載します。
つまり、apacheユーザーはユーザーとして設定してもログインを行って何か作業を行うユーザーでは無い想定(実際にはログインしたい時もあるにはあるのですが基本は無い)と言う事です。
ログインしないため設定不要なので割愛しますが、パスワードは passwdコマンド か vipw -s と入力するとpasswdコマンドと同じ挙動をします。
上記コマンドで設定された情報は/etc/shadowファイルにあります。
以上で終了です。
つまり、ユーザーも1行追加するだけです。
DocumentRootについて
パッケージインストール | /var/www/html |
ソースインストール | /usr/local/apache/htdocs |
上記の通り、パッケージインストールとソースインストールではpathが違います。
パッケージインストールの /var 以下の www/html ディレクトリはインストール時に作成されます。
僕の経験上インストール方法が違ってもweb公開ディレクトリは /var/www の下が使われます。
ドキュメントルートとは
webサーバで公開するコンテンツを配置するディレクトリになります。
apacheの設定ファイルhttpd.confは同じですが、インストール別でパスが異なります。
パッケージインストール | /etc/httpd/conf |
ソースインストール | /usr/local/apache/conf |
インストール別で初期ページの見え方が違うのは?
パッケージインストールの場合
httpd.confの最下段に以下の設定があります。
# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf
これは /etc/httpd 以下にある conf.d ディレクトリ以下にある拡張子が .conf のファイルも設定として読み込むという設定になります。
結論からお伝えすると conf.d/welcom.conf にある設定で /var/www/html にコンテンツ(index.htmlなど)が無い場合は noindex.html を表示しろと設定があります。
noindex.html の実態は /usr/share/httpd/noindex/index.html にエイリアス(windowsで言うショートカットのイメージで大丈夫です)が張られているため、表示されるコンテンツは上記パスの index.html が表示されます。
ですので /var/www/html 以下にindex.htmlを作成して置けば、置いたコンテンツが表示されます。
/usr/share/hhttpd ディレクトリはパッケージインストール時に作成されます。
ソースインストールの場合
こちらもhttpd.confの最下段の方に設定があります。
# Supplemental configuration
#
# The configuration files in the conf/extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server, or you may simply copy their contents here and change as
# necessary.
# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf
# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf
# Language settings
#Include conf/extra/httpd-languages.conf
# User home directories
#Include conf/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include conf/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf
# Various default settings
#Include conf/extra/httpd-default.conf
実際は改行されていますが、全てコメントアウトされているのがわかります。
つまり、ソースインストールの場合、最初に記載した /usr/local/apache/htdocs 以下の index.html がそのまま表示(It works!)されます。
ソースインストールの設定をパッケージインストールに合わせる
最初に www/html ディレクトリを作成します。
mkdir /var/www
mkdir /var/www/html
次に httpd.conf を編集します。
User daemon
Group daemon
↓へ変更
User apache
Group apache
DocumentRoot "/usr/local/apache/htdocs"
↓へ変更
DocumentRoot "/var/www/html"
<Directory "/usr/local/apache/htdocs">
↓へ変更
<Directory "/var/www/html">
User、Groupは先に記載した通りですので apache を当てました。
権限を厳格に設定する必要がなければ daemon でもいいですが、慣習的にはちゃんと変えた方が後々便利です。
最後に設定を反映するため再起動します・・・と言っても restart は無いため、以下の通り行います。
systemctl stop httpd
systemctl start httpd
これで document root が /var/www/html に変更されました。
/var/www/html 以下に index.html を設置してアクセスしてみてください。
設置したコンテンツが表示されます。
ちなみに、index.html を設置しない時のdirectory index の説明はこの度は割愛します。
ログ関係について
何かが起こった時に最初に調べに行くところ。そうログファイルならね。
apacheには access_log と error_log の出力設定がされています。
インストール時のログ出力は以下になります。
パッケージインストール | /etc/httpd/logs -> ../../var/log/httpd |
ソースインストール | /usr/local/apache/logs |
パッケージインストールの表記が少々分かり辛いですが /var/log/httpd から /etc/httpd/logs にシンボリックリンクが張られている・・・つまり実態は /var/log/httpd 以下にあると言う事です。
apacheだけではなく、Linuxの色々なログは基本的に /var/log 以下に集められています。
パッケージインストールはインストール時に /var/log 以下に httpd ディレクトリを作成し上記のpathにシンボリックリンクを張ります。
ソースインストールの場合はそれが無く、純粋にインストールパスの logs にログが出力されます。
ソースインストールの設定をパッケージインストールに寄せる
寄せる?寄せる。
ログ関係はやはり /var/log 以下を無意識で見に行きます。
apache だけ違うのも少々面倒ですのでパッケージインストールと一緒に・・・したくないんです。
理由としてソースインストールの場合 apache の起動に必要な httpd.pid も logs の下に配置されています。
気にならないのであればパッケージインストールと同じ様にシンボリックリンクを張っておしましですが、今回はソースインストールの logs はそのままで /var/log の下に httpd ディレクトリを作成し、初期設定へのアクセスは logs のログへ、virtual host(※後述) の設定は /var/log/httpd へログを吐く様に準備します。
mkdir /var/log/httpd
logrotate設定
logrotateとは
ログファイルのローテーションを行う設定。
基本的にはログファイルを別名(_日付)でバックアップ(世代って言います)し、古くなった世代から削除していきます。
ログは何も設定しないと1ファイルに書き続け、肥大化し、気づいたら容量100%(今はもう無いとは思いますが)になってサーバが遅くなったり、最悪止まるまであります。
パッケージインストールでは設定されていますが、ソースインストールではされていませんので設定していきます。
最初に、おそらく大体どのインストール方法でも入っているとは思いますが、logrotateパッケージがインストールされていないと動きません。
以下のコマンドで確認します。
rpm -qa|grep logrotate

パッケージが表示されない場合は yum でインストールしてください。
yum install -y logrotate
次に、設定ファイルを作成します。
vi /etc/logrotate.d/httpd
vi コマンドで /etc/logrotate.d 以下に httpd ファイルを新規作成(存在しないため)します。
次に以下の内容を張り付けて保存(:wq)してください。
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
これはパッケージインストールの内容と同じになります。
設定内容は以下の通りです。
/var/log/httpd/*log | ローテーションするファイルを指定(最後に log が付くファイルの意味) |
missingok | ログファイルが無くてもエラーにならない |
notifempty | ログファイルが空の場合、ローテーションしない |
sharedscripts | /var/log/httpd/*log に該当するファイルが複数存在してもpostrotate~endscriptまでの実行は1回のみ |
delaycompress | 1世代目以降のファイルが圧縮されます。 が、基本設定(下記その他参照)でコメントアウトしてあるため動作しませんので、無くても構いません。 |
postrotate | endscriptまでのコマンドをローテーション後に実行 |
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true | httpdのリロード(再読み込み)を行う。 |
その他
設定は以上ですが、その他関連情報を記載します。
ログローテートの基本設定は /etc/logrotate.conf にありますので抜粋します。
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
設定内容は以下の通りです。
weekly | ログローテートを毎週行います。 |
rotate 4 | ログローテートは4世代分(以降は削除)作成します。 |
create | ログローテートした後に新しいログファイルを作成します。 (上記 postrotate 設定でapacheがリロードされるタイミング) |
dateext | ログローテートしたファイルの後ろに日付を付与します。 |
compress | ログローテートしたフィルを圧縮する設定ですが、コメントアウトされているため動作しません。 上記の delaycompress と合わせて使用します。 |
include /etc/logrotate.d | /etc/logrotate.d 以下のファイルも設定として読み込みます。 これがあるため、先ほど作成した httpd ファイルの設定が生きることになります。 |
最後に logrotate は /etc/cron.daily 以下に実行ファイルがあります。
つまり毎日実行されます(上記の設定でローテーションは各週)。
実行タイミングは /etc/anacrontab に記載されています。
詳しくは割愛しますが、3:11~3:50の間に実行されます。
virtual host設定
バーチャルホストとは
1台のサーバで複数のドメインを運用するための技術です。
はい・・・。
ドメインとは名前です。
yahoo.co.jpもgoogle.comもドメイン(名前)です。
大規模なサービスは逆になりがちですが、1台のサーバで複数のサービスを動かせればコストを抑えられます(サーバの用意、設定、運用コストなどなど)。
複雑なので色々割愛しますが、基本的に1サーバに対して1つのIPアドレスが割り当てられています。
このIPアドレスを1つのサービスにあてると、同じサーバで別のサービスを展開できなくなります。
その場合、上記の様に別のサーバを用意するしか方法がなくなりコストが膨らむ一方です。
これを解決するのがバーチャルホストの設定です。
ドメイン名には必ずIPアドレスが割り当てられています。
これも長くなるので割愛しますが、DNS(Domain Name System)が名前解決をしてくれるシステムで、あるドメインにアクセスすると、DNSを介して設定されたIPアドレスが設定されているサーバへアクセスしてくれる、と言う物です。
よく localhost でアクセス例を見るけど?と思われるかもしれません。
localhost でアクセスしたい場合は windows 自体に環境を作成(XAMPPなど)した場合の話です。
本稿はあくまでも virtual box を使って仮想サーバを立てている状態で、仮想サーバは独自のIPアドレス(本稿の場合だと192.168.56.102)を持っています(【VirtualBox】開発環境を作る – OS編 【CentOS】5 Virtual Boxの設定に関連情報があります)。
長くなりましたが、ドメイン名でサイトにアクセスできる様にしていきましょう。
hostsファイルの設定(windows)
上記で少しDNSの話をしましたが、これと同じ様な設定ができるファイルがhostsファイルです。
バーチャルホストの設定はこのhostsファイルの設定と対なので必ず必要です。
windowdsでは以下にあります(macの場合はちょっとわからないです・・・ごめんなさい)。
C:\Windows\System32\drivers\etc\hosts
ただこのhostsファイル、編集するには管理者権限が必要です。
毎回このpathまで行ってファイルを右クリックして管理者権限で開くのは面倒なので、windowsのタスクバーにある虫眼鏡ボタンをクリックして表示される検索入力項目や、コマンドプロンプト、ファイル名を指定して実行などから以下のコマンドを入力(コピペ)してください。
powershell -NoProfile -ExecutionPolicy unrestricted -Command "start notepad C:\Windows\System32\drivers\etc\hosts -verb runas"
後は「はい」を押下するとhostsファイルが管理者権限で開かれます。
ドメイン名は各々が好きなもので大丈夫ですので、決まったらIPアドレスと一緒に追記してください。
本稿では以下の様に追記します。
192.168.56.102 nakadalog.local
vhosts設定
最後にLinux側の設定を行っていきますが、説明の最初に追加するのは以下の記述です。
パッケージインストール、ソースインストールともに以下の記述でならOKです。
<VirtualHost *:80>
ServerName nakadalog.local
DocumentRoot /var/www/nakadalog
ErrorLog /var/log/httpd/nakadalog.local-error_log
SetEnvIf Request_URI "\.(gif)|(jpeg)|(jpg)|(png)|(ico)$" no_log
CustomLog /var/log/httpd/nakadalog.local-access_log combined env=!no_log
<Directory "/var/www/nakadalog">
AllowOverride FileInfo AuthConfig Limit Options
Options -Indexes +ExecCGI +FollowSymLinks
Require all granted
</Directory>
</VirtualHost>
簡単な説明は以下の通りです。
ServerName | windowsのhostsに設定したドメイン名です。 |
DocumentRoot | 敢えて /var/www 以下に 新たに nakadalog ディレクトリを指定しています。 |
ErrorLog | 直接 /var/log/httpd を指定し、追加したドメインのログだとわかる様にファイル名を付けています。 |
SetEnvIf | 以下の CustomLog の条件で 画像系のログを出さないと言うものです。 |
CustomLog | こちらも 直接 /var/log/httpd を指定し、上記の設定に順次(カスタムし)た access_log を出力します。 |
Directory “/var/www/nakadalog” | /var/www/nakadalog ディレクトリ以下の各種設定です。 AllowOverride と Options の設定は無くても大丈夫なので割愛します。 Require は後述します。 |
折角新しく作るので初期設定の /var/www/html ではなく、/var/www の下に新しくディレクトリを作る事にします。
mkdir /var/www/nakadalog
次にどこに書くかですが、ぶっちゃけ httpd.conf にそのまま追加したら動くのですが、一般的(?)な方法を解説します。
パッケージインストールの場合
httpd.conf で最初から IncludeOptional conf.d/*.conf の設定が生かされています。
なので、上記の設定通り、conf.d の下に~(名前は何でも可).conf ファイルを作成します。
mkdir /etc/httpd/conf.d/vhost.conf
作成した vhost.conf に設定を記載すればOKです。
ソースインストールの場合
上記「DocumentRootについて」でも記載しましたが httpd.conf で現在はコメントアウトされている為、まずはコメントを外します。
vi /usr/local/apache/conf/httpd.conf
↓
# Virtual hosts
Include conf/extra/httpd-vhosts.conf ← この行のコメント削除
httpd-vhosts.conf ファイルでは最初から設定が2つほど記載されていますが、不要なので削除またはコメントアウトし、上記の設定を記載してください。
requireについて
今回の設定であえて付けた以下の設定があります。
<Directory "/var/www/nakadalog">
AllowOverride FileInfo AuthConfig Limit Options ← 無くてもいい
Options -Indexes +ExecCGI +FollowSymLinks ← 無くてもいい
Require all granted ← これ
</Directory>
Requireディレクティブはアクセス制限の設定です。
all granted は「全て許可」で all granted が「全て拒否」になります。
パッケージインストールとソースインストールのhttpd.confの違いとして以下があります。
両方ある
↓
<Directory />
AllowOverride none
Require all denied
</Directory>
パッケージインストールのみにある
↓
#
# Relax access to content within /var/www.
#
<Directory "/var/www">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
つまり、ルートディレクトリは全て拒否なのですが、パッケージインストールではきっちり /var/www 以下だったら全て許可の設定になっています。
/var/www 以下に敢えてディレクトリを作成したのはこれを言いたかったのですが、初期設定ではパッケージインストールでは無くてもOKで、ソースインストールでは無いとアクセスできない状況です。
ですのでバーチャルホストの設定にrequire を記載しておけば、httpd.conf の設定を気にせず設定が行えると言うことになります。
と言っても、ルートディレクトリに require all granted をあてても問題なければそれが一番手っ取り早いです。
以上でバーチャルホストの設定は完了です。
apacheを再起動して設定を反映してください。
ブラウザから設定したドメインを指定してアクセスできると思います。
ソースインストールの最大のメリット
と思っている事を書きます。
前回の投稿でインストールpath(configure)を以下にしました。
"--prefix=/usr/local/apache" \
ソースインストールの起動ファイルのpathなどは全てここになっているかと思います。
これを以下の様に変更します。
cd /usr/loca
mv apache httpd-2.4.48
ln -s httpd-2.4.48 apache
パッケージインストールのログと同じ要領です。
apache ディレクトリを一旦mvコマンドでリネームし、シンボリックリンクを張り直します。
次に、例えばhttpd-2.2系をソースインストールした場合、シンボリックリンクを張り替えるでけでいつでも別バージョンに切り替える事が可能です。
先の事はわかりませんが、httpd-3系が出た場合、世のサービスはまだほぼ2.4系です。
その時に同じサーバで違うバージョンを手軽に試す事ができるのがソースインストールの最大のメリットだと僕は思っています。
まとめ
本稿はここまでになります。
説明が多くやる事がパッとわからないですね・・・。
RCSは最初だけで端折っていますが、経験上これを1回ちゃんとやっておけば別のサーバに移った時でも自分の作業環境ログ(RCSディレクトリをfindコマンドで検索すればどこを編集しているのか秒でわかる)を見るだけで解決できます。
さて、apacheの設定についてはまだまだ色々ありますが、基本的には本稿の内容でパッケージインストールとソースインストールの大きな違いはなくなったかと思います。
次回はMySQLについて記載して行きたいと思います。