Takahiro Octopress Blog

-1から始める情弱プログラミング

Dockerコンテナ内のUbuntuでApache設定を試してみよう!

| Comments

はじめに

前回のDockerにWebサーバーを立てよう!に引き続きDocker内Apacheで遊んでみます。
前回はUbuntuへのApacheインストールから起動まで見てきました。
実際の現場でApacheを利用する際は様々な設定を施す必要があります。
本記事ではその一端を少しでも学ぼうということで書いていきます。

DocumentRootの設定

Apacheでは設定ファイルで静的ファイルのルートパスを設定することができます。
デフォルトでは/var/www/htmlになっています。
これは、/etc/apache2/sites-enabled/000-default.confで次のように定義されています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<VirtualHost *:80>
  # The ServerName directive sets the request scheme, hostname and port that
  # the server uses to identify itself. This is used when creating
  # redirection URLs. In the context of virtual hosts, the ServerName
  # specifies what hostname must appear in the requests Host: header to
  # match this virtual host. For the default virtual host (this file) this
  # value is not decisive as it is used as a last resort host regardless.
  # However, you must set it for any further virtual host explicitly.
  #ServerName www.example.com

  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html

  # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
  # error, crit, alert, emerg.
  # It is also possible to configure the loglevel for particular
  # modules, e.g.
  #LogLevel info ssl:warn

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  # For most configuration files from conf-available/, which are
  # enabled or disabled at a global level, it is possible to
  # include a line for only one particular virtual host. For example the
  # following line enables the CGI configuration for this host only
  # after it has been globally disabled with "a2disconf".
  #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

必要があれば書き換えて使いましょう。

リバースプロキシ設定

リバースプロキシとは、

  • クライアントからのアクセスをキャッチして、特定のサーバへ送るプロキシサーバ
  • セキュリティや負荷分散などのために利用される

ものです。
詳しくはリバースプロキシ – wikiを見てください。

設定はいたって簡単です。
まずは、モジュールの有効化をするために下記コマンドを打ちましょう。

1
2
3
4
5
6
7
8
9
10
11
// プロキシモジュールの有効化
$ a2enmod proxy proxy_http
Enabling module proxy.
Considering dependency proxy for proxy_http:
Module proxy already enabled
Enabling module proxy_http.
To activate the new configuration, you need to run:
  service apache2 restart

// Apacheを再起動
$ /etc/init.d/apache2 restart

続いて、設定ファイルを更新します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<IfModule mod_proxy.c>

  # If you want to use apache2 as a forward proxy, uncomment the
  # 'ProxyRequests On' line and the <Proxy *> block below.
  # WARNING: Be careful to restrict access inside the <Proxy *> block.
  # Open proxy servers are dangerous both to your network and to the
  # Internet at large.
  #
  # If you only want to use apache2 as a reverse proxy/gateway in
  # front of some web application server, you DONT need
  ProxyRequests Off

  <Proxy *>
  #   AddDefaultCharset off
  #   Require all denied
  #   #Require local
    Require all granted
  </Proxy>
  ProxyPass /hoge/ http://localhost:80/hoge.html
  ProxyPassReverse /hoge/ http://localhost:80/hoge.html

  # Enable/disable the handling of HTTP/1.1 "Via:" headers.
  # ("Full" adds the server version; "Block" removes all outgoing Via: headers)
  # Set to one of: Off | On | Full | Block
  #ProxyVia Off
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

上記の設定について説明します。

  • ProxyRequests Off: フォワードプロキシをOFFにする設定です
  • <Proxy *> 〜 </Proxy>: アクセスパスに対するアクセス権限範囲を設定します
  • ProxyPass 元のアクセス要求パス 転送パス: クライアントからのアクセス要求を転送します
  • ProxyPassReverse 元のアクセス要求パス 転送パス: Apache に HTTP リダイレクト応答の Location, Content-Location, URI ヘッダの調整を担います

筆者自身、フォワードプロキシという単語を意識して使ったことがなかったのですが、ごくごく普通に使われているものなんですよね…
Apache公式ページの下記記述を見るとよくわかります。

ファイアウォールによって 制限されている内部のクライアントにインターネットへのアクセスを 提供するもの

どうもProxyPassReverseは理解するのが厄介だったようで多くの方が記事にしてくれていました。

上記設定をしたので下記にアクセスしてみます。
http://localhost:15600/hoge/
結果は下記の通りです。

リバースプロキシした画面を表示

このために用意したhoge.htmlが表示されました。

RewriteRuleの設定

Rewriteはクライアントからのリクエストを内部変換してリダイレクトするような機能です。
今回は些か簡単な例を扱ったためリバースプロキシとの違いがわかりにくかったかもしれません。
あくまでもRewriteはパスの読み替えであるため、物理的に別のサーバに接続を促すようなリバースプロキシならではの設定はできません。

まずはモジュールを有効化させます。

1
2
3
4
5
6
7
$ a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart

// Apacheを再起動
$ /etc/init.d/apache2 restart

続いて、静的ファイルパスへのアクセス制限を変更します。

1
2
3
4
5
6
// /etc/apache2/apache2.conf
<Directory /var/www/>
  Options Indexes FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>

デフォルトでは上記がAllowOverride NoneだったのをAllowOverride Allに変更しています。
さらに、.htaccessファイルを作成して書き換えルールを記載します。
.htaccessを利用する設定はapache2.confにデフォルトで記載されています。

1
2
3
4
5
6
// /etc/apache2/apache2.conf
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.  See also the AllowOverride
# directive.
#
AccessFileName .htaccess

そして実際のRewriteRuleの記載です。

1
2
3
4
5
// /var/www/html/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^fuga/(.*)$ /bar/$1
</IfModule>

サンプル用に、/var/www/html配下にbarフォルダを作成し、その配下にindex.htmlを作成しました。
上記設定をしたので下記にアクセスしてみます。
http://localhost:15600/fuga/
結果は下記の通りです。

RewriteRule適用

ErrorDocumentの設定

エラー発生時にカスタムエラーページを表示したいときなどに利用します。
具体的には、

1
2
3
4
5
6
7
8
9
10
11
// /etc/apache2/site-enabled/000-default.conf
<VirtualHost *:80>
  ...
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  // 以下、ErrorDocumentの設定
  ErrorDocument 404 error_404.html
  ErrorDocument 500 error_500.html
  ...
</VirtualHost>

のように設定が可能です。
Ubuntuの場合、/etc/apache2/conf-enabled/localized-error-pages.confErrorDocumentの構文が全てコメントアウトの状態で記載があるため、本格的にやるならきちんとファイルを分けた方が良さそうです。

まとめ

さて今回はApacheの設定を少し見ることができました。
WEBサーバとはどんなものなのか、わかったようでわかっていなかったことが見えてきた気がします。
引き続き勉強を続けていきたいものです。
と言ったところで本日はここまで。

Comments