Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@hana_shin

Apacheディレクティブの使い方

More than 1 year has passed since last update.

1 ディレクティブとは?

Apache Webサーバは起動すると、設定ファイル(httpd.conf)を読み、
そこに記述されているディレクティブに従って動作します。
つまり、ディレクティブとは、Apache Webサーバに対するコマンドのことです。
ここでは、いくつかディレクティブの動作確認をしてみます。

2 環境

VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンの版数は以下のとりです。

CentOSの版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
カーネル版数
[root@server ~]# uname -r
3.10.0-957.el

3 事前準備

3.1 インストール方法

Apatcheをインストールします。

パッケージのインストール
[root@server ~]# yum -y install httpd

Apacheの版数を確認します。Apache2.4系であることがわかります。

版数の確認
[root@server ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr  2 2020 13:13:23

3.2 Apache動作確認

ブラウザからApacheにアクセスしてみます。
redirect4.png

4 Redirect

リクエストを他のサーバに転送するディレクティブです。
ここでは、自ホストの/kanteiにアクセスすると、首相官邸のHPにリダイレクトする
ようにRedirectを設定してみます。

テスト用ディレクトリの作成
[root@server ~]# mkdir /kantei

/etc/httpd/conf.d配下にtest.confという名前のファイルを作成します。
拡張子はconf、ファイル名は任意の名前で構いません。

定義ファイルの作成
[root@server ~]# cat /etc/httpd/conf.d/test.conf
Redirect /kantei https://www.kantei.go.jp/

httpdを再起動します。

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

ブラウザのアドレスバーに、http://192.168.3.10/kanteiと入力します。
redirect1.png

/kanteiにアクセスすると、首相官邸のHPにリダイレクトされたことがわかります。
redirect2.png

5 Alias

DocumentRoot配下に存在しないファイルにアクセスするためのディレクティブです。
デフォルトは、DocumentRootは/var/www/htmlです。
ここでは、/usr/share/doc/へのアクセスを確認してみます。

定義ファイルの作成
[root@server ~]# cat /etc/httpd/conf.d/test.conf
Alias /doc/ "/usr/share/doc/"

<Directory "/usr/share/doc">
  Require all granted
</Directory>

httpdを再起動します。

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

/usr/share/doc/配下に、下記ファイル(guide.html)があります。
ブラウザで、下記ファイルにアクセスしてみます。

アクセスするファイルの確認
[root@server ~]# ls -l /usr/share/doc/openldap-servers-2.4.44/guide.html
-rw-r--r--. 1 root root 653501  2月  6  2016 /usr/share/doc/openldap-servers-2.4.44/guide.html

redirect3.png

6 NameVirtualHost

バーチャルホストとは、1台のホストで複数のWebサーバを提供する機能です。
以下の2方式があります。

方式 概要 備考
IPベース ホストに複数のIPアドレスを設定し、各IPアドレスにWebサーバを1つ立てる方式
名前ベース 1つのIPアドレスに複数のWebサーバを立てる方式 NameVirtualHostを使う

ここでは、NameVirtualHostを使って、名前ベースのバーチャルホストを試してみます。

6.1 構成

NameVirtualHost機能は、以下の構成で確認をしました。
バーチャルホストは、サーバで起動します。

構成
             192.168.3.0/24
client ------------------------ server 
     .20                      .10

6.2 クライアント側の設定

DNSの準備をすると大変なので、かわりにhostsファイルで名前解決をします。

[root@client ~]# cat /etc/hosts
192.168.3.10 www.test1.com
192.168.3.10 www.test2.com

6.3 サーバ側の設定

各Webサーバ用に、DocumentRootで指定するディレクトリを作成します。

ディレクトリ作成
[root@server ~]# mkdir -p /var/www/test1/html
[root@server ~]# mkdir -p /var/www/test2/html

DocumentRoot内に格納するファイルを作成します。

テスト用ファイル作成
[root@server ~]# echo test1 > /var/www/test1/html/index.html
[root@server ~]# echo test2 > /var/www/test2/html/index.html

/etc/httpd/conf.d配下にtest.confという名前のファイルを作成します。

定義ファイルの作成
[root@server ~]# cat /etc/httpd/conf.d/test.conf
NameVirtualHost 192.168.3.10
<VirtualHost 192.168.3.10>
  DocumentRoot /var/www/test1/html
  ServerName www.test1.com
</VirtualHost>

<VirtualHost 192.168.3.10>
  DocumentRoot /var/www/test2/html
  ServerName www.test2.com
</VirtualHost>

6.4 httpdの再起動

httpdを再起動します。

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

6.5 動作確認

クライアントから、それぞれのWebサーバにcurlでアクセスしてみます。
各Webサーバのindex.htmlの中身が表示されていることがわかります。
なお、curlコマンドの使い方は、「curlコマンドの使い方」を参照してください。

[root@client ~]# curl http://www.test1.com/index.html
test1
[root@client ~]# curl http://www.test2.com/index.html
test2

6.6 備考

定義ファイルの構文チェックをすると、下記メッセージが出力されます。
test.confから、NameVirtualHostを削除しても、6.5と同じ結果が得られました。
どうやら、Apache2.4では、NameVirtualHostは、定義ファイルに記述しなくてもいいようです。

[root@server ~]# httpd -t
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf.d/test.conf:1

なお、httpdコマンドの使い方は、「httpdコマンドの使い方」を参照してください。

7 DirectoryIndex

クライアントからのリクエストがあった時、ファイル名を指定せずディレクトリだけ
指定する時があります。そのように、ファイル名が省略された場合にどのファイルを
返すのかを指定するディレクティブです。

Webサーバは、DirectoryIndexで定義されたファイル名を左から右に向かって調べ、
最初に見つけたファイル名をクライアントに返します。

7.1 事前準備

テスト用ファイルの作成
[root@server ~]# echo "AAAAA" > /var/www/html/index.html
[root@server ~]# echo "BBBBB" > /var/www/html/index.htm

7.2 動作確認(その1)

DirectoryIndexに、index.html,index.htmという順序でファイルを指定します。

DirectoryIndexの設定
root@server ~]# less -N /etc/httpd/conf/httpd.conf
-snip-
    163 <IfModule dir_module>
    164     DirectoryIndex index.html index.htm
    165 </IfModule>

httpdを再起動します。

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

ファイル名を指定せず、192.168.3.10にアクセスします。
index.htmlの内容が表示されたことがわかります。
apache1.png

7.3 動作確認(その2)

次は、DirectoryIndexのファイル名の順序を変更してみます。
DirectoryIndexに、index.htm,index.htmlという順序でファイルを指定します。

DirectoryIndexの設定
root@server ~]# less -N /etc/httpd/conf/httpd.conf
-snip-
    163 <IfModule dir_module>
    164     DirectoryIndex index.htm index.html
    165 </IfModule>

httpdを再起動します。

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

ファイル名を指定せず、192.168.3.10にアクセスします。
index.htmの内容が表示されたことがわかります。
apache2.png

8 AuthType

AuthTypeは認証の種類を指定するディレクティブです。
指定できる認証として、Basic(基本認証)、Digest(ダイジェスト認証)があります。
認証を行う場合、下記ディレクティブを使います。

ディレクティブ 意味
AuthType 認証の種類を指定。Basic(基本認証)、Digest(ダイジェスト認証)がある
AuthName 認可領域の名前を指定
AuthUserFile htpasswdコマンドで作成したパスワードファイルを指定
Require 認証対象のユーザを指定

なお、Requireは次のものがあります。
・Require valid-user:全てのユーザを認証の対象にする。
・Require user ユーザ名のリスト:ユーザ名のリストに指定したユーザだけを認証の対象にする。
・Require group グループ名:指定したグループだけを認証の対象にする。
ここでは、Basic認証において、Require valid-userRequire userの動作確認をしてみます。

8.1 構成

サーバでBasic認証を実行します。
クライアントでcurlコマンドを使って、サーバにアクセスしてみます。

構成
             192.168.3.0/24
client ------------------------ server 
     .20                      .10

8.2 事前準備

8.2.1 index.htmlの作成

認証に成功した場合に表示する文字列をindex.htmlに作成します。

[root@server ~]# echo "Basic Authentication" > /var/www/html/index.html

8.2.2 ディレクトリの作成

パスワード(.htpasswd)を格納するディレクトリを作成します。
なお、パスワードは、DocumentRoot配下に置かないことが推奨されています。

ディレクトリの作成
[root@server ~]# mkdir /var/www/passwd/

8.2.3 ユーザとパスワードの作成

htpasswdコマンドを使って、下記アカウント(ユーザ/パスワード)を作成します。
・user1/pass1
・user2/pass2

user1のパスワードを作成します。

user1のパスワード作成
Updating password for user user1
[root@server ~]# htpasswd -c /var/www/passwd/.htpasswd user1
New password:
Re-type new password:
Adding password for user user1

user2のパスワードを作成します。ここでは、-cオプションは不要です。

user2のパスワード作成
[root@server ~]# htpasswd /var/www/passwd/.htpasswd user2
New password:
Re-type new password:
Adding password for user user2

.htpasswdの中身を確認します。
user1とuser2のパスワードが登録されていることがわかります。

htpasswdの確認
[root@server ~]# cat /var/www/passwd/.htpasswd
user1:$apr1$dFYKLANy$Eko1emAWbh/c.Xs4L5Rzr/
user2:$apr1$BnQ0pgqt$6E.HQWoTNMPgdz9KOrbP40

8.3 Require valid-userの場合

8.3.1 定義ファイルの作成

.htpasswdファイル中の全ユーザを認証対象にするため、Require valid-userと定義します。

定義ファイルの確認
[root@server ~]# cat /etc/httpd/conf.d/test.conf
<Directory "/var/www/html">
  AuthType Basic
  AuthName "Basic Auth"
  AuthUserFile /var/www/passwd/.htpasswd
  Require valid-user
</Directory>

8.3.2 httpdの再起動

httpdを再起動します。

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

8.3.3 動作確認

user1の場合
[root@client ~]# curl -u user1:pass1 http://192.168.3.10/
Basic Authentication
user2の場合
[root@client ~]# curl -u user2:pass2 http://192.168.3.10/
Basic Authentication

8.4 Require userの場合

8.4.1 定義ファイルの作成

.htpasswdファイル中のuser1だけを認証対象にするため、Require user user1と定義します。
もし、user1とuser2を認証対象にする場合は、Require user user1 user2と定義します。

定義ファイルの確認
[root@server ~]# cat /etc/httpd/conf.d/test.conf
<Directory "/var/www/html">
  AuthType Basic
  AuthName "Basic Auth"
  AuthUserFile /var/www/passwd/.htpasswd
  Require user user1
</Directory>

8.4.2 httpdの再起動

httpdを再起動します。

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

8.4.3 動作確認

user1は認証対象なので、Basic認証が成功する。

user1の場合
[root@client ~]# curl -u user1:pass1 http://192.168.3.10/
Basic Authentication

user2は認証対象ではないので、Basic認証が失敗する。

user2の場合
[root@client ~]# curl -u user2:pass2 http://192.168.3.10/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>

9 LoadModule

httpd起動時、動的にロードするモジュールを指定するディレクティブです。
書式は、次のとおりです。
LoadModule モジュール modules/ファイル名

たとえば、Basic認証で使うモジュールは、以下のように定義されています。
モジュールはauth_basic_module、ファイル名はmod_auth_basic.soになります。

00-base.confからの抜粋
LoadModule auth_basic_module modules/mod_auth_basic.so

モジュールは、下記ファイルに定義されています。

モジュールの定義ファイル一覧
[root@server ~]# ls -l /etc/httpd/conf.modules.d/
合計 32
-rw-r--r--. 1 root root 3739 11月 28 00:58 00-base.conf
-rw-r--r--. 1 root root  139 11月 28 00:58 00-dav.conf
-rw-r--r--. 1 root root   41 11月 28 00:58 00-lua.conf
-rw-r--r--. 1 root root  742 11月 28 00:58 00-mpm.conf
-rw-r--r--. 1 root root  957 11月 28 00:58 00-proxy.conf
-rw-r--r--. 1 root root   41 11月 28 00:58 00-ssl.conf
-rw-r--r--. 1 root root   88 11月 28 00:58 00-systemd.conf
-rw-r--r--. 1 root root  451 11月 28 00:58 01-cgi.conf

モジュールをロードしたい場合、LoadModuleの行頭の#を削除して
httpdを再起動することで、モジュールがロードできます。

なお、ロードされているモジュールは、以下のようにして確認することができます。
詳細は、httpdコマンドの使い方を参照ください。

ロード済モジュールの確認
[root@server ~]# httpd -M
-snip-
 ssl_module (shared)
 systemd_module (shared)
 cgi_module (shared)

Z 参考情報

Linux教科書 LPICレベル2 スピードマスター問題集 Version4.5対応
Linux教科書 LPICレベル2 Version 4.5対応 (日本語)

4
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hana_shin
写真は淡路島SAから明石海峡大橋を撮影したものです('19夏撮影)。'20年夏も3年連続で四国、大阪に行く予定でしたが、コロナ終息しないので断念。2021はぜひ行きたい!。取得済資格:ネットワークスペシャリスト、オンライン情報処理技術者。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?