OXY NOTES

最新のXAMPPをインストールし、安全・高速に運用する方法

2017年版XAMPPを安全に導入する方法

XAMPPとは何かというのは「以前のページ」で解説しました。
以前の解説からXAMPPも進化をしているようでインストールや設定の方法が変更になってます。そこで新しく解説ページを作り直しました。

新しいXAMPPにはセキュリティに関する設定がなくなったため、自前で設定します。
具体的にはベーシック認証の導入MySQLのパスワード設定といった項目です。

また応用編ということで、より本番に近いテスト環境を作るため、サーバでも導入されているapcmemcacheZend OPcacheの導入方法も解説します。


目次


XAMPPのダウンロードとインストール

まずはXAMPP公式サイトからダウンロードします。
(PHPのバージョン違いが欲しい場合は「その他のバージョンについてはこちらをクリックしてください」のリンクからダウンロードしてください)

ダウンロードしたファイルを実行して「次へ」ボタンをクリック。

いらないもののチェックを外して「次へ」ボタンをクリック。

インストールするフォルダを選択してインストール。

ちなみに「Program Files (x86)」へインストールすると正しく動作しません。Cドライブ直下がおすすめです。

Bitnamiのチェックを外して「次へ」ボタンをクリック。

Bitnamiとは、どうやらオープンソースのソフトを簡易インストールするソフトのようです。(WordPressのインストールくらい自分でやっても5分もかからないので個人的には必要ないと思います。)

インストールが開始されるのでしばらく待って、FINISH。

これでXAMPPのインストールは完了です。

XAMPPの初期設定

MySQLの初期設定

コントロールパネル(C:\xampp\xampp-control.exe)を実行してMySQLを実行。

プライベートネットワークの設定

すると確認のダイアログが出るので「プライベートネットワーク」にチェックを入れて「アクセスを許可する」ボタンをクリック。
(自分のPCでしかアクセスしない場合許可する必要はありません)

Apacheの初期設定

Apacheも同じように実行します。しかし以下のように赤文字でエラーが出ることがあります。

エラーの内容

16:03:02  [Apache] 	Error: Apache shutdown unexpectedly.
16:03:02  [Apache] 	This may be due to a blocked port, missing dependencies, 
16:03:02  [Apache] 	improper privileges, a crash, or a shutdown by another method.
16:03:02  [Apache] 	Press the Logs button to view error logs and check
16:03:02  [Apache] 	the Windows Event Viewer for more clues
16:03:02  [Apache] 	If you need more help, copy and post this
16:03:02  [Apache] 	entire log window on the forums

このエラーはWindows 10でIISがポート80を利用しているため、Apacheのプロセスがポート80で起動できないことが原因です。

netstatで調べると以下の通りsystemが利用しています。

デスクトップ左下の「Windowsを検索」で「windowsの機能」と入力。「windowsの機能の有効化または無効化」をクリック。

インターネットインフォメーションサービスのチェックを「」から「空欄」にして「OK」ボタンをクリック。

再起動を促されるので、再起動します。

再度コントロールパネルでApacheを実行するとMySQLと同じようにダイアログが出るので許可します。

以下のようにApacheとMySQLの欄がグリーンになっていれば正常に起動しています。

Windows起動時に自動起動させるには管理者権限でコントロールパネルを開き、左のServiceの欄にチェックを入れてください。


XAMPPをセキュアに利用する方法

以前のXAMPPにはセキュリティをチェックするページがありましたが、現在では廃止されているようです。
大人の事情なのか、はたまたそれくらい自分でやれということなのでしょうか?
とりあえず以前セキュリティの項目にあった設定を踏襲しておきます。

ベーシック認証を導入する

Apacheのベーシック認証を導入してユーザーIDとパスワードで認証します。
外部からアクセスする場合は設定しておきましょう。

C:\xampp\apache\conf\httpd.conf」を開いてファイルの最後に以下のように追加します。

<Directory "C:\xampp\htdocs">
	AuthUserFile C:\xampp\apache\conf\.htpasswd
#	AuthGroupFile C:\xampp\apache\conf\groups
	AuthName "Basic Auth"
	AuthType Basic
	Require valid-user
</Directory>

それぞれの項目の意味は以下の通り

Directory 認証を行うディレクティブを指定(今回はXAMPPの公開ディレクトリ全て)
AuthUserFile 認証に使うファイルの場所
AuthGroupFile グループ認証用(今回は使わない)
AuthName 認証の領域を設定
AuthType 認証方法
Require 認証ユーザーの指定(valid-userは認証ファイルにリストされているユーザーは全て許可という意味)

更に詳しく知りたい方はApache公式ページへどうぞ。

新しいユーザーの設定

続いてXAMPPのコントロールパネル(C:\xampp\xampp-control.exe)を実行してShellを実行。

以下のコマンドを入力。

> c:\xampp\apache\bin\htpasswd -c C:\xampp\apache\conf\.htpasswd hoge

hoge」ユーザーを作る例。htpasswdを利用してhogeというユーザーを新規追加(-c)。パスワードファイルの場所は「C:\xampp\apache\conf\.htpasswd」というコマンドです。

新しく設定するパスワードを聞かれるので2度入力。

New password: ********
Re-type new password: ********
Adding password for user hoge

これで設定したユーザー名とパスワードでアクセスできるようになりました。「C:\xampp\htdocs」以下へアクセスすると認証を求められます。

これでベーシック認証を導入できました。

MySQLのパスワードを設定

セキュリティを高めるためMySQLのパスワードも設定しておきます。
ベーシック認証で新しいユーザーを作った時と同じようにXAMPPのコントロールパネルからShellを起動します。

今回はrootユーザーを作成します。

> cd c:\xampp\mysql\bin
> mysqladmin -u root password

するとパスワードを求められるので任意のパスワードを入力。

New password: ********
Confirm new password: ********

phpMyAdminの初期設定

作成したrootユーザーで利用できるようにphpMyAdminの設定を行います。

コントロールパネルのApache側のconfigにphpmyadmin用の設定ファイルがあるのでクリック。
(C:\xampp\phpMyAdmin\config.inc.phpを直接編集してもOK)

21行目あたりに先程のパスワードを入力。(シングルクォーテーションは意味があるので削除しないように)

$cfg['Servers'][$i]['password'] = '';

これで無事にパスワードの設定が完了です。
http://localhost/phpmyadmin/」へアクセスすれば確認できます。


PHPの時間設定

PHP 5.5以降でUTC以外の時間を設定する場合は明示的にdate_default_timezone_set()関数で設定するか、php.iniのdate.timezoneに設定してくれとのこと。
サーバは殆どの場合は日本時間を利用すると思うので、ローカルでも設定します。

C:\xampp\php\php.ini」の943行目あたり、date.timezoneのコメントアウト削除しAsia/Tokyoとして再起動。

; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo

「.htaccess」を使うと500Errorが出る場合

.htaccess」を使うと以下のエラーが出る場合があります。

Server error!

サーバ内部で障害が発生し、 リクエストに応えることができませんでした。 サーバが過負荷であるか、 CGI スクリプトにエラーがあります。

サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。

Error 500

その際は以下のファイル(C:\xampp\apache\conf\extra\httpd-xampp.conf)を開き。

<Directory "C:/xampp/htdocs/xampp">
    <IfModule php5_module>
    	<Files "status.php">
    		php_admin_flag safe_mode off
    	</Files>
    </IfModule>
    AllowOverride AuthConfig
</Directory>

この部分の

AllowOverride AuthConfig

の部分を

AllowOverride All

に変更してApacheを再起動。


apcを導入

apcとはPHPを高速化するためのキャッシュ機構です。
詳しくは以前の投稿でまとめたので参照してください。

最新のAPCu5.1.5はPHP7系のものなので、PHP5系で動くAPCu 4.0.11を利用します。

pecl.php.netへダウンロードしに行きます。

PHP 5.6用のTSバージョンの32bit用を利用します。(XAMPPは64bit OSでも32bitで動作しているため)
今回は「5.6 Thread Safe (TS) x86」をダウンロードします。

ファイルを解凍して「php_apcu.dll」を「C:\xampp\php\ext」へ移動。

C:\xampp\php\php.ini」を編集。ページの最後に以下の記述を追加。(キャッシュサイズ等は環境に合わせて変更してください。)

extension=php_apcu.dll
[APCu]
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php

Apacheを再起動して「http://localhost/dashboard/phpinfo.php」でapcapcuの項目が追加されているか確認します。


memcacheを導入

キャッシュ技術といえばmemcache
ローカルの環境では恩恵は感じにくい技術ですが、テストに利用することもあると思います。

PHP For Windowsからダウンロードします。

apcのときと同じ要領でtsの32bitバージョンを選びます。具体的には「php_memcache-3.0.8-5.6-ts-vc11-x86.zip」です。

ファイルを解凍して「php_memcache.dll」を「C:\xampp\php\ext」へ移動。

続いて「C:\xampp\php\php.ini」を編集。ページの最後に以下の記述を追加。(キャッシュサイズ等は環境に合わせて変更してください。)

extension=php_memcache.dll
[Memcache]
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
memcache.default_port = 11211

Apacheを再起動して「http://localhost/dashboard/phpinfo.php」でmemcacheの項目が追加されているか確認します。


memcachedサーバを導入

導入方法はこちらが詳しい。

解説より新しいバージョンが出てるようなのでmemcached-1.4.5-x86をダウンロードします。

解凍したmemcached-x86memcachedに改名してC直下に移動します。
コマンドプロンプトを管理者権限で起動して以下のコマンドでインストール。

> c:\memcached\memcached.exe -d install

正しく導入できたかテストします。
XAMPPの公開フォルダに適当な名前のPHPファイルを作成して以下の記述を追加。

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
 
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>\n";
 
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
 
$memcache->set('key', $tmp_object, false, 10) or
die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)
<br/>\n";
 
$get_result = $memcache->get('key');
echo "Data from the cache:<br/>\n";
 
var_dump($get_result);
?>

ブラウザでアクセスすると以下のように表示されるはずです。

Server's version: 1.4.5_4_gaa7839e
Store data in the cache (data will expire in 10 seconds) 
Data from the cache:
object(stdClass)#3 (2) { ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) }

memcachedサーバをタスクスケジューラで自動起動する

以前のバージョンではこれで終了なのですが、解説にもある通り、memcached 1.4.5以降はWindowsが起動した時点で自動起動しなくなりました。

そこでタスクスケジューラにコマンドを登録します。
コマンドプロンプトを管理者権限で実行して以下のコマンドを実行します。
ちなみにmemcachedはApacheの起動後に実行する必要があります。

> schtasks /create /sc onstart /tn memcached /tr "c:\memcached\memcached.exe -d start" /DELAY 0000:30
成功: スケジュール タスク "memcached" は正しく作成されました。

コマンドの意味を簡単に解説すると以下の意味です。

schtasks /create 新規タスクを作る
/sc onstart スタートを基準にスケジュール登録
/tn memcached タスク名memcached
/tr “c:\memcached\memcached.exe” /DELAY 0000:30 実行タスク

これで起動後30秒でmemcachedサーバが自動起動するようになりました。


Zend OPcacheの有効化

最新のxamppだとdefaultでdllがインストール済みなので、「C:\xampp\php\php.ini」にて設定するだけです。

こちらのサイトの記述をそのままいただきます。メモリ量は32MBに減らします。

zend_extension = php_opcache.dll

[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=0

; The OPcache shared memory storage size.
opcache.memory_consumption=32

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=4

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 100000 are allowed.
opcache.max_accelerated_files=2000

; The maximum percentage of "wasted" memory until a restart is scheduled.
opcache.max_wasted_percentage=5

; When this directive is enabled, the OPcache appends the current working
; directory to the script key, thus eliminating possible collisions between
; files with the same name (basename). Disabling the directive improves
; performance, but may break existing applications.
opcache.use_cwd=1

; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
opcache.validate_timestamps=1

; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
opcache.revalidate_freq=2

; Enables or disables file search in include_path optimization
opcache.revalidate_path=0

; If disabled, all PHPDoc comments are dropped from the code to reduce the
; size of the optimized code.
opcache.save_comments=0

; If disabled, PHPDoc comments are not loaded from SHM, so "Doc Comments"
; may be always stored (save_comments=1), but not loaded by applications
; that don't need them anyway.
opcache.load_comments=0

; If enabled, a fast shutdown sequence is used for the accelerated code
opcache.fast_shutdown=1

; Allow file existence override (file_exists, etc.) performance feature.
opcache.enable_file_override=0

; A bitmask, where each bit enables or disables the appropriate OPcache
; passes
opcache.optimization_level=0xffffffff

実際にどれくらいのメモリ量を使っているかはphpinfoZend OPcacheの項目にあるUsed memoryを見ればわかります。


以上でXAMPPの設定とキャッシュ系の設定は完了です。

キャッシュ系は高速化に寄与しますが、変更点がすぐに反映されないというデメリットもあります。
テストする環境に合わせて設定を変更してください。