8時間耐久
PHP構築の教室

 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
テキスト




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
http://tech.a-listers.jp/
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
本日の対象者
  PHPを使っている
   環境構築が苦手
 真っ白になると固まる
    実行委員長



8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPの構築に
 関するイロハを
徹底的に学びます

8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
本日のメニュー

    PHPの動く仕組み
     ビルドのイロハ
       設定と拡張
      最適化への道


8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPの動く仕組み
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPのページが動く時
•Webサーバ (Apache等)
 URLを元にリソースを特定
•PHP
 指定されたPHPスクリプトを解析
•PHP拡張モジュール (C言語)
 PHPから必要に応じて呼び出される

  言語としては2番目のみがPHP

 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
HTMLを表示する流れ
                    公開ディレクトリ
   Webサーバ



   httpd.conf
                    公開ディレクトリ
  どのディレクトリを公開す
  るか等が設定されている




ファイルを探して返すのみ
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPが動作する流れ
   Webサーバ
                          自分で書くのは大抵これ



                            PHP
      PHP
                           スクリプト


  拡張モジュール



複数のプログラムが連携
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPが動く環境

様々なプログラムが協調して
   動作する環境



 様々な知識が必要
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
自動インストール

 # yum install php
 # apt-get install php
 # port install php5


何が起きたか理解している?       訳も分からずコピペしてない?




    トラブルの原因がわかる?          設定の方法は?




 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
根源的な
    知識
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
自力での
構築と設定
 を学ぼう
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
注意

運用環境を1から構築するの
    は時代遅れ
付け焼刃の手動構築はかえっ
   て手間になる


8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
補足

    今回はVirtualBoxに
CentOS6.0のイメージを入れ
       て使います

CentOs 6.0 base x86_64
    http://virtualboxes.org/images/centos/



   8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
VM設定メモ

•DVDメディアを除去
•ネットワークをブリッジ接続に
•キーボードを us に変えておく
 /etc/sysconfig/keyboard
•複数人ならMacアドレスの変更が必要


  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
ビルドのイロハ
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
ビルドとは?
•ソースからバイナリを作る(C言語)
•コンパイルとも呼ぶ
•その環境用のバイナリを作る




 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
自動インストール

•バイナリパッケージ
•特定の環境用のバイナリを配布
•OSやCPUが違うと非互換
•RedHutのrpmがきっかけに大流行
•WindowsやMacなどでは単純
•誰かがどこかでビルドしたもの

 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
gcc
•GNU Compiler Collection
•C言語、C++などをコンパイルできる
•Richard Stallman (1985)
•25年以上現役の超重要ソフトウエア




  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
gcc入ってる?

 # which gcc

•入ってない
 /usr/bin/which: no gcc in ....
•入ってる
 /usr/bin/gcc



 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
gccの導入

•gccはバイナリパッケージで入れる
•gccにもバージョンがある
•gccが古くてビルド失敗なんて事も


 # yum install gcc



 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
gccがあれば
•gccコマンドでC言語をコンパイル可能
•出来たバイナリは実行できる!
   #include <stdio.h>

   int main(void) {
     printf("Hello World");
     return 0;
   }

 $ gcc hello.c -o hello
 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
練習: gccでhello world
•まっさらなCentOS6.0
•キーボード設定・アカウント設定
•reboot
•which gcc
•yum install gcc
•hello worldのソースをコンパイル
•出来たバイナリを実行

  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
これでPHPもいける?

•PHPのソースは大量のCのソース
•環境に合わせて変更する部分とか
•コンパイルする順番も存在

周辺のツールも無いとPHPのような
大きなソフトウェアは導入できない


 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
定番なツール群
•autoconf
 環境に合わせてビルド設定を行う
•make (automake)
 順番の考慮や依存関係の解決など複
雑なビルドタスクを実行する
•sshd (openssl-server)
 sshで入って作業できると楽

  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
sshd導入
•yum install openssl-server
•/etc/ssh/sshd_config に追記
 PermitRootLogin  no


•近年は攻撃が多いので 認証が理想
•sshdの稼働ポートも課題
•iptables -F しないと入れない(邪悪)
  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
autoconf & make
•autoconf
 CentOS6では入ってた
•make
 入ってないので導入する
  # yum install make




  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPのtar ball




$ curl -L -O http://jp2.php.net/get/php-5.4.4.tar.gz/
from/this/mirror
$ mv mirror php.tar.gz
$ tar zxf php.tar.gz

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPのソース
 •大量のCのソース群
$ find ./ -type f | grep ".c" | wc
  905 905 27290


 •大まかなレイアウトを知っておくとト
 ラブル解決に役立つ




     8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPのソース




 PHP内部の肝はZend Engine
拡張はエンジンの機能で作られる
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPのソース




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
あの関数もCで書かれている




                           なにやら怪しい記述




 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
そういう事か




$ php -r "var_dump(date('Y-m-d',mktime(0,0,0,12,24,70)));"
string(10) "1970-12-24"
$ php -r "var_dump(date('Y-m-d',mktime(0,0,0,12,24,69)));"
string(10) "2069-12-24"



      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPのビルドの流れ
•configure
 ビルドに必要なライブラリの確認等
•make
 バイナリを作る
•make install
 出来上がったバイナリをコピー



  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
./configure してみた




     libxml2が無いらしい...

8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
libxml2
# yum install libxml2




                         OK!
     8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
./configure してみたが?




     libxml2が無いらしい...
  (libxml2-devel も入れよう)
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
./configure 成功!




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
make


                               時間がかかる
                              (ファンも回る)




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
数分後...




                              バイナリが出来た!




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
make installの前に

•make installをするとシステムに投入
•システムの挙動が変わる
•ビルドまでの作業はrootは不要
•コマンドラインを使って動作確認

  PHPに限った話ではありません


  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
動作確認
$ ./sapi/cli/php -v
PHP 5.4.4 (cli) (built: Jul 8 2012 04:15:27)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend
Technologies


$ ./sapi/cli/php -r 'echo "Hello Wolrdn";'
Hello Wolrd




                  なんか動きそう?

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
よろしい




                              一応インストール完了




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
甘ぇよ...

                        MySQLが無い
                        mbstringが無い
                          gdが無い
                            etc..




                     WordPressとか
                       動かない

8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
動かすだけなら...
$ php -S 192.168.225.15:8000
PHP 5.4.4 Development Server started at Sun Jul 8 04:50:57 2012
Listening on 192.168.225.15:8000
Document root is /home/yando/docs
Press Ctrl-C to quit.
[Sun Jul 8 04:51:00 2012] 192.168.225.5:57229 [200]: /index.php




                                          PHP5.4からの新機能
                                       (PHPだけで開発サーバになる)




        8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
ここまでのまとめ

•ツールを えて
•ソースからビルドしてインストール
•望む構成を得るにはさらに設定が必要


現代の日本人にはこれだけでは不十分


 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
練習: phpをmake
•curl -L -O {url from php.net}
•mv mirror php.tar.gz
•tar zxf php.tar.gz
•yum install make
•cd php-5.4.4
•./configure
•make

   8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
設定と拡張
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
設定と拡張の必要性

•mbstringが使いたい
•MySQLが使いたい
•gdが使いたい
•○○が使いたい
  設定により上記を可能にするのが
       PHP拡張

  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHP拡張




                           MySQLやmbstringは
                                拡張


PHP自体はセットアップできた

8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
configureオプション

•configureの際にオプションを付ける
とビルドされるバイナリ、拡張が変わる
•configure後は再度、ビルドを行う
•ビルド後は変えられない設定も

 どのオプションでビルドされたか?
      がとても重要
 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
オプションの調べ方
•configure --help
•PHPのマニュアルを見る



                           ものすごくたくさん(約250種)




  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
mbstring
  •文字コードの変換などに使う
  •日本では事実上、必須の拡張
$ configure --enable-mbstring
$ make
# make install



              有効にするのは簡単

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
入った!




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
もう一つの方法
  •共有ライブラリ
  •拡張部分が別のバイナリになる
  •有効にするには php.ini の変更も必要
$ configure --enable-mbstring=shared
$ make
# make install
extension=mbstring.so

               一見面倒に見える

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
静的リンクと動的リンク
 静的リンク                  動的リンク


                           PHP
    PHP

  mbstring               mbstring


静的リンクはPHP本体のバイナリに
    拡張が組み込まれる
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
運用上の違い
•静的リンクはバイナリが大きくなる
•動的リンクは かにオーバヘッド
•拡張の更新があった場合
 静的リンクは全コンパイル
 動的リンクはライブラリのみ差替可能


  動的リンクの方が柔軟性が高い

  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
mysql / PDO_MySQL

 •MySQLに接続する機能
 •PHP5.3以前は要MySQL
$ configure --with-mysql --with-pdo-mysql
$ make
# make install


            最近はビルドが簡単に

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
GD

 •PHPから画像の処理を行う拡張
 •リサイズや変換などに使われる
$ configure --enable-gd
$ make
# make install


                     余裕余裕

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
png.h




      libpng-devel が必要

8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
入りました
# yum install libpng-devel
$ configure --enable-gd
$ make
# make install




      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
全部まとめると
$ ./configure --enable-mbstring=shared 
--with-mysql=shared 
--with-pdo-mysql=shared 
--with-gd=shared

                                 はコマンドラインで改行し
                                     たい時に使う




    ./configureオプションが長くなるの
               が世の常
      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
オプションは残る




                      自分のPHPがどのようなオプ
                      ションでコンパイルされたか



8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
php.ini

•PHPの挙動を決める重要な設定
•拡張モジュールの読み込み
•トラブルシュートに欠かせない
•設定の構成や配置はインストール次第


  「php.iniを確認してください」

 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
php.iniの場所

•--with-config-file-path
 通常は/usr/local/lib/php.ini
•--with-config-file-scan-dir
 複数に分割して読み込む
•pnpinfo()からも確認できる
          己のphp.iniを探す

   8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
php.iniの中身




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
php.iniの書き方

•設定名=値
•;(セミコロン)以降はコメント
•ログの出力、表示設定、文字コード、
タイムゾーン、拡張モジュールなどさま
ざまな設定項目

      不適切なphp.iniは危険

 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
特に重要な項目

•display_errors
•date.timezone
•upload_max_filesize
•allow_url_fopen
•extension
•memory_limit
       運用に応じて様々な設定
   8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
練習: 実用的なビルド
$ ./configure --enable-mbstring=shared 
--with-mysql=shared 
--with-pdo-mysql=shared 
--with-gd=shared



 •make
 •make install
 •php.ini-developmentをコピー

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
最適化への道
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPをバリバリ使う

•Apache連携
•APC
•nginx

実際にサービスを安定稼働させる為に
      必要な要素

  8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
mod_php
  •ApacheからPHPを動作させる
  •PHPのソースとApacheが必要
# yum install httpd httpd-devel
$ configure --with-apxs2
$ make
# make install

   出来上がったmod_phpはapacheから
         有効にする
      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
httpd.conf
 •Apacheの設定ファイルに下記を追記

LoadModule php5_module        /usr/lib64/httpd/
modules/libphp5.so
<FilesMatch .php$>
  SetHandler application/x-httpd-php
</FilesMatch>


          Apacheを再起動すれば...

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
動いた




8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
APC

  •PHPスクリプトの解析結果を保存
  •解析抜きでZendEngineが稼働
  •WordPressなら4倍くらい速く
  •スクリプトが多い複雑なコードに効く
  •Key-Value Storeとしても使える
# pecl install apc


       8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
http://vipinkrsahu.blogspot.jp/2010/06/apc-vs-memcache-
               in-joomla-and-magento.html
       8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
php-fpm
  •スーパー高速なnginxで稼働させる
  •実はPHPにはほとんど効果がない
  •SAPIの一種
$ configure --enable-fpm
$ make
# make install


          nginxは画像やCSSに効く

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
SAPI
CLI Apache2 php-fpm などが
           ある




 PHPが外部から呼ばれる窓口

8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
apache + mod_php
     apache         公開ディレクトリ




    mod_php




PHPが不要な時もphpのバ
イナリ込みのapacheが動作
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
nginx + php-fpm
                    公開ディレクトリ
      nginx



    php-fpm
                    .php

      PHPに専念




ファイルを探して返すのみ
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
nginxの導入

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/x86_64/
gpgcheck=0
enabled=1

# yum install nginx


  /etc/yum.repos.d/nginx.repo に追加

      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
/etc/nginx/conf.d/default.conf
 location ~ .php$ {
   root       html;
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
   include     fastcgi_params;
 }

# cp -f /usr/local/etc/php-fpm.conf.default /usr/local/
etc/php-fpm.conf
# cp -f sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# chmod 755 /etc/init.d/php-fpm
# mkdir /var/log/php-fpm
# chown -R nginx:nginx /var/log/php-fpm


        8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
色々設定

 • /etc/nginx/conf.d/default.conf
 •fastcgiparam
 •/usr/local/etc/php-fpm.conf
 •pid user group
# service nginx start
# service php-fpm start



      8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
練習: WordPressを導入
•yum install mysql-server
•service mysqld start
•/usr/share/nginx/html の下が公開
•/etc/nginx/conf.d/default.conf の
   index に index.php を足す




   8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
まとめ
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
ビルドは基本

•全てのものはビルドが必要
•yumなどは便利なので使うべき
•yumで不足がある場合は?
  自分でソースからビルドする
  拡張だけビルドして入れ替える

  PHPに限った話ではない知識

 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHPの構築

•最低でも5.3.x or 5.4.x
•新しいものは早い
•APCも絶対入れるべき
•nginxは状況次第

 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)

8時間耐久 PHP構築の教室