ひとりまとめ

もろもろのメモ

オレにだけわかるComposer

なんとなく使ってたComposerですが、ついにやっとようやく「あー。そういうことだったのか。早く言ってよ(早く気づけよ)。」となったので、この気持ちを忘れないために備忘録。

自分がプログラムを公開する時ではなく、あくまで公開されてるパッケージを利用する時の視点で、ざっくりと大枠だけ。

 

Composerとは、パッケージの依存関係を解決してくれるやつ

getcomposer.org

「これ便利なライブラリだなー」と思って落としてきて実行してみたら「あれが足りない、これがない」などと言われたこと、いっぱいあります。

必要なものを必要なバージョンで落としてきてくれる、とっても便利な仕組みがこのComposerだという理解。

 

Composerがやってくれる主なこと

・パッケージのインストール

「便利プログラム」= パッケージを、依存するものも含めて入れてくれる。

・パッケージのアップデート

一度入れたパッケージがアップデートしてるかどうかチェックして、新しいのを入れてくれる。

・パッケージの削除

入れてみたものの使わなかったパッケージを、依存するもの含めて削除してくれる。

 

Composerで使うファイル

composer.phar

Composerの本体。これをphp composer.pharなんちゃらってやって実行するか、PATHが通る場所に移してcomposerなんちゃらとやるかは自由。

composer.json

自分のプログラムで使うパッケージとバージョンを記述するファイル。(公開する時とかは、作者情報とかライセンスとかも書き込むけど、使うだけの時はそれらは不要。)

composer.lock

「 「自分が使うパッケージ」が使ってるパッケージ」などを含めた、実際に入れたパッケージが記述するファイル。普段は自分でいじらない。

 

Composerの実行方法

composerの実行にはcompser.pharというのを使う。”composer”で検索すると「composer なんちゃら〜」とか「php composer.phar なんちゃら〜」という記述方法を見るけど、このファイルをPATHが通る場所に置いて使うか、手元(?)に置いて使うかの違い。

compser.pharは、こういう方法で入手できる。

curl -sS https://getcomposer.org/installer | php

あるいは次のページのManual Downloadから。

Composer

こうして落としてきたcomposeer.pharを次のようにPATHの通った場所へ移動させれば、composerというコマンドで実行できるようになる。

mv composer.phar /usr/local/bin/composer

 

Composerがやってる流れ

パッケージを入れたり削除したりする時、だいたいこんな感じのことをやってるぽげ。

1:composer.jsonをチェック

2:依存するファイルを含めた一覧をcomposer.lockとして作成する

3:composer.lockに書かれたファイルをvendorディレクトリにインストールする

 

Composerでパッケージを入れる方法

大きく2通りあるのだけど、ちょっと挙動が異なる。純粋な意味での「指定したパッケージを入れる」というのは1だと思う。

1:composer require { パッケージ名 }で入れる

composer.jsonに書き込んだ上で、composer.lockを更新して、指定したパッケージを入れる。composer.jsonが存在しなかったら、作ってもくれる。

例:composer require phpunit/phpunit

複数のパッケージに対して次々このようなコマンドを実行しても、composer.jsonには追加をしていってくれるので心配なし。バージョンを指定したい場合は、次のようにする。

例:composer require phpunit/phpunit:6.3.0

 

2:composer.jsonに、使いたいパッケージを記述して入れる

 自分でcomposer.jsonを更新。そのあとに方法が2通りある。

a : composer installを実行

まだcomposer.lockが作られてないとき、つまり一番最初で有効な方法。composer.lockを削除すればいつでも使えるぜ!というのもアリかもしれないけど、果たしてそれが推奨される方法かというとちょっと疑問。

b : composer updateを実行

すでにcomposer.lockがあっても無視して、パッケージをインストールする。

しかし、あくまで「composer.jsonに書かれた全てのパッケージに対して、条件に合う中で一番最新のものに更新する」という挙動なので、厳密には1とは異なる。

あまりないことかもしれないけど、すでに入れていたパッケージがたまたま更新されていたら、それも含めてアップデートしてしまう。(1はあくまでも指定したパッケージしか入れなくて、既存のはチェックしない。)

 

composer.jsonについて

composer initというコマンドを使って対話形式でcomposer.jsonを作ることもできるけど、この場合は自分がパッケージなりプロジェクトを作って配布するために必要なAuthor情報などを記述していくので、単にパッケージを使うだけならここまでは不要っぽげ。

むしろ、ちょこちょこ追加したり削除したりしていくなら、composer.jsonを自分で書き換えず、composer requireとかcomposer removeなどのコマンドを使って書き換えてもらった方が間違いがない気がする。

もし「composer.jsonにこう書いてインストールして使ってね」といったことが書かれてたら、composer.jsonの中のrequireという箇所に書かれてる部分をcomposer require に続けて打ち込めばOK。

 

 composer.jsonが作られると、通常であればその時の最新版のパッケージが入る。そしてそのバージョンも一緒に記録されている。(もちろんrequireするときにバージョンを指定することもできる。)

 

パッケージのアップデート

使っているパッケージをアップデートするには、次のようにする。

composer update

これでパッケージ全てについてアップデートしてくれる。特定のパッケージだけアップデートをすることも可能。

ただし、パッケージを無制限にアップデートするのかというと、そういうわけじゃない。ここで、先ほど出てきたcomposer.jsonの記述内容が効いてくる。composer.jsonに記述してるバージョン指定に従う。意図的に上げ下げする場合はこの部分を変更。

記述のルールについては、こちらの記事が詳しかった。

Composerのバージョン指定方法でのチルダ(~)とキャレット(^)の違い — A Day in Serenity (Reloaded) — PHP, FuelPHP, Linux or something

 

パッケージの削除

次のようにして、特定のパッケージとそれに依存したものを削除できる。

composer remove phpunit/phpunit

(もちろんcomposer.jsonを書き換えてcomposer updateとかでも、消すことは可能は可能。これもパッケージを入れる時と同様、その他のパッケージが意図しないバージョンにアップデートする可能性がある。)

 

composer.lockって?

実際に入れた一連のパッケージのバージョンなどが書かれたファイル。依存するもの含めて全てバージョンを指定してcomposer installするとき必要になる。普段は自分でいじることはないみたい。

 

つまりこういう使い方なんでは?

開発環境では順次必要なパッケージを追加していきそうなので、composer require 〜で個別にパッケージを追加。

一通り終わって本番環境などへ移すとき、composer.jsonとcomposer.lock、必要に応じてcomposer.pharを持ってって、composer installでvendorディレクトリをごっそり入れるってことなんじゃないかなと思ってます。

 

 

今のところ、こんな感じの理解。間違ってたー!という時に、ちょいちょいとアップデートしていく予定です。

 

CakePHP3でUpload Plugin3を使いたい!

 CakePHPで楽しようシリーズ。今回はファイルアップロードです。

アカウントに紐づくアバター画像をアップするような、任意のフィールドにファイルパスを保存しつつ実際のファイルも保存 というとき。

使うのはこちらのプラグインにしてみました。

github.com

レコードが削除されたら紐づいてるファイルも削除したりとか、画像ならアップロードと同時にサムネイルを作ったりなんてこともできるらしい。(ただし別途必要なものあり)

その使い方の備忘録。

 

環境

今回試している環境です。

CakePHP 3.4

cakephp-upload 3.0

 

インストール

composerで入れます。srcとかのディレクトリがある場所で、次のように実行。

composer require josegonzalez/cakephp-upload

 

オートロード

config/bootstrap.phpで、次のように記述して読み込みます。

Plugin::load('Josegonzalez/Upload');

 

やること

1:DBのテーブルに、保存用のフィールドを用意する

2:ファイルのアップロード先を用意する

3:Tableクラスで、どのフィールドにファイルの情報を保存するか記述する

4:登録に用いるテンプレートで、ファイルをアップロードできるフォームにする

 

1:DBのテーブルに保存用のフィールドを用意

以下の値を保存することができる。

・ファイル名(必須)

・保存ディレクトリのパス

・ファイルサイズ

・ファイルのタイプ

このうちファイルサイズは数値だけど、それ以外は文字列で。

これらを、任意のテーブルに用意しておく。名前はなんでもOK。

 

2:ファイルのアップロード先を用意

デフォルトでは / webroot / files / { テーブル名 } / { フィールド名 }に保存されるので、この場所に書き込みができるようなパーミッション設定をしておきます。

他の場所にしたい時は、任意のディレクトリを用意しとく。

 

3:どのフィールドにファイルの情報を保存するか記述

CakePHP3だとTableクラスのinitialize()の中に、設定を記述します。(Usersという名前のテーブルに紐づいてるのであれば/ Model / Table / UsersTable.php

もしファイル名を保存するフィールドがphotoとcsvという2つあった場合、最低限の記述はこうなるみたい。

$this->addBehavior('Josegonzalez/Upload.Upload', [
  'photo' => [ ],

  'csv' => [ ]

]);

 

ファイル名を変更したいとか保存場所を指定したいとか、そういったこのプラグインの設定はここに書きます。フィールドごとの設定を、それぞれの [ ] の中に書いていきます。

どんな設定が可能か、書き方は公式を参照のことということで。

設定できる項目

Behavior configuration options — CakePHP Upload

書き方

Examples — CakePHP Upload

 

4:ファイルをアップロードできるフォームにする

入力フォームのあるテンプレート(add.ctpとかedit.ctpのようなの)で、ファイルのアップロードができるようにする。これはこのプラグインだけの特別な設定が必要なわけではなく、ファイルをアップロードできるようにしておけばOK。

ここでやっておくのは2点。

・formタグでenctype="multipart/form-data"を指定。

・inputタグで type="file"を指定。

FormHelperを使うなら、こんな感じ。

<?= $this->Form->create($file, ['type' => 'file']) ?>

<?= $this->Form->input('photo', ['type' => 'file']) ?>

 

 

ここまでで、ひとまず使えるようになりました。

設定がらみで注意が必要そうなのは、レコード削除と同時にアップロードしたファイルを削除する「keepFilesOnDelete」でした。

'keepFilesOnDelete' => false

を書くことでファイルを削除することができるのですが、諸々デフォルトのままだと同じ名前のファイルが複数のレコードに紐づいていたとしても、どれか1つのレコードを削除する時にファイルが消されてしまいます。対応方法としては、こういうのがありそうです。

・保存場所をレコードごとに分ける

 'path'のところに{time}を挟んでみたりとか。

・保存時にファイル名を一意になるように変更する

 'nameCallback'のところで名前を変えてみるとか。

 

他の色々

さらにやることというと、サムネイル作ったりバリデーションしたりでしょうか。

 

サムネイルをつくる

3の設定のところで、'transformer'を設定します。

公式で書かれてるそのままをやってみました。

Examples — CakePHP Upload

この例では「Imagine」というのを使っていたので、このプラグインをComposerで入れてBootstrap.phpでオートロードしました。

github.com

上記例だとサムネイルのファイル名は「thumbnail-」というのを頭につけてます。なので、レコード削除と同時にファイルも削除する場合、例にあるように'deleteCallback'で「thumbnail-」の方もreturnしてあげる必要があるようです。

 

 

バリデーションをする

バリデーションを記述の仕方自体はCakePHP3のルールに従いますが、チェックする方法にこのプラグインが提供する機能を利用することができるようです。

use Cake\Validation\Validator;

を書いてバリデーションの仕組みが使えるようにしたTableクラスで、例えばこんな感じに書くっぽげ。photoというフィールドにファイルサイズの上限を設定したい時。

public function validationDefault(Validator $validator)
{
  $validator->provider('upload', \Josegonzalez\Upload\Validation\DefaultValidation::class);

  $validator->add('photo', 'fileBelowMaxSize', [
    'rule' => ['isBelowMaxSize', 1280],
    'message' => 'ファイルサイズが大きすぎます。',
    'provider' => 'upload'
  ]);

  return $validator;
}

 

ここでの$validator->provider()で書いてるのが、このプラグインの提供してるやつ。他のは公式を見るとして、主に画像関連のができるようになってます。

Validation — CakePHP Upload

 

 

PHPフレームワーク CakePHP 3入門

PHPフレームワーク CakePHP 3入門

 

 

CakePHP3で、ユーザー管理はCakeDC/Usersを使って楽したい!

CakePHPで何か作りたいのだけど、ユーザー管理を自分で全部作るのは面倒くさい・・・。そういう僕のような僕のためのプラグインがあったので使ってみました。あくまでも導入部分のみですが、やり方忘れそうなので備忘録。

参考ページ:

CakeDC | CakeDC Users Plugin for CakePHP 3 | The minds behind CakePHP

 

環境

CakePHP 3.4.9

CakeDC/users 5.0.3( GitHub - CakeDC/users: Users Plugin for CakePHP )

 

プラグインで用意されている画面

入れるだけで、後ろ側の処理と画面を作ってくれます。

 

ログイン前

ログイン /login

f:id:g2_girichan:20170705183418p:plain

新規登録 /users/users/register

f:id:g2_girichan:20170705183533p:plain

パスワードリセット /users/users/request-reset-password

f:id:g2_girichan:20170705183630p:plain

 

管理者用

ユーザー一覧 /users/users

f:id:g2_girichan:20170705185556p:plain

ユーザー追加 /users/users/add

f:id:g2_girichan:20170705185720p:plain

 ユーザー情報 /users/users/view/{ ユーザーのID }

f:id:g2_girichan:20170705190237p:plain

ユーザー情報編集 /users/users/edit/{ ユーザーのID }

f:id:g2_girichan:20170705195134p:plain

ユーザーパスワード変更 /users/users/change-password/{ ユーザーのID }

f:id:g2_girichan:20170705195502p:plain

 

ユーザー用

プロフィール /profile

f:id:g2_girichan:20170705200643p:plain

パスワード変更 /users/users/change-password

f:id:g2_girichan:20170705195502p:plain

 

準備

1:インストー

composerを使う。ソーシャルログインが必要かどうかで、入れるものが違うみたい。通常のみならこんな感じ。(srcなどがある、いわゆるアプリケーションディレクトリ?で実行)

composer require cakedc/users

 

2:必要なテーブルを用意

bin/cake migrations migrate -p CakeDC/Users

これで次の3つのテーブルが作られます。

cake_d_c_users_phinxlog
social_accounts
users

 

3:Superuserを用意

この状態では誰もユーザーがいないので、全てにアクセスできるSuperuserを作ります。

bin/cake users addSuperuser

この直後にUsernameとPasswordが表示されるので、控えておくのを忘れずに!

 

4:bootstrapでプラグインを読み込む

config/bootstrap.phpに以下を追加します。

Plugin::load('CakeDC/Users', ['routes' => true, 'bootstrap' => true]);

 

使い方

コントローラーで読み込む

src/Controller/AppController.phpに記述すると、全てのコントローラーで読み込みます。ログインしなくても観られるページを作るなら、AppControllerを継承したコントローラーを作って、そこのinitialize()に記述するのが良いんじゃないかなと。

どのコントローラーに書くとしても、書き方はこんな感じでinitialize( )に書くみたい。

public function initialize()
{
    parent::initialize();
    $this->loadComponent('CakeDC/Users.UsersAuth');
}

 

ユーザーロールごとに制限をかける

このままの状態だと、どんなにユーザーを追加してもSuperuser以外はログインしても閲覧できるページがない。そこで、ユーザーロールごとにどのコントローラーのどのアクションにアクセスできるかを設定する必要があります。

config/permissions.php (ファイルがない場合は新規作成しちゃう)

書き方はこんな感じ。

<?php
return [
    'Users.SimpleRbac.permissions' => [
        [
            'role' => 'user',
            'controller' => 'Foo',
            'action' => 'edit',
        ],
        [
            'role' => 'user',
            'plugin' => 'CakeDC/Users',
            'controller' => 'Users',
            'action' => 'logout',
        ],
    ]
];

ここで個人的に要注意なのは、logoutを書いておかないとログインしたが最後出られないサイトになってしまうこと。最初は気がつかず/logoutにアクセスしてリダイレクトされまくりました。

 

設定を変更する

「ユーザー自身が新規登録する機能は閉じたいなー」など、プラグインの設定をすることができます。

設定を記述するファイルはプラグインのロードと同じconfig/bootstrap.php

ここにこんな感じで記述。

Configure::write('Users.Registration.active', false);

設定できる内容はvendor/cakedc/users/config/users.phpに書かれたもの。指定方法は、ドットで繋いで目的の値を指定。

詳しくは公式で。

users/Configuration.md at master · CakeDC/users · GitHub

 

日本語化する

5.0.3の時点では、日本語の翻訳ファイルは含まれていません。そのため日本語化するには自分でファイルを用意する必要があります。

vendor/cakedc/users/src/Locale/Users.potをsrc/Locale/jp_JP/Users.poにコピーします。拡張子を変更するのを忘れずに。

中身を見て「msgstr」の後ろに日本語を書けばいいのですが、いかんせん量が多くて埋めないとその文字が空のまま出てしまうようなので、取り急ぎは英語をコピペで入れて必要なものだけ日本語にするのがいいのではないかと。

なお、このファイルを置いただけじゃなく、config/bootstrap.php

ini_set('intl.default_locale', 'ja_JP');

を追加するのを忘れずに。また、キャッシュがきついので、ファイルを変更したらtmp/cache/persistent以下のファイルを消したほうがいいです。

 

メールの送信元(from)を変更

この設定は、CakePHP自体のものを参照してるようなので、そっちを変更します。

config/app.phpの中にある「Email」「EmailTransport」を、送りたいメアドのもので登録します。

 

まずはこんな感じで。

PHPフレームワーク CakePHP 3入門

PHPフレームワーク CakePHP 3入門

 

 

Nintendo Switch用のmicroSDを探してみた

Nitendo Switchで使えるmicroSDを買おうと思って調べてみました。できれば安くて速くて大きい物を買いたい!!例によってmicroSDは規格やら速度やら、チェックすべきところが多い印象なので、その辺を整理しつつメモ。

価格や性能は時期によって異なる製品が出てると思いますが、これは2017/4/26時点のものです。その点は参考までに。

 

Nitendo Switchで使えるmicroSDは?

公式ページに記述がありました。これを参考にします。

microSDカードについて|Nintendo Switch サポート情報|Nintendo

 

容量

この記事によると以下の3種類。

microSDメモリーカード
・microSDHCメモリーカード
・microSDXCメモリーカード

この違いは容量らしい。Switch本体が32GBらしいく、それ以上のサイズが欲しいため、必然的に選ぶのは64GB〜である「microSDXC」ということになります。

 

スピード

規格自体にはUHS-I と UHS-II の2種類あるようですが、Switchで対応しているのは「UHS-I規格およびUHSスピードクラス1」とのこと。任天堂の推奨では

読み込み速度 60~95MB/秒(読み込み速度が速いほど、Nintendo Switchをより快適に遊んでいただけます)

とのことなので、この条件に合うもので、読み込み&書き込み速度が早いものを探してみます。

 

調査

より安い製品もAmazonには出てるのですが、あまりにも安く出品者も個人ぽいのでスルー。調査時点でAmazonから販売されてるものだけをピックアップしました。

大体の値段感は、こんな感じっぽいです。

 

メーカー 型番 容量 読出 書込 価格
Samsung MB-MC256DA/FFP 256GB 95MB/s 90MB/s 19,980
Samsung MB-MC128GA/ECO 128GB 100MB/s 90MB/s 7,980
シリコンパワー SP128GBSTXBU1V20BS 128GB 75MB/s 15MB/s 6,280
Samsung MB-MC64GA/ECO 64GB 100MB/s 60MB/s 3,980

 

値段を抑えつつ容量もということならシリコンパワーですが、現時点の最高性能っぽいのだとSamsungか。なおここでピックアップしたSamsungの3製品は、どれもNitendoSwitch動作確認済みとのこと。

 

Switchの場合、普段のセーブは本体に書き込むようなので、書き込み速度は主にゲームのダウンロード時に影響しそうです。 それをどの程度考慮するか?で、どれを選ぶかを決めることになりそうです。

 

 

 

 

Vue.componentを初めて使ってちょっとハマった

日本語のドキュメントも充実しているVue.js。

それを頼りにちまちまとコンポーネントを試してました。

jp.vuejs.org

コンポーネントの登録はこうするらしい。

// todo-item と呼ばれる新しいコンポーネントを定義 Vue.component('todo-item', {
    template: '<li>This is a todo</li>'
})

ほうほう。そしてこう書けば置き換わるらしい。

<ol>
    <!-- todos 配列にある各 todo に対して todo-item コンポーネントインスタンスを作成する -->
    <todo-item></todo-item>
</ol>

あれ。何も表示されない・・・。ただこれだけなのになぜ・・・。

 

と思ったら、HTMLの部分にこれを書いただけだとどこにVueのを適用するのかわからないのでした!どこに適用して欲しいのかを知らせる必要があると。

 

ということで、まずvueのオブジェクトを作っておく。

new Vue({
    el: "#todo-list",
});

そして、HTMLの方でもelに対応するidをしてしておく。

<div id="todo-list">
    <ol>
        <!-- todos 配列にある各 todo に対して todo-item コンポーネントインスタンスを作成する -->
        <todo-item></todo-item>
    </ol>
</div>

こうすると、todo-itemのところが置き換わって出力されました。

 

そっか。そりゃそうだな。

RaspberryPiでFuelPHPを動かしたい!

前回Apache2を動かしたので、ついでにFuelPHPも入れてみようと試してみました。phpはすでに入っている状態を想定。

使ったバージョン Raspbian GNU/Linux 8 Apache/2.4.10 (Raspbian)

 

手順

1. FuelPHPをインストール

2. Apacheの設定を変更

 

1. FuelPHPをインストール

oilを使えるようにする

まずはoilが使えるようにします。公式サイトを参考にやってみました。

インストール方法 - インストール - FuelPHP ドキュメント

コマンドラインから、次のようにしろとのこと。

$ curl get.fuelphp.com/oil | sh

ところが、これを実行してみると次のようなメッセージが出ました。

sh: 2: Syntax error: newline unexpected

curl get.fuelphp.com/oil」だけを実行して落ちてきたソースを見てみると、このようになっていました。

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://get.fuelphp.com:443/oil">here</a>.</p>
</body></html>

https://get.fuelphp.com:443/oil」へのリンクが貼られていルノで、curlを使ってこのURLから落とすことにしました。

curl https://get.fuelphp.com:443/oil | sh

これで無事oilが使えるようになりました。

 

FuelPHPを入れる

続いてoilを使ってプロジェクトのディレクトリにFuelPHPを入れます。

これは公式サイトそのままに。

oil create { プロジェクトのディレクトリ名 } 

 

2. Apacheの設定を変更

FuelPHPmod_rewriteを使ってURLを何やかんやできる必要があるので、その許可を行います。さらに、今回はFuelPHPの/{ プロジェクトのディレクトリ名 }/publicをDocumentRootに設定することにします。

 

mod_rewriteを使えるようにする

これはコマンド1発!

sudo a2enmod rewrite

 

DocumentRootに設定する

これは先日まとめたここの記事のようにするのですが、1箇所注意点があります。

Apache2のDocumentRootを変更したい!RaspberryPiで。 - ひとりまとめ

「設定ファイルの変更」の項で記載したDirectoryディレクティブの中身を次のようにします。「AllowOverride All」にしとくのがポイント。

DocumentRoot /var/www/html

<Directory /home/pi/radiko/public/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

 

 

以上でFuelPHPが使えるようになる はず!

 

 

はじめてのフレームワークとしてのFuelPHP 改訂版

はじめてのフレームワークとしてのFuelPHP 改訂版

 

 

ラズパイマガジン 2017年4月号 (日経BPパソコンベストムック)
 

 

Apache2のDocumentRootを変更したい!RaspberryPiで。

ときたまいじる程度のApache設定。そのため毎回なにがなんだかわからなくなってしまいます。今度こそ覚えておくために、やったこと備忘録。

 

使ったバージョン

Raspbian GNU/Linux 8

Apache/2.4.10 (Raspbian)

 

手順

1. Apacheのインストール

2. DocumentRoot用のディレクトリ作成

3. Apacheの設定変更

4. Apacheの再起動

 

1. Apacheのインストール

apt-getを使ってインストールしました。

apt-getを使う前に、パッケージのリストをサーバーから入手し、その上で目的のものをインストールします。

sudo apt-get update

sudo apt-get install apache2

 

Apacheの起動はこうします。

sudo /etc/init.d/apache2 start

この状態で、http://192.168.XXX.XXX (このラズパイのIPアドレス)にブラウザでアクセスすると、Apacheの画面が表示されていることが確認できます。

 

なお、デフォルトでラズパイ起動時にApacheも起動するように設定されているようで、

/etc/rc2.d/以下にS02apache2というのが入っているのが確認できます。

 

 

2. DocumentRoot用のディレクトリ作成

今回はpiのホームディレクトリ以下の/home/pi/wwwをDocumentRootを設定してみることにします。

httpdを動かすユーザーが、このディレクトリに触れる必要があります。ということで、httpdを動かしているユーザーが誰なのか、次にようにして確認してみます。

ps auxw | grep httpd

するとpiというのが出ますので、ラズパイの場合はpiユーザーが動かしていることがわかります。ということで、デフォルトのpiでそのままディレクトリを作ることにします。

mkdir /home/pi/www

この後設定できていることが確認できるように、適当にindex.htmlというファイルを作って入れておくことにします。

 

3. Apache2の設定

変更する設定ファイル

Apache2にはいくつもの設定ファイルがあります。

Debian Apache2の設定(1)

今回はDocumentRootの場所を変更するだけなので、/etc/apache2/sites-available以下の「〜.conf」という拡張子のファイルをいじります。

デフォルトでは「000-default.conf」と「default-ssl.conf」という2つファイルが置かれていますが、「000-default.conf」をコピーして「default.config」というのを作って、そっちを変更してみることにします。

 

ちなみにこの「〜.conf」というファイルですが、新たに追加したりする場合は設置しただけではダメで、明示的に読み込ませるようにしないといけないので注意。

というのも、RaspbianのようなDebian系のApache2では、/etc/apache2/sites-enabled/に入れた設定が有効で、/etc/apache2/sites-available/には利用可能な設定を入れておく場所というルールがあるっぽい。

で、どれを有効にしてどれを無効にするのかは、次のコマンドを使います。

登録 sudo a2ensite

解除 sudo a2dissite

実はこれは、sites-enabledへのシンボリックリンクを作ったり消したりするコマンドなのでした。

sudo a2dissite

と打ってみると、次のようなメッセージが出ます。

Your choices are: 000-default

Which site(s) do you want to disable (wildcards ok)?

 

これは、現在000-defaultが設定されていることを示しています。これを解除するには、このメッセージに続けて「000-default」と入力します。

 

設定ファイルの変更

コピーして作ったdefault.configをviなどで開くと、

DocumentRoot /var/www/html

 

と書かれているのがわかります。ここでパスを指定していました。このディレクトリ以下の権限を示すDirectoryディレクティブは、/etc/apache2/apache2.confの中に記述されています。そのため、/var/www/htmlを/home/pi/wwwに変更しただけでは403エラーが発生してページが表示されません。

なので、DocumentRootの場所とDirectoryディレクティブを、default.configの中に記述します。

DocumentRoot /home/pi/www  ←これは変更

↓これは追加

<Directory /home/pi/www/>

    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

 

 

設定ファイルの登録

今更新したdefault.configを登録します。

sudo a2ensite

これを打つと、次のようなメッセージが出ます。

Your choices are: 000-default default-ssl default
Which site(s) do you want to enable (wildcards ok)?

/etc/apache2/sites-available以下に3つのファイルがあり、どれにするかを聞かれているので、defaultと入力して登録します。

 

4.Apacheの再起動

再起動はこれ。

sudo /etc/init.d/apache2 restart

 

 

これで新しいDocumentRoot以下のファイルが見えるようになるかと思います。

 

 

最初、Directoryディレクティブのことを忘れてて、DocumentRootだけを変更して「なんで403になるんだー」などと思ってました。「Apache2では/etc/apache2/sites-availableに設定を書くんだ!」とだけ書かれた記事を見つけて自分がハマったので、備忘録。