8時間耐久 PHP構築の教室

5,091 views
4,934 views

Published on

ビルドの基本と:

8時間耐久 PHP構築の教室

  1. 1. 8時間耐久PHP構築の教室 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  2. 2. テキスト8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  3. 3. http://tech.a-listers.jp/8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  4. 4. 本日の対象者 PHPを使っている 環境構築が苦手 真っ白になると固まる 実行委員長8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  5. 5. PHPの構築に 関するイロハを徹底的に学びます8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  6. 6. 本日のメニュー PHPの動く仕組み ビルドのイロハ 設定と拡張 最適化への道8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  7. 7. PHPの動く仕組み8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  8. 8. PHPのページが動く時•Webサーバ (Apache等) URLを元にリソースを特定•PHP 指定されたPHPスクリプトを解析•PHP拡張モジュール (C言語) PHPから必要に応じて呼び出される 言語としては2番目のみがPHP 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  9. 9. HTMLを表示する流れ 公開ディレクトリ Webサーバ httpd.conf 公開ディレクトリ どのディレクトリを公開す るか等が設定されているファイルを探して返すのみ8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  10. 10. PHPが動作する流れ Webサーバ 自分で書くのは大抵これ PHP PHP スクリプト 拡張モジュール複数のプログラムが連携8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  11. 11. PHPが動く環境様々なプログラムが協調して 動作する環境 様々な知識が必要8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  12. 12. 自動インストール # yum install php # apt-get install php # port install php5何が起きたか理解している? 訳も分からずコピペしてない? トラブルの原因がわかる? 設定の方法は? 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  13. 13. 根源的な 知識8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  14. 14. 自力での構築と設定 を学ぼう8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  15. 15. 注意運用環境を1から構築するの は時代遅れ付け焼刃の手動構築はかえっ て手間になる8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  16. 16. 補足 今回はVirtualBoxにCentOS6.0のイメージを入れ て使いますCentOs 6.0 base x86_64 http://virtualboxes.org/images/centos/ 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  17. 17. VM設定メモ•DVDメディアを除去•ネットワークをブリッジ接続に•キーボードを us に変えておく /etc/sysconfig/keyboard•複数人ならMacアドレスの変更が必要 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  18. 18. ビルドのイロハ8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  19. 19. ビルドとは?•ソースからバイナリを作る(C言語)•コンパイルとも呼ぶ•その環境用のバイナリを作る 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  20. 20. 自動インストール•バイナリパッケージ•特定の環境用のバイナリを配布•OSやCPUが違うと非互換•RedHutのrpmがきっかけに大流行•WindowsやMacなどでは単純•誰かがどこかでビルドしたもの 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  21. 21. gcc•GNU Compiler Collection•C言語、C++などをコンパイルできる•Richard Stallman (1985)•25年以上現役の超重要ソフトウエア 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  22. 22. gcc入ってる? # which gcc•入ってない /usr/bin/which: no gcc in ....•入ってる /usr/bin/gcc 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  23. 23. gccの導入•gccはバイナリパッケージで入れる•gccにもバージョンがある•gccが古くてビルド失敗なんて事も # yum install gcc 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  24. 24. gccがあれば•gccコマンドでC言語をコンパイル可能•出来たバイナリは実行できる! #include <stdio.h> int main(void) { printf("Hello World"); return 0; } $ gcc hello.c -o hello 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  25. 25. 練習: gccでhello world•まっさらなCentOS6.0•キーボード設定・アカウント設定•reboot•which gcc•yum install gcc•hello worldのソースをコンパイル•出来たバイナリを実行 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  26. 26. これでPHPもいける?•PHPのソースは大量のCのソース•環境に合わせて変更する部分とか•コンパイルする順番も存在周辺のツールも無いとPHPのような大きなソフトウェアは導入できない 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  27. 27. 定番なツール群•autoconf 環境に合わせてビルド設定を行う•make (automake) 順番の考慮や依存関係の解決など複雑なビルドタスクを実行する•sshd (openssl-server) sshで入って作業できると楽 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  28. 28. sshd導入•yum install openssl-server•/etc/ssh/sshd_config に追記 PermitRootLogin  no•近年は攻撃が多いので 認証が理想•sshdの稼働ポートも課題•iptables -F しないと入れない(邪悪) 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  29. 29. autoconf & make•autoconf CentOS6では入ってた•make 入ってないので導入する # yum install make 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  30. 30. 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)
  31. 31. PHPのソース •大量のCのソース群$ find ./ -type f | grep ".c" | wc 905 905 27290 •大まかなレイアウトを知っておくとト ラブル解決に役立つ 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  32. 32. PHPのソース PHP内部の肝はZend Engine拡張はエンジンの機能で作られる8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  33. 33. PHPのソース8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  34. 34. あの関数もCで書かれている なにやら怪しい記述 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  35. 35. そういう事か$ 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)
  36. 36. PHPのビルドの流れ•configure ビルドに必要なライブラリの確認等•make バイナリを作る•make install 出来上がったバイナリをコピー 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  37. 37. ./configure してみた libxml2が無いらしい...8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  38. 38. libxml2# yum install libxml2 OK! 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  39. 39. ./configure してみたが? libxml2が無いらしい... (libxml2-devel も入れよう)8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  40. 40. ./configure 成功!8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  41. 41. make 時間がかかる (ファンも回る)8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  42. 42. 数分後... バイナリが出来た!8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  43. 43. make installの前に•make installをするとシステムに投入•システムの挙動が変わる•ビルドまでの作業はrootは不要•コマンドラインを使って動作確認 PHPに限った話ではありません 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  44. 44. 動作確認$ ./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 ZendTechnologies$ ./sapi/cli/php -r echo "Hello Wolrdn";Hello Wolrd なんか動きそう? 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  45. 45. よろしい 一応インストール完了8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  46. 46. 甘ぇよ... MySQLが無い mbstringが無い gdが無い etc.. WordPressとか 動かない8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  47. 47. 動かすだけなら...$ 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)
  48. 48. ここまでのまとめ•ツールを えて•ソースからビルドしてインストール•望む構成を得るにはさらに設定が必要現代の日本人にはこれだけでは不十分 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  49. 49. 練習: 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)
  50. 50. 設定と拡張8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  51. 51. 設定と拡張の必要性•mbstringが使いたい•MySQLが使いたい•gdが使いたい•○○が使いたい 設定により上記を可能にするのが PHP拡張 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  52. 52. PHP拡張 MySQLやmbstringは 拡張PHP自体はセットアップできた8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  53. 53. configureオプション•configureの際にオプションを付けるとビルドされるバイナリ、拡張が変わる•configure後は再度、ビルドを行う•ビルド後は変えられない設定も どのオプションでビルドされたか? がとても重要 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  54. 54. オプションの調べ方•configure --help•PHPのマニュアルを見る ものすごくたくさん(約250種) 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  55. 55. mbstring •文字コードの変換などに使う •日本では事実上、必須の拡張$ configure --enable-mbstring$ make# make install 有効にするのは簡単 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  56. 56. 入った!8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  57. 57. もう一つの方法 •共有ライブラリ •拡張部分が別のバイナリになる •有効にするには php.ini の変更も必要$ configure --enable-mbstring=shared$ make# make installextension=mbstring.so 一見面倒に見える 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  58. 58. 静的リンクと動的リンク 静的リンク 動的リンク PHP PHP mbstring mbstring静的リンクはPHP本体のバイナリに 拡張が組み込まれる8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  59. 59. 運用上の違い•静的リンクはバイナリが大きくなる•動的リンクは かにオーバヘッド•拡張の更新があった場合 静的リンクは全コンパイル 動的リンクはライブラリのみ差替可能 動的リンクの方が柔軟性が高い 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  60. 60. mysql / PDO_MySQL •MySQLに接続する機能 •PHP5.3以前は要MySQL$ configure --with-mysql --with-pdo-mysql$ make# make install 最近はビルドが簡単に 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  61. 61. GD •PHPから画像の処理を行う拡張 •リサイズや変換などに使われる$ configure --enable-gd$ make# make install 余裕余裕 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  62. 62. png.h libpng-devel が必要8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  63. 63. 入りました# yum install libpng-devel$ configure --enable-gd$ make# make install 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  64. 64. 全部まとめると$ ./configure --enable-mbstring=shared --with-mysql=shared --with-pdo-mysql=shared --with-gd=shared はコマンドラインで改行し たい時に使う ./configureオプションが長くなるの が世の常 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  65. 65. オプションは残る 自分のPHPがどのようなオプ ションでコンパイルされたか8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  66. 66. php.ini•PHPの挙動を決める重要な設定•拡張モジュールの読み込み•トラブルシュートに欠かせない•設定の構成や配置はインストール次第 「php.iniを確認してください」 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  67. 67. php.iniの場所•--with-config-file-path 通常は/usr/local/lib/php.ini•--with-config-file-scan-dir 複数に分割して読み込む•pnpinfo()からも確認できる 己のphp.iniを探す 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  68. 68. php.iniの中身8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  69. 69. php.iniの書き方•設定名=値•;(セミコロン)以降はコメント•ログの出力、表示設定、文字コード、タイムゾーン、拡張モジュールなどさまざまな設定項目 不適切なphp.iniは危険 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  70. 70. 特に重要な項目•display_errors•date.timezone•upload_max_filesize•allow_url_fopen•extension•memory_limit 運用に応じて様々な設定 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  71. 71. 練習: 実用的なビルド$ ./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)
  72. 72. 最適化への道8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  73. 73. PHPをバリバリ使う•Apache連携•APC•nginx実際にサービスを安定稼働させる為に 必要な要素 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  74. 74. 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)
  75. 75. 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)
  76. 76. 動いた8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  77. 77. APC •PHPスクリプトの解析結果を保存 •解析抜きでZendEngineが稼働 •WordPressなら4倍くらい速く •スクリプトが多い複雑なコードに効く •Key-Value Storeとしても使える# pecl install apc 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  78. 78. http://vipinkrsahu.blogspot.jp/2010/06/apc-vs-memcache- in-joomla-and-magento.html 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  79. 79. php-fpm •スーパー高速なnginxで稼働させる •実はPHPにはほとんど効果がない •SAPIの一種$ configure --enable-fpm$ make# make install nginxは画像やCSSに効く 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  80. 80. SAPICLI Apache2 php-fpm などが ある PHPが外部から呼ばれる窓口8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  81. 81. apache + mod_php apache 公開ディレクトリ mod_phpPHPが不要な時もphpのバイナリ込みのapacheが動作8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  82. 82. nginx + php-fpm 公開ディレクトリ nginx php-fpm .php PHPに専念ファイルを探して返すのみ8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  83. 83. nginxの導入[nginx]name=nginx repobaseurl=http://nginx.org/packages/centos/6/x86_64/gpgcheck=0enabled=1# yum install nginx /etc/yum.repos.d/nginx.repo に追加 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  84. 84. /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)
  85. 85. 色々設定 • /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)
  86. 86. 練習: 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)
  87. 87. まとめ8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  88. 88. ビルドは基本•全てのものはビルドが必要•yumなどは便利なので使うべき•yumで不足がある場合は?  自分でソースからビルドする  拡張だけビルドして入れ替える PHPに限った話ではない知識 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)
  89. 89. PHPの構築•最低でも5.3.x or 5.4.x•新しいものは早い•APCも絶対入れるべき•nginxは状況次第 8時間耐久PHP構築の教室 / Yusuke Ando (@yando)

×