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

8時間耐久 PHP構築の教室

  • Upload
    yandod

  • View
    4.462

  • Download
    1

Embed Size (px)

DESCRIPTION

ビルドの基本と:

Citation preview

Page 1: 8時間耐久 PHP構築の教室

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

PHP構築の教室8時間耐久

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

Page 2: 8時間耐久 PHP構築の教室

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

テキスト

Page 3: 8時間耐久 PHP構築の教室

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

http://tech.a-listers.jp/

Page 4: 8時間耐久 PHP構築の教室

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

本日の対象者PHPを使っている環境構築が苦手

真っ白になると固まる実行委員長

Page 5: 8時間耐久 PHP構築の教室

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

PHPの構築に関するイロハを徹底的に学びます

Page 6: 8時間耐久 PHP構築の教室

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

本日のメニュー

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

Page 7: 8時間耐久 PHP構築の教室

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

PHPの動く仕組み

Page 8: 8時間耐久 PHP構築の教室

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

PHPのページが動く時•Webサーバ (Apache等) URLを元にリソースを特定•PHP 指定されたPHPスクリプトを解析•PHP拡張モジュール (C言語) PHPから必要に応じて呼び出される

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

Page 9: 8時間耐久 PHP構築の教室

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

HTMLを表示する流れWebサーバ 公開ディレクトリ

ファイルを探して返すのみ

httpd.conf公開ディレクトリ

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

Page 10: 8時間耐久 PHP構築の教室

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

PHPが動作する流れWebサーバ

PHPスクリプト

複数のプログラムが連携

PHP

拡張モジュール

自分で書くのは大抵これ

Page 11: 8時間耐久 PHP構築の教室

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

PHPが動く環境

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

様々な知識が必要

Page 12: 8時間耐久 PHP構築の教室

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

自動インストール

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

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

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

Page 13: 8時間耐久 PHP構築の教室

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

根源的な知識

Page 14: 8時間耐久 PHP構築の教室

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

自力での構築と設定を学ぼう

Page 15: 8時間耐久 PHP構築の教室

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

注意

運用環境を1から構築するのは時代遅れ

付け焼刃の手動構築はかえって手間になる

Page 16: 8時間耐久 PHP構築の教室

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

補足

今回はVirtualBoxにCentOS6.0のイメージを入れ

て使います

CentOs 6.0 base x86_64http://virtualboxes.org/images/centos/

Page 17: 8時間耐久 PHP構築の教室

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

VM設定メモ

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

Page 18: 8時間耐久 PHP構築の教室

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

ビルドのイロハ

Page 19: 8時間耐久 PHP構築の教室

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

ビルドとは?

•ソースからバイナリを作る(C言語)•コンパイルとも呼ぶ•その環境用のバイナリを作る

Page 20: 8時間耐久 PHP構築の教室

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

自動インストール

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

Page 21: 8時間耐久 PHP構築の教室

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

gcc•GNU Compiler Collection•C言語、C++などをコンパイルできる•Richard Stallman (1985)•25年以上現役の超重要ソフトウエア

Page 22: 8時間耐久 PHP構築の教室

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

gcc入ってる?

# which gcc

/usr/bin/which: no gcc in ....

/usr/bin/gcc

•入ってない

•入ってる

Page 23: 8時間耐久 PHP構築の教室

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

gccの導入

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

# yum install gcc

Page 24: 8時間耐久 PHP構築の教室

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

gccがあれば•gccコマンドでC言語をコンパイル可能•出来たバイナリは実行できる!

$ gcc hello.c -o hello

#include <stdio.h>

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

Page 25: 8時間耐久 PHP構築の教室

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

練習: gccでhello world•まっさらなCentOS6.0•キーボード設定・アカウント設定•reboot•which gcc•yum install gcc•hello worldのソースをコンパイル•出来たバイナリを実行

Page 26: 8時間耐久 PHP構築の教室

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

これでPHPもいける?

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

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

Page 27: 8時間耐久 PHP構築の教室

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

定番なツール群•autoconf 環境に合わせてビルド設定を行う•make (automake) 順番の考慮や依存関係の解決など複雑なビルドタスクを実行する•sshd (openssl-server) sshで入って作業できると楽

Page 28: 8時間耐久 PHP構築の教室

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

sshd導入•yum install openssl-server•/etc/ssh/sshd_config に追記

•近年は攻撃が多いので鍵認証が理想•sshdの稼働ポートも課題•iptables -F しないと入れない(邪悪)

PermitRootLogin  no

Page 29: 8時間耐久 PHP構築の教室

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

autoconf & make•autoconf CentOS6では入ってた•make 入ってないので導入する

# yum install make

Page 30: 8時間耐久 PHP構築の教室

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

Page 31: 8時間耐久 PHP構築の教室

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

PHPのソース

$ find ./ -type f | grep "\.c" | wc 905 905 27290

•大量のCのソース群

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

Page 32: 8時間耐久 PHP構築の教室

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

PHPのソース

PHP内部の肝はZend Engine拡張はエンジンの機能で作られる

Page 33: 8時間耐久 PHP構築の教室

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

PHPのソース

Page 34: 8時間耐久 PHP構築の教室

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

あの関数もCで書かれている

なにやら怪しい記述

Page 35: 8時間耐久 PHP構築の教室

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"

Page 36: 8時間耐久 PHP構築の教室

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

PHPのビルドの流れ•configure ビルドに必要なライブラリの確認等•make バイナリを作る•make install 出来上がったバイナリをコピー

Page 37: 8時間耐久 PHP構築の教室

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

./configure してみた

libxml2が無いらしい...

Page 38: 8時間耐久 PHP構築の教室

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

libxml2

OK!

# yum install libxml2

Page 39: 8時間耐久 PHP構築の教室

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

./configure してみたが?

libxml2が無いらしい...(libxml2-devel も入れよう)

Page 40: 8時間耐久 PHP構築の教室

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

./configure 成功!

Page 41: 8時間耐久 PHP構築の教室

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

make

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

Page 42: 8時間耐久 PHP構築の教室

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

数分後...

バイナリが出来た!

Page 43: 8時間耐久 PHP構築の教室

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

make installの前に

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

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

Page 44: 8時間耐久 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

Page 45: 8時間耐久 PHP構築の教室

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

よろしい

一応インストール完了

Page 46: 8時間耐久 PHP構築の教室

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

甘ぇよ...

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

WordPressとか動かない

Page 47: 8時間耐久 PHP構築の教室

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だけで開発サーバになる)

Page 48: 8時間耐久 PHP構築の教室

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

ここまでのまとめ

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

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

Page 49: 8時間耐久 PHP構築の教室

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

Page 50: 8時間耐久 PHP構築の教室

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

設定と拡張

Page 51: 8時間耐久 PHP構築の教室

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

設定と拡張の必要性

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

PHP拡張

Page 52: 8時間耐久 PHP構築の教室

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

PHP拡張

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

MySQLやmbstringは拡張

Page 53: 8時間耐久 PHP構築の教室

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

configureオプション

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

どのオプションでビルドされたか?がとても重要

Page 54: 8時間耐久 PHP構築の教室

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

オプションの調べ方•configure --help•PHPのマニュアルを見る

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

Page 55: 8時間耐久 PHP構築の教室

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

mbstring•文字コードの変換などに使う•日本では事実上、必須の拡張

有効にするのは簡単

$ configure --enable-mbstring$ make# make install

Page 56: 8時間耐久 PHP構築の教室

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

入った!

Page 57: 8時間耐久 PHP構築の教室

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

もう一つの方法•共有ライブラリ•拡張部分が別のバイナリになる•有効にするには php.ini の変更も必要

一見面倒に見える

$ configure --enable-mbstring=shared$ make# make install

extension=mbstring.so

Page 58: 8時間耐久 PHP構築の教室

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

静的リンクと動的リンク

PHPPHP

mbstringmbstring

静的リンク 動的リンク

静的リンクはPHP本体のバイナリに拡張が組み込まれる

Page 59: 8時間耐久 PHP構築の教室

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

運用上の違い•静的リンクはバイナリが大きくなる•動的リンクは僅かにオーバヘッド•拡張の更新があった場合 静的リンクは全コンパイル 動的リンクはライブラリのみ差替可能

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

Page 60: 8時間耐久 PHP構築の教室

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

mysql / PDO_MySQL

•MySQLに接続する機能•PHP5.3以前は要MySQL

最近はビルドが簡単に

$ configure --with-mysql --with-pdo-mysql$ make# make install

Page 61: 8時間耐久 PHP構築の教室

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

GD

•PHPから画像の処理を行う拡張•リサイズや変換などに使われる

余裕余裕

$ configure --enable-gd$ make# make install

Page 62: 8時間耐久 PHP構築の教室

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

png.h

libpng-devel が必要

Page 63: 8時間耐久 PHP構築の教室

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

入りました# yum install libpng-devel$ configure --enable-gd$ make# make install

Page 64: 8時間耐久 PHP構築の教室

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

全部まとめると

./configureオプションが長くなるのが世の常

$ ./configure --enable-mbstring=shared \--with-mysql=shared \--with-pdo-mysql=shared \--with-gd=shared

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

Page 65: 8時間耐久 PHP構築の教室

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

オプションは残る

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

Page 66: 8時間耐久 PHP構築の教室

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

php.ini

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

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

Page 67: 8時間耐久 PHP構築の教室

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

php.iniの場所

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

己のphp.iniを探す

Page 68: 8時間耐久 PHP構築の教室

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

php.iniの中身

Page 69: 8時間耐久 PHP構築の教室

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

php.iniの書き方

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

不適切なphp.iniは危険

Page 70: 8時間耐久 PHP構築の教室

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

特に重要な項目

•display_errors•date.timezone•upload_max_filesize•allow_url_fopen•extension•memory_limit

運用に応じて様々な設定

Page 71: 8時間耐久 PHP構築の教室

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

Page 72: 8時間耐久 PHP構築の教室

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

最適化への道

Page 73: 8時間耐久 PHP構築の教室

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

PHPをバリバリ使う

•Apache連携•APC•nginx

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

Page 74: 8時間耐久 PHP構築の教室

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

Page 75: 8時間耐久 PHP構築の教室

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>

Page 76: 8時間耐久 PHP構築の教室

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

動いた

Page 77: 8時間耐久 PHP構築の教室

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

APC

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

# pecl install apc

Page 79: 8時間耐久 PHP構築の教室

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

php-fpm•スーパー高速なnginxで稼働させる•実はPHPにはほとんど効果がない•SAPIの一種

nginxは画像やCSSに効く

$ configure --enable-fpm$ make# make install

Page 80: 8時間耐久 PHP構築の教室

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

SAPICLI Apache2 php-fpm などが

ある

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

Page 81: 8時間耐久 PHP構築の教室

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

apache + mod_phpapache 公開ディレクトリ

PHPが不要な時もphpのバイナリ込みのapacheが動作

mod_php

Page 82: 8時間耐久 PHP構築の教室

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

nginx + php-fpmnginx 公開ディレクトリ

ファイルを探して返すのみ

php-fpm.php

PHPに専念

Page 83: 8時間耐久 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

Page 84: 8時間耐久 PHP構築の教室

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

Page 85: 8時間耐久 PHP構築の教室

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

Page 86: 8時間耐久 PHP構築の教室

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 を足す

Page 87: 8時間耐久 PHP構築の教室

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

まとめ

Page 88: 8時間耐久 PHP構築の教室

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

ビルドは基本

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

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

Page 89: 8時間耐久 PHP構築の教室

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

PHPの構築

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