8時間耐久 php構築の教室
DESCRIPTION
ビルドの基本と:TRANSCRIPT
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
PHP構築の教室8時間耐久
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
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_64http://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言語をコンパイル可能•出来たバイナリは実行できる!
$ gcc hello.c -o hello
#include <stdio.h>
int main(void) { printf("Hello World"); return 0;}
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 に追記
•近年は攻撃が多いので鍵認証が理想•sshdの稼働ポートも課題•iptables -F しないと入れない(邪悪)
PermitRootLogin no
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のソース
$ find ./ -type f | grep "\.c" | wc 905 905 27290
•大量のCのソース群
•大まかなレイアウトを知っておくとトラブル解決に役立つ
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
OK!
# yum install libxml2
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 -vPHP 5.4.4 (cli) (built: Jul 8 2012 04:15:27) Copyright (c) 1997-2012 The PHP GroupZend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
$ ./sapi/cli/php -r 'echo "Hello Wolrd\n";'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:8000PHP 5.4.4 Development Server started at Sun Jul 8 04:50:57 2012Listening on 192.168.225.15:8000Document root is /home/yando/docsPress 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拡張
PHP自体はセットアップできた
MySQLやmbstringは拡張
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)
静的リンクと動的リンク
PHPPHP
mbstringmbstring
静的リンク 動的リンク
静的リンクは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オプションが長くなるのが世の常
$ ./configure --enable-mbstring=shared \--with-mysql=shared \--with-pdo-mysql=shared \--with-gd=shared
\ はコマンドラインで改行したい時に使う
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)
練習: 実用的なビルド
•make•make install•php.ini-developmentをコピー
$ ./configure --enable-mbstring=shared \--with-mysql=shared \--with-pdo-mysql=shared \--with-gd=shared
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が必要
出来上がったmod_phpはapacheから有効にする
# yum install httpd httpd-devel$ configure --with-apxs2$ make# make install
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
httpd.conf•Apacheの設定ファイルに下記を追記
Apacheを再起動すれば...
LoadModule php5_module /usr/lib64/httpd/modules/libphp5.so<FilesMatch \.php$> SetHandler application/x-httpd-php</FilesMatch>
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の一種
nginxは画像やCSSに効く
$ configure --enable-fpm$ make# make install
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
SAPICLI Apache2 php-fpm などが
ある
PHPが外部から呼ばれる窓口
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
apache + mod_phpapache 公開ディレクトリ
PHPが不要な時もphpのバイナリ込みのapacheが動作
mod_php
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
nginx + php-fpmnginx 公開ディレクトリ
ファイルを探して返すのみ
php-fpm.php
PHPに専念
8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
nginxの導入
/etc/yum.repos.d/nginx.repo に追加
[nginx]name=nginx repobaseurl=http://nginx.org/packages/centos/6/x86_64/gpgcheck=0enabled=1
# yum install nginx
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は状況次第