Apache HTTP インフラ

Apacheに静的ファイルをキャッシュさせる方法(Webサーバとブラウザキャッシュ合わせて)

2018年3月5日

こんにちは!シミダイ(@shimidai2100)です。

Webサイトのサンプルを作成時には、静的HTML→CSM(Wordpressなど)となるケースが多いと思います。

その場合ファイルサイズが多くなってしまったり、ヘッダー情報がキャッシュに乗っていなかったりと性能が悪い時があります。

そんな時にはApacheで静的ファイルキャッシュさせて、性能を上げましょう。

※今回の手順はWebサーバの性能問題を解決するための、ゴリゴリのチューニング方法は乗っていません。


検証した環境

今回のインストール環境は以下になります。

  • CentOS:CentOS Linux release 7.0.1406 (Core)
  • Apache/2.4.6 (CentOS)

Apacheでキャッシュ機能を有効化する

キャッシュ前の準備

まずはキャッシュ格納先ディレクトリを作成します。

mkdir -p /var/www/cache/

念のためcacheファルダにすべての権限を付与しておきましょう。

chmod 777 /var/www/cache

Apacheの設定

次に「/etc/httpd/conf/httpd.conf」にキャッシュのためのモジュールをロードします。

vi /etc/httpd/conf/httpd.conf

↓を追記します。

LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so

cache_module」はキャッシュ機能そのものです。

cache_disk_module」はディスクキャッシュ機能になります。

さらに「/etc/httpd/conf/httpd.conf」にモジュールの動作を記載します。

<IfModule mod_cache.c>
        <IfModule mod_cache_disk.c>
                CacheRoot /var/www/cache
                CacheEnable disk /
                CacheDirLevels 5
                CacheDirLength 3
        </IfModule>
        CacheIgnoreCacheControl On
        CacheIgnoreNoLastMod On
        CacheDefaultExpire  100000
        CacheMaxExpire 1728000000
</IfModule>

では、各ディレクティブについて解説していきます。

CacheRoot(必須)

キャッシュを格納するディレクトリをフルパスで記載します。

CacheEnable(必須)

キャッシュ対象とするパスを指定します。

CacheDirLevels

キャッシュのサブディレクトリの深さの数を記載します。

CacheDirLength

サブディレクトリ名の文字数を指定します。

CacheIgnoreCacheControl

no-cache ヘッダや Pragma: no-store ヘッダであっても、キャッシュを使用してレスポンスをします。

no-cache ヘッダや Pragma: no-store ヘッダを無視するという意味になります。

CacheIgnoreNoLastMod

通常はLast-Modified による最終修正時刻の無いドキュメントはキャッシュされませんが、有効化するとキャッシュされるようになります。

CacheDefaultExpire

キュメントに 有効期限 (expiry) や最終修正時刻 (last-modified) が指定されていない場合の デフォルトの時間を指定します。

」で指定する点に注意してください。

CacheMaxExpire

キャッシュする HTTPドキュメントを、元のサーバに問い合わせないまま最大何秒保持してもよいかを指定します。

つまり、ドキュメントは最大で秒数間保存するかを指定します。

」で指定する点に注意してください。

Apache設定を有効

Apacheの設定ファイルの構文が正しいか確認します。

httpd -M

↓が実行ログになります。

# httpd -M
[Mon Mar 05 02:11:26.262949 2018] [so:warn] [pid 6809] AH01574: module cache_module is already loaded, skipping
[Mon Mar 05 02:11:26.263057 2018] [so:warn] [pid 6809] AH01574: module cache_disk_module is already loaded, skipping
Loaded Modules:
 core_module (static)
 so_module (static)
 http_module (static)
 access_compat_module (shared)
 actions_module (shared)
 alias_module (shared)
 allowmethods_module (shared)
 auth_basic_module (shared)
 auth_digest_module (shared)
 authn_anon_module (shared)
 authn_core_module (shared)
 authn_dbd_module (shared)
 authn_dbm_module (shared)
 authn_file_module (shared)
 authn_socache_module (shared)
 authz_core_module (shared)
 authz_dbd_module (shared)
 authz_dbm_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_owner_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cache_module (shared)
 cache_disk_module (shared)
 data_module (shared)
 dbd_module (shared)
 deflate_module (shared)
 dir_module (shared)
 dumpio_module (shared)
 echo_module (shared)
 env_module (shared)
 expires_module (shared)
 ext_filter_module (shared)
 filter_module (shared)
 headers_module (shared)
 include_module (shared)
 info_module (shared)
 log_config_module (shared)
 logio_module (shared)
 mime_magic_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 remoteip_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 slotmem_plain_module (shared)
 slotmem_shm_module (shared)
 socache_dbm_module (shared)
 socache_memcache_module (shared)
 socache_shmcb_module (shared)
 status_module (shared)
 substitute_module (shared)
 suexec_module (shared)
 unique_id_module (shared)
 unixd_module (shared)
 userdir_module (shared)
 version_module (shared)
 vhost_alias_module (shared)
 dav_module (shared)
 dav_fs_module (shared)
 dav_lock_module (shared)
 lua_module (shared)
 mpm_prefork_module (shared)
 proxy_module (shared)
 lbmethod_bybusyness_module (shared)
 lbmethod_byrequests_module (shared)
 lbmethod_bytraffic_module (shared)
 lbmethod_heartbeat_module (shared)
 proxy_ajp_module (shared)
 proxy_balancer_module (shared)
 proxy_connect_module (shared)
 proxy_express_module (shared)
 proxy_fcgi_module (shared)
 proxy_fdpass_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_scgi_module (shared)
 proxy_wstunnel_module (shared)
 ssl_module (shared)
 systemd_module (shared)
 cgi_module (shared)
 php5_module (shared)

※私の環境では、「/etc/httpd/conf.modules.d/00-base.conf」でcache_moduleをロードしてました(汗)

次にhttpdを再起動させます。

systemctl restart httpd

↓が実行ログになります。

systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since Mon 2018-03-05 02:18:49 JST; 6s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 6813 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
 Main PID: 6835 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           |-6835 /usr/sbin/httpd -DFOREGROUND
           `-6836 /usr/sbin/httpd -DFOREGROUND

Mar 05 02:18:49 centos7-local.com systemd[1]: Starting The Apache HTTP Server...
Mar 05 02:18:49 centos7-local.com httpd[6835]: [Mon Mar 05 02:18:49.391337 2018] [so:warn] [pid 6835] A...ping
Mar 05 02:18:49 centos7-local.com httpd[6835]: [Mon Mar 05 02:18:49.392309 2018] [so:warn] [pid 6835] A...ping
Mar 05 02:18:49 centos7-local.com systemd[1]: Started The Apache HTTP Server.

無事再起動されました。

キャッシュされているか確認してみる

Webページにアクセスした後、「/var/www/cache/」にキャッシュファイルが作成されているか確認してみます。

[root@centos7-local cache]# ls -l
total 68
drwx------ 3 apache apache 4096 Mar  4 09:30 5Rn
drwx------ 3 apache apache 4096 Mar  4 09:30 9BG
drwx------ 3 apache apache 4096 Mar  4 09:29 9VK
drwx------ 3 apache apache 4096 Mar  4 09:30 AeZ
drwx------ 3 apache apache 4096 Mar  4 13:19 C2l
drwx------ 3 apache apache 4096 Mar  4 10:17 DjU
drwx------ 3 apache apache 4096 Mar  4 09:30 Hhp
drwx------ 3 apache apache 4096 Mar  4 22:12 Isc
drwx------ 3 apache apache 4096 Mar  4 13:21 RL1
drwx------ 3 apache apache 4096 Mar  4 09:30 b6P
drwx------ 3 apache apache 4096 Mar  4 10:17 enY
drwx------ 3 apache apache 4096 Mar  4 09:30 lLF
drwx------ 3 apache apache 4096 Mar  4 09:30 s11
drwx------ 3 apache apache 4096 Mar  4 09:30 sSQ
drwx------ 3 apache apache 4096 Mar  4 09:30 tq2
drwx------ 3 apache apache 4096 Mar  4 09:30 v5h
drwx------ 3 apache apache 4096 Mar  4 15:26 yg4
[root@centos7-local cache]# find . -name "*header*" | xargs ls -l
-rw------- 1 apache apache 740 Mar  4 09:30 ./5Rn/2oh/Es5/pyr/IVG/7dMw@ew.header
-rw------- 1 apache apache 767 Mar  4 09:30 ./9BG/owI/EU3/7z_/WZW/swrItNQ.header
-rw------- 1 apache apache 872 Mar  4 12:57 ./9VK/2Sj/YMO/UBR/YAV/xhfGesQ.header
-rw------- 1 apache apache 763 Mar  4 09:30 ./AeZ/2dJ/Whp/DJU/yc8/TBxgUaQ.header
-rw------- 1 apache apache 490 Mar  4 15:10 ./C2l/98b/z3K/L2i/Ktb/66yLmMA.header
-rw------- 1 apache apache 587 Mar  4 10:17 ./DjU/Z44/QG7/0sK/J6J/NuYh@_w.header
-rw------- 1 apache apache 795 Mar  4 09:30 ./Hhp/o6h/Rl@/rC8/ixy/pj@qbEA.header
-rw------- 1 apache apache 494 Mar  4 22:12 ./Isc/cfb/I7O/PbF/o1u/EM0GfDQ.header
-rw------- 1 apache apache 418 Mar  4 23:29 ./RL1/D24/gFt/P59/la0/4BR25QQ.header
-rw------- 1 apache apache 782 Mar  4 09:30 ./b6P/yrN/ojH/Bc_/aMk/_SbkbBw.header
-rw------- 1 apache apache 587 Mar  4 10:17 ./enY/kY5/QRX/lvF/gIZ/O2BRpRQ.header
-rw------- 1 apache apache 775 Mar  4 09:30 ./lLF/uLz/UwM/dEv/kHf/nd1d40Q.header
-rw------- 1 apache apache 738 Mar  4 09:30 ./s11/e6d/fl0/4tr/edF/FLH0rRA.header
-rw------- 1 apache apache 739 Mar  4 09:30 ./sSQ/KKq/4Xi/TOb/4En/9SplcnQ.header
-rw------- 1 apache apache 779 Mar  4 09:30 ./tq2/Amk/ME_/_hz/Ucl/W8fwN2Q.header
-rw------- 1 apache apache 795 Mar  4 09:30 ./v5h/ZZh/Baq/cXn/u9k/yFHh9Dg.header
-rw------- 1 apache apache 616 Mar  4 18:16 ./yg4/Qbl/lHt/dvs/its/nK9WMwA.header
[root@centos7-local cache]# find . -name "*data*" | xargs ls -l
-rw------- 1 apache apache  64832 Mar  4 09:30 ./5Rn/2oh/Es5/pyr/IVG/7dMw@ew.data
-rw------- 1 apache apache    411 Mar  4 09:30 ./9BG/owI/EU3/7z_/WZW/swrItNQ.data
-rw------- 1 apache apache  15113 Mar  4 09:29 ./9VK/2Sj/YMO/UBR/YAV/xhfGesQ.data
-rw------- 1 apache apache    569 Mar  4 09:30 ./AeZ/2dJ/Whp/DJU/yc8/TBxgUaQ.data
-rw------- 1 apache apache  15113 Mar  4 13:19 ./C2l/98b/z3K/L2i/Ktb/66yLmMA.data
-rw------- 1 apache apache  63056 Mar  4 10:17 ./DjU/Z44/QG7/0sK/J6J/NuYh@_w.data
-rw------- 1 apache apache 704230 Mar  4 09:30 ./Hhp/o6h/Rl@/rC8/ixy/pj@qbEA.data
-rw------- 1 apache apache  15113 Mar  4 22:12 ./Isc/cfb/I7O/PbF/o1u/EM0GfDQ.data
-rw------- 1 apache apache  15113 Mar  4 13:21 ./RL1/D24/gFt/P59/la0/4BR25QQ.data
-rw------- 1 apache apache 141522 Mar  4 09:30 ./b6P/yrN/ojH/Bc_/aMk/_SbkbBw.data
-rw------- 1 apache apache  64800 Mar  4 10:17 ./enY/kY5/QRX/lvF/gIZ/O2BRpRQ.data
-rw------- 1 apache apache 367637 Mar  4 09:30 ./lLF/uLz/UwM/dEv/kHf/nd1d40Q.data
-rw------- 1 apache apache  64268 Mar  4 09:30 ./s11/e6d/fl0/4tr/edF/FLH0rRA.data
-rw------- 1 apache apache  65412 Mar  4 09:30 ./sSQ/KKq/4Xi/TOb/4En/9SplcnQ.data
-rw------- 1 apache apache 166226 Mar  4 09:30 ./tq2/Amk/ME_/_hz/Ucl/W8fwN2Q.data
-rw------- 1 apache apache 970724 Mar  4 09:30 ./v5h/ZZh/Baq/cXn/u9k/yFHh9Dg.data
-rw------- 1 apache apache  15113 Mar  4 15:26 ./yg4/Qbl/lHt/dvs/its/nK9WMwA.data

しっかりディレクトリとファイルが作成されていました。これでキャッシュが効いていることが確認できました。

「.header」ファイルにはヘッダー情報が、「.data」ファイルにはhtmlファイルと画像ファイルが格納させれいることが確認できました。

おまけ:ブラウザに静的ファイルをキャッシュさせる

それでも性能が出ない時には、クライアントのブラウザに無理やりキャッシュさせましょう。

※この設定はクライアントに負担がかかるためオススメはできません。

<IfModule mod_expires.c>
	ExpiresActive On
	ExpiresByType text/css "access plus 12 days"
	ExpiresByType image/gif "access plus 12 days"
	ExpiresByType image/jpg "access plus 12 days"
	ExpiresByType image/jpeg "access plus 12 days"
	ExpiresByType image/png "access plus 12 days"
	ExpiresByType application/x-javascript "access plus 12 days"
	ExpiresByType text/x-javascript "access plus 1 month"
	ExpiresByType application/javascript "access plus 1 month"
	ExpiresByType application/x-javascript "access plus 1 month"
	ExpiresByType text/js "access plus 1 month"
	ExpiresByType text/javascript "access plus 1 month"
	ExpiresByType application/x-shockwave-flash "access plus 1 month"
</IfModule>

画像ファイルやJavaScriptでも「ExpiresByType 」ディレクティブを使用すればキャッシュさせることができます。

 

関連記事

-Apache, HTTP, インフラ

Copyright© shimidai2100 , 2020 All Rights Reserved.