SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

IoTをかじってみよう

IoTをかじってみよう(3)
~センサーのデータをWebサーバーに送付するmbedアプリケーションを作成する

nginx、php5-fpm、php5-mysqlの導入と準備

 次にsusumutani3/iotkaji:v1イメージを基にして、nginxとPHP関連モジュールをインストールしたイメージを作成します。MySQLと違ってインストール中にパスワード設定することはないため、ここからはDockerfileを使用します。ホストOS上で適当なディレクトリを作成します。

$ mkdir ~/iotkaji_docker

 作成したディレクトリに、次のDockerfileと起動用シェルと接続確認用テストファイルを置きます。

Dockerfile(~/iotkaji_docker/Dockerfile)
# Dockerfile for IoTかじってみよう nginx,php5-fpm,php-mysql
FROM susumutani3/iotkaji:v1

MAINTAINER Susumu Taniguchi

RUN apt-get -y -q update
RUN apt-get -y -q install nginx
RUN apt-get -y -q install php5-fpm

# /etc/nginx/sites-available/defaultの変更
# オリジナルのファイルを事前に退避します
RUN cp -p /etc/nginx/sites-available/default /etc/nginx/sites-available/default.org
# server{}内のindexの設定を追加します。
RUN sed -i -e "s/index index.html index.htm;/index index.html index.htm index.php;/g" /etc/nginx/sites-available/default
# location ~\.php${}のコメントアウトは後ほどコンテナ実行後に編集します。

RUN apt-get -y -q install php5-mysql

# /etc/php5/fpm/php.iniの変更
# オリジナルのファイルを事前に退避します
RUN cp -p /etc/php5/fpm/php.ini /etc/php5/fpm/php.ini.org
# 過去のphpとの互換性のためのパラメータcgi.fix_pathinfoについて、コメントアウトをはずして値を0にします。
RUN sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" /etc/php5/fpm/php.ini
# MySQLサーバーへ接続するためのデフォルトソケットのパスを記入します。
RUN sed -i -e "s/pdo_mysql.default_socket=/pdo_mysql.default_socket=\/run\/mysqld\/mysqld.sock/g" /etc/php5/fpm/php.ini

# 接続確認用テストファイル
ADD test.php /usr/share/nginx/html/test.php

# 起動用シェル 設定ファイルを編集してから使うためCMDの引数にはまだしない
ADD init.sh /usr/local/bin/init.sh
RUN chmod 755 /usr/local/bin/init.sh

CMD ["/bin/bash"]
起動用シェル(~/iotkaji_docker/init.sh)
#!/bin/bash

service nginx start
service php5-fpm start

/usr/bin/mysqld_safe &

exec /bin/bash
接続確認用のテストファイル(/iotkaji_docker/test.php)
<?php
phpinfo();
?>

 作成したDockerfileを使用して、リポジトリ名とタグ名が susumutani3/iotkaji:v2というイメージを作成します。

$ sudo docker build -t susumutani3/iotkaji:v2 ~/iotkaji_docker

 イメージが作成できていることを確認します。

$ sudo docker images

 作成したイメージのコンテナを実行します。

$ sudo docker run --name settingup2 -it -p 80:80 susumutani3/iotkaji:v2

nginxの設定

 nginxでPHPを利用できるようにするための設定変更を行います。

 実行したコンテナ上で、/etc/nginx/sites-available/defaultのlocation ~\.php${}のコメントアウトをはずします。

Container> vi /etc/nginx/sites-available/default

 変更箇所:54行目から64行目のlocation ~\.php${}のコメントアウトをはずします。

 また、fastcgi_passの設定を行うのですが、php5-fpmを使用するため、php5-cgi用の設定はコメントアウトのままにしておきます。

修正前
54    #location ~ \.php$ {
55    #       fastcgi_split_path_info ^(.+\.php)(/.+)$;
56    #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
57    #
58    #       # With php5-cgi alone:
59    #       fastcgi_pass 127.0.0.1:9000;
60    #       # With php5-fpm:
61    #       fastcgi_pass unix:/var/run/php5-fpm.sock;
62    #       fastcgi_index index.php;
63    #       include fastcgi_params;
64    #}
修正後
54    location ~ \.php$ {
55            fastcgi_split_path_info ^(.+\.php)(/.+)$;
56            # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
57 
58            # With php5-cgi alone:
59    #       fastcgi_pass 127.0.0.1:9000;
60            # With php5-fpm:
61            fastcgi_pass unix:/var/run/php5-fpm.sock;
62            fastcgi_index index.php;
63            include fastcgi_params;
64    }

 このとき、24行目のrootのあとに書かれたディレクトリが、HTMLコンテンツを置くディレクトリになります。

24    root /usr/share/nginx/html;

 保存します。

稼働確認

 コンテナ上でMySQLとnginxとphpモジュールを起動します。

Container> /usr/local/bin/init.sh

 次にホストOS上のブラウザでhttp://localhost/test.phpへアクセスします。図のような画面が表示されたら、nginxとPHPが有効になっています。

図14 Firefoxでの表示結果
図14 Firefoxでの表示結果

 もしくはVirtualboxのような仮想環境のゲストOSとしてUbuntuの環境を構築している場合は、別のターミナルから次のコマンドを実行します。

$ sudo apt-get install w3m
$ w3m http://(ゲストOSのIPアドレス)/test.php
図15 w3mでの表示結果
図15 w3mでの表示結果

 うまくアクセスできなかったときは、次の場所にあるnginxのアクセスログを調べるとヒントが得られるでしょう。

/var/log/nginx/access.log
/var/log/nginx/error.log

 catコマンドによる出力例は次の通りです。

Container> cat /var/log/nginx/access.log
127.0.0.1 - - [11/Aug/2015:01:29:57 +0900] "GET /test.php HTTP/1.1" 200 22750 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0"
127.0.0.1 - - [11/Aug/2015:01:34:38 +0900] "GET /test.php HTTP/1.1" 200 22745 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0"

Container> cat /var/log/nginx/error.log
2015/08/11 00:58:26 [error] 10163#0: *1 directory index of "/var/www/html/" is forbidden, client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"
2015/08/11 01:00:34 [error] 10268#0: *1 directory index of "/var/www/html/" is forbidden, client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"

 MySQLとnginxとPHP関連モジュールの導入と設定ができた状態になりました。

 コンテナイメージを保存するために、MySQLとnginxとPHP関連モジュールを停止してから、Ctrl+p qでコンテナから抜けます。

Container> service nginx stop
Container> service php5-fpm stop
Container> mysqladmin shutdown --password=MySQL導入時に設定したrootのパスワード

 コンテナを抜けてから、v1と同じようにホストOS上で次の一連のコマンドでイメージを保存します。

$ sudo docker stop settingup2
$ sudo docker commit settingup2 susumutani3/iotkaji:v3
$ sudo docker rm settingup2

次のページ
PHPによるWebアプリケーションの開発

この記事は参考になりましたか?

IoTをかじってみよう連載記事一覧

もっと読む

この記事の著者

谷口 督(日本アイ・ビー・エム株式会社)(タニグチ ススム)

2000年問題対応の時期にIT業界に入り、それ以来UNIX系のインフラ構築を担当。最近の関心事は、そろそろ出てきそうな画期的なテクノロジー探しや世の中が良くなるためのもの作りです。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9162 2016/01/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー