Raspberry Piでウェブサーバ+Symfony2を動かす

eyecatch_raspberry_cut

今回は、Raspberry Piをウェブサーバ専用機として仕立て、そこでSymfony2を動かす方法を書きます。

Webサーバ環境の整備

ウェブサーバを上げるといっても、apache2のインストールを行うだけになってしまうので、apache2+PHP+MySQLによるちょっと本格的なウェブシステムをRaspberry Piの用な小規模サーバでも比較的簡単に構築できることを示します。ここでは、前回投稿の、最初の初期設定まではできていることを想定しています。

まずは、ここでは、ウェブサーバ専用機として使い、余計なリソースを使いたくないので、Raspberry Pi起動後に設定を変更します。

[bash]
RP$ sudo raspi-config
[/bash]

設定画面が表示されたら、boot_behaviorをNoにして、memory_split(どれだけGPUにメモリを割り当てるか)を16(16MBということ)にして、再起動します。

続いて、必要なソフトウェア(apache2、PHP5、MySQL、phpMyAdminなど)をapt-getでインストールします。

[bash]
RP$ sudo apt-get update
RP$ sudo apt-get install apache2
RP$ sudo apt-get install php5
RP$ sudo apt-get install mysql-server
RP$ sudo apt-get install php5-mysql php5-curl
RP$ sudo apt-get install php5-gd
RP$ sudo apt-get install php-apc
RP$ sudo apt-get install phpmyadmin
[/bash]

途中、MySQLのrootユーザのパスワード設定を聞かれます。特に何でも良いのですが、ここでは、元々の初期設定パスワードと同じraspberryにしておきました。

また、phpmyadminのconfigurationを聞かれますが、apache2の方を選択(スペースキーを押して*印をつける)してOKします。更に、Configure database for phpmyadmin with dbconfig-common?、と聞かれたらYesにし、パスワードを聞かれたら、先程MySQLのrootユーザ用に設定したのと同じパスワードを設定しておきます。

ここまで来ると、apache2、MySQLは既に動作しています。Raspberry Piと同じネットワーク内にあるマシンのブラウザから、Raspberry PiのIPアドレスを指定して開く(http://192.168.xx.xx/ のように指定、xx.xxの部分は各環境に合わせて変えて下さい)と”It works!”という画面が出ればapache2が無事動いているということの証拠になります。

また、http://192.168.xx.xx/phpmyadmin (上記と同様、各環境に合わせてxx.xxの部分は変えて下さい)にアクセスするとphpMyAdminの画面が立ち上がります。phpMyAdminはMySQLをブラウザから閲覧・操作するためのインタフェースを提供してくれる大変便利なプログラムです。先に設定したroot, raspberryというユーザ、パスワードの組み合わせで、ログインすると、現在のMySQLのデータベースの中身を確認することができます。

ここまで、できたら、もうウェブサーバは動いているので、後はコンテンツを作って自由に使ってみて下さい。今回は、その一例として、、PHPを用いたウェブシステムフレームワークであるSymfony2を動かしてみることにします。

Symfony2をRaspberryPiで動かす

具体的なサンプルとして、http://docs.symfony.gr.jp/sf2-blog-tutorial/ にあるblogチュートリアルを動作させます。まずは、上記チュートリアルページに沿ってSymfony2をインストールします。

[bash]
RP$ cd ~/
RP$ wget http://symfony.com/download?v=Symfony_Standard_Vendors_2.2.0.tgz
RP$ tar xvzf download?v=Symfony_Standard_Vendors_2.2.0.tgz
RP$ mv Symfony blog_tutorial
[/bash]

次に、このblog_tutorial/webが実際にウェブ上に公開されるディレクトリとして外部から参照できるようにapache2の設定をします。今回は/var/www/blog_tutorialが/home/pi/blog_tutorial/webを指すように設定します。尚、Debianでは、/etc/apache2/sites-available/defaultを修正します。

具体的には、<VirtualHost *:80>で設定されている中のDirectoryディレクティブとして、以下の設定を追記します。

[bash]
<Directory “/var/www/blog_tutorial”>
AllowOverride All
</Directory>
[/bash]

そして、その後、/home/pi/blog_tutorial/web から /var/www/blog_tutorial へシンボリックリンクを張り、apache2を再起動します。

[bash]
RP$ sudo ln -s /home/pi/blog_tutorial/web /var/www/blog_tutorial
RP$ sudo /etc/init.d/apache2 restart
[/bash]

次に、Symfony2が動作するかどうかを調べるために~/blog_tutorial/web/config.phpの一部を編集します。具体的には、

[bash]
if (!in_array(@$_SERVER[‘REMOTE_ADDR’], array(
‘127.0.0.1’,*
‘::1′,
))) {
header(‘HTTP/1.0 403 Forbidden’);
exit(‘This script is only accessible from localhost.’);
}
[/bash]

の部分を先頭行に#をつけてコメントアウトします。

その後、http://192.168.xx.xx/blog_tutorial/config.php にアクセスすると(xx.xxは変更して下さい)、Symfony2を動作させるのに
何が問題かが表示されますので、そのコメントに沿って、修正を行い、修正の度に上記アドレスにアクセスして、確認を行います。

今回は以下の作業を行いました。

[bash]
RP$ cd ~/blog_tutorial/
RP$ chmod -R 777 app/cache
RP$ chmod -R 777 app/logs
RP$ sudo emacs -nw /etc/php5/apache2/php.ini
date.timezone = Asia/Tokyo
;short_open_tag = On
short_open_tag = Off
RP$ sudo apt-get install php5-intl
RP$ sudo /etc/init.d/apache2 restart
[/bash]

これで、全て、問題の箇所と推奨の設定が満たされたので、config.phpの先ほどコメントアウトした部分をまた元に戻しておきます(サーバ設定が外部から確認できるのは、セキュリティ上よろしくないので)。

次は、データベースの設定です。データベースを修正するときは、先程設定したroot、raspberrypiで行います。

[bash]
RP$ mysql -u root -p
mysql> CREATE DATABASE `blogsymfony2` DEFAULT CHARACTER SET ‘utf8′;
mysql> GRANT ALL ON `blogsymfony2`.* TO ‘blogsymfony2’@localhost IDENTIFIED BY ‘blogsymfony2′;
mysql> exit;
[/bash]

ここでは、例として直接データベースをいじりましたが、phpMyAdminから作業しても問題ありません。続いて、symfony側の設定を行います。

[bash]
RP$ emacs -nw ~/blog_tutorial/app/config/parameters.yml
parameters:
database_driver: pdo_mysql
database_host: localhost
database_port: ~
database_name: blogsymfony2
database_user: blogsymfony2
database_password: blogsymfony2
[/bash]

としておきます。

[bash]
RP$ php app/console generate:bundle –namespace=My/BlogBundle –format=yml
[/bash]

このあと、app/autoload.iniを修正する必要があります。ドキュメントはバージョン2.0を対象としていますが、バージョン2.1以降では下記のように$loaderの下に1行追加するのが正しい方法のようです。

[bash]
<!–?php use DoctrineCommonAnnotationsAnnotationRegistry; $loader = require __DIR__.’/../vendor/autoload.php'; $loader—>add( ‘My’, __DIR__.’/../src’ );
[/bash]

引き続き、データベースにテーブルを作る作業を行います。

[bash]
RP$ php app/console generate:doctrine:entity –entity=MyBlogBundle:Post –format=annotation –fields=”title:string(255) body:text createdAt:datetime updatedAt:datetime”
RP$ php app/console doctrine:schema:create
[/bash]

ここまで、できたら、後は、チュートリアルに沿って、ページのルーティング設定、コントローラの書き換え、ビューの生成をします。blogチュートリアル(6)の下まで来たら、~/blog_tutorial/web/app_dev.phpを先にconfig.phpでやったのと同じように127.0.0.1からしかアクセスできないようにしてある部分をコメントアウトして、その後、以下のようにして、キャッシュをクリアします。

[bash]
RP$ sudo rm -rf app/cache/*
RP$ sudo rm -rf app/logs/*
[/bash]

これで、http://192.168.xx.xx/blog_tutorial/app_dev.php/blog にアクセスすると、”Blog posts”と書かれたページが見えると思います。

あとは、チュートリアルに従って、最後までやれば大丈夫です。

最後に、このままでは動作が遅すぎて使えないので、app_dev.phpではなく、app.phpを使うようにします。この時、config.phpと同様にapp_dev.phpも先程コメントアウトした部分を戻しておきます。

http://192.168.xx.xx/blog_tutorial/app.php/blog へアクセスしてやるようにすると、キャッシュが作るられるまでは遅いですが、一度、キャッシュが作られると、それなりに使える感じにはなります。

後、おまけですが、

[bash]
RP$ sudo a2enmod rewrite
RP$ sudo /etc/init.d/apache2 restart
[/bash]

すると、mod_rewriteが使えるようになり、http://192.168.xx.xx/blog_tutorial/blog でアクセスできるようになります。

以上で、コメント投稿、編集、削除ができるバリデーション機能付きの簡易ブログ投稿システムがRaspberry Piで利用できるようになりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です