Category Archives: サーバー管理

さくらのレンタルサーバでpyenvとDjangoを動かす

さくらのレンタルサーバとは

VPSとは異なり,OSの管理をさくらインターネットが行い,一部の権限だけをユーザーが持つホスティングサービスです.
root権限のあるVPSとは違い,できることと使えるリソースは限られますが以下の機能がセットアップなしで利用できます.
さらに,OSやApacheのセキュリティアップデートなどのメンテナンスもさくらが行うので,(自分が設置したもの以外)メンテナンスを意識せずに使えるため,これまでVPSでやってきた人にとっても思った以上に便利だと思います.

  • ApacheによるWebサーバ + CGI
  • メールサーバ (SMTP/POP3/IMAP)
  • データベースサーバ(MySQL)
  • PHP, Python, 等々のコマンド
  • CRON

詳しい仕様は サービスサイト に任せるとして本題に入ります.

ある程度ApacheやDjangoについて理解できている人向けにあっさりと説明します.

Djangoを動かす

一般的な設置方法との違い

レンサバのApacheには mod_wsgi のようなPython向けのモジュールが入っていないため,一般的なデプロイ方法では設置できません.また,常時起動のデーモンプロセスを起動させることもできないため,FastCGIサーバとしてDjangoを動作させることもできません.
そこで,言語問わずCGIモードに対応していることを用いてCGIとしてDjangoを動かします.

Djangoのアプリケーションを作成する

今回はデプロイの説明のため,Webアプリケーションの作成に関しては触れません.サンプルとして以下に公開しているDjangoのプロジェクトを利用して説明します.

chibiegg/django-example-python2

さくらのレンタルサーバを契約する

さくらのレンタルサーバオンラインサインアップ より,さくらのレンタルサーバを契約します.MySQLはスタンダードプラン以上で利用できます.すでに契約しているひとは持っているアカウントでOKです!

2週間の無料お試し期間もあります.(この記事も2週間お試し期間をつかって書いています)

契約すると,仮登録完了メール等でパスワードが通知され,最終的に以下のようなコントロールパネルにログインできると思います.

さくらのレンタルサーバコントロールパネル

今回は初期ドメイン chibiegg-201505.sakura.ne.jp で契約したとして説明します.

データベースを作成する

コンパネ左のメニューから データベースの設定 をクリックします.

データベースの管理メニュー

“データベースの新規作成” をクリックし,適当なデータベース名とパスワードを決めて,データベースを作成します.
パスワードは今後作成する全てのデータベースで共通になります.(変更可能)
また,文字コードはUTF-8を指定します.

データベースの作成

作成後に表示されるデータベースサーバ名を控えておきます.(いつでも参照可能です)

今回は mysql508.db.sakura.ne.jp でした.

SSHでログインして作業する

サブディレクトリを初期ドメインのルートディレクトリにする

標準では /home/chibiegg-201505/www/ がルートディレクトリになりますが,さくらのレンタルサーバでは一つの契約で複数のドメインのWebサイトを提供できます.このとき,ドメインごとに別ディレクトリを指定すると便利なので, /home/chibiegg-201505/www/chibiegg-201505.sakura.ne.jp/htdocs/chibiegg-201505.sakura.ne.jp のルートディレクトリになるように ~/www/.htaccess を作成します.

RewriteEngine on
RewriteCond %{HTTP_HOST} chibiegg-201505.sakura.ne.jp [NC]
RewriteCond %{REQUEST_URI} !(^/chibiegg-201505.sakura.ne.jp) [NC]
RewriteRule .* /chibiegg-201505.sakura.ne.jp/htdocs%{REQUEST_URI} [L]

pyenvのセットアップ

標準ではPythonのバージョンが2系しかなく,また,pipなども利用できないため,pyenvpyenv-virtualenv を利用し,プロジェクトごとにバージョンとパッケージを選択できるようにします.

pyenvに関しては基本的に一般的な方法そのままです.

git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

でインストールし, ~/.bash_profile を以下のようにします.

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export TMPDIR="$HOME/tmp"
export PYTHON_PATH=./
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

今後pyenvを使うときは bash を使います.

chsh -s /usr/local/bin/bash
bash
source ~/.bash_profile

次回からはSSHログイン時にbashが起動します.

今回のプロジェクトで使う環境をセットアップする

pyenv install 2.7.9
pyenv virtualenv 2.7.9 django-example-python2
pyenv activate django-example-python2
pip install django mysqlclient

Djangoのファイルを設置する

bash
mkdir -p ~/www/chibiegg-201505.sakura.ne.jp/htdocs
cd ~/www/chibiegg-201505.sakura.ne.jp
git clone https://github.com/chibiegg/django-example-python2.git
cd django-example-python2
pyenv local django-example-python2

Djangoの設定ファイルを修正する

~/www/chibiegg-201505.sakura.ne.jp/django-example-python2/src/myprj/production_settings.py を以下のように編集します.

この時,ディレクトリやホスト名,データベースの接続情報は環境に合わせてください.

# encoding=utf-8

from .settings import *

DEBUG = False
ALLOWED_HOSTS = ["chibiegg-201505.sakura.ne.jp"]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'chibiegg-201505_myprj',
        'USER': 'chibiegg-201505',
        'PASSWORD': 'PASSWORDISHERE',
        'HOST': 'mysql508.db.sakura.ne.jp',
        'OPTIONS': {
               "init_command": "SET storage_engine=InnoDB",
        }
    }
}

STATIC_URL = '/static/'
STATIC_ROOT = '/home/chibiegg-201505/www/chibiegg-201505.sakura.ne.jp/htdocs/static/'

migrate (syncdb) する

VPSの時と同じようにモデルからテーブルを作成し,スーパーユーザの作成と,静的ファイルの生成を行います.

cd ~/www/chibiegg-201505.sakura.ne.jp/django-example-python2/src
python manage.py migrate --settings=myprj.production_settings
python manage.py createsuperuser --settings=myprj.production_settings
python manage.py collectstatic --settings=myprj.production_settings

CGIを作成する

ここまでは,どこにデプロイするときも同じです.本来であれば,mod_wsgiや,FastCGI(gunicorn)を使いますが,CGIモードで動かすためにcgiのスクリプトを ~/www/chibiegg-201505.sakura.ne.jp/htdocs/django.cgi に作成します.

ひな形を用意してますので,ダウンロードして使います.

cd ~/www/chibiegg-201505.sakura.ne.jp/htdocs
wget --no-check-certificate https://raw.githubusercontent.com/chibiegg/django-cgi/master/django-python2.cgi
mv django-python2.cgi django.cgi
chmod +x django.cgi

このスクリプトには,実行環境に合わせて3箇所編集・追記する場所があります.

pythonのバイナリの場所を指定する

一行目のpythonのパスを,pyenvの環境のpythonにします.
今回は /home/chibiegg-201505/.pyenv/versions/django-example-python2/bin/python ですので,一行目を以下のようにしました.

#!/home/chibiegg-201505/.pyenv/versions/django-example-python2/bin/python

プロジェクトのパスを追加する

# Change this to the directory above your site code. の行の後にDjangoのプロジェクトのパスを追加します.

sys.path.append("/home/chibiegg-201505/www/chibiegg-201505.sakura.ne.jp/django-example-python2/src")

利用するDjangoの設定を指定する

末尾のほうの application.settings を今回利用する myprj.production_settings に変更します.

.htaccessでリダイレクトの設定をする

ここまでで http://chibiegg-201505.sakura.ne.jp/django.cgi/admin/ にアクセスしてみましょう.
ちゃんとDjangoの管理サイトにアクセスできると思います.

Django管理サイト

ただ,これではカッコ悪いので,ちゃんとRewriteでURLを /admin/ だけになるようにしましょう.

~/www/chibiegg-201505.sakura.ne.jp/htdocs/.htaccess を以下のように作成します.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /django.cgi/$1 [QSA,L]
</IfModule>

これで http://chibiegg-201505.sakura.ne.jp/admin/ でちゃんとアクセスできるようになりました.

Python3を使う場合

pyenvを入れたのでPython3系列も利用可能です.CGIファイルがバージョンによってことなりますので,

https://raw.githubusercontent.com/chibiegg/django-cgi/master/django-python3.cgi

を利用してください.

さくらのVPSでつくるHAクラスタ(その1)

ここ最近,Zabbixが動いてるサーバが止まって,障害がおきてることにすら気づかなかったり…,と冗長化しないとなぁと思うことが増えたので,Heartbeat + Pacemaker + DRBD + OCFS2 + LXC をつかってさくらのVPS二台で冗長化する構成を構築してみました.ほかのところでも使えると思うので,メモも兼ねて書いておこうと思います.

Pacemakerで管理するリソースは次のようになります.

  • LXCからインターネットに出る際のゲートウェイIPアドレス(仮想IPアドレス)
  • LXCにIPアドレスを配布するDHCPサーバとローカル用DNSサーバ(Dnsmasq)
  • DRBD
  • ファイルシステムOCFS2のマウント
  • LXCコンテナの起動

これだけ設定するとPacemakerのリソースモニタはこんな感じになります.

リソースモニタ

0 はじめに

これを実現するまでに,次の手順を踏みました.

  1. さくらのVPSを2台,同一リージョンで契約
  2. Ubuntuのインストール
  3. ローカル接続を使って2台のVPSを接続
  4. LXC用のブリッジインターフェースの作成と接続
  5. HeartbeatとPacemakerのセットアップ
  6. DRBDのセットアップ
  7. OCFS2のセットアップ
  8. LXCのセットアップ
  9. Dnsmasqのセットアップ
  10. アプリケーションの用途毎のコンテナの作成とNAPT等の設定

結構長くなると思うので,いくつかの記事にわけようと思います.

1 さくらのVPSの契約

まずはさくらのVPSを借りないと始まらないので,契約します.このときローカル接続するために同一リージョンで契約します.
また,データベース等,ディスクアクセスが多いアプリケーションを稼働させる場合にはSSDプランを選択したほうが良いと思います.

さくらのVPSプラン一覧

SSDプランの時点で石狩DC確定ですね.SSD 2Gプランを2台用意しました.

と,ここで出かける時間になったので続きはその2で.

RTX1200でDHCPとDDNS

自宅のネットワークの上流にはRTX1200が居るのですが,DHCPサーバや,静的なレコードを登録できるDNSサーバになれるので,DHCPサーバとかDNSサーバを別途立てるのはめんどくさいけど,或る程度細かく設定したいという場合に大変便利です.

しかし,DHCPとDNSが互いに連携していないので,DHCPで配布したアドレスをホスト名で名前解決をすることはできません.

そこで,LuaスクリプトでSYSLOGを監視し,DHCPでIPの払い出しを行ったら,show status dhcp summaryからホスト名を検索し,静的DNSレコードを自動で登録するようにしてみました.

公式のサンプルのおかげで初めてでもあっという間にできました.

--[[

  ●DHCPによるDDNS
  DHCPDのSYSLOGを監視し、検出したら当該のホスト名とIPアドレス対を
  静的DNSレコードとして登録

]]

--------------------------##  設定値  ##--------------------------------

-- 検出したい SYSLOG の文字列パターン
ptn = "%[DHCPD%]"

-- MACアドレス検出の文字列パターン
ip_ptn = "%d+%.%d+%.%d+%.%d+"
mac_ptn = "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x"
base_dn = "hogehoge.local"

-- 出力する SYSLOG のレベル (info, debug, notice)
log_level = "info"        -- ★

------------------------------------------------------------
-- ホスト名検索                                             --
------------------------------------------------------------
function search_host_by_mac(mac)

        rtn, str = rt.command("show status dhcp summary")
        ipaddr, host = string.match(str, "("..ip_ptn.."):%s+"..mac..",%s+([%a%w%p]+)")

        return ipaddr, host
end

function search_host_by_ip(ipaddr)

        rtn, str = rt.command("show status dhcp summary")
        host = string.match(str, ipaddr..":%s+([%a%w%p]+)")

        return ipaddr, host
end

------------------------------------------------------------
-- メインルーチン                                         --
------------------------------------------------------------
local rtn, str
local buf

while (true) do
        rtn, str = rt.syslogwatch(ptn)
        ip,mac = string.match(str[1], "("..ip_ptn.."):%s+("..mac_ptn..")")
        if (mac) then
                ipaddr, host = search_host_by_mac(mac)

                if (host == nil) then
                    ipaddr, host = search_host_by_ip(ip)
                end

                if (host) then
                        buf = host .. "@" .. ipaddr
                        rt.syslog(log_level, "[Lua] Host detect " .. buf)

                        rt.command("no ip host "..host.."."..base_dn)
                        rt.command("ip host "..host.."."..base_dn.." "..ipaddr)
                        rt.command("clear dns cache")
                end
        end
end

このスクリプトをschedule at 2 startup * lua /dhcp_ddns.luaのように自動実行するようにしておけば,hostname.hogehoge.local等の名前解決ができるようになります.

居なくなったホストの削除が無いので流動的な環境では一定期間で削除するような処理が要るかも…

こうやって拡張出来るのがいいですねー

  • ホスト名に数字が含まれていると途中で切れる問題を修正しました
  • ホスト名登録後DNSのキャッシュをクリアするようにしました

nginxでSSL/TLSを使う

今回はSSL(https)を使えるようにするような設定をnginxにしてみようと思います。

証明書の取得

本来はSECOMやVeriSign等に有料で証明してもらうのですが、今回は以前にも紹介したCACertを載せときます。

ということで、証明書の取得は省略します。とりあえず、サーバーの秘密鍵 server.key と サーバーの証明書 server.cer が手に入った事にします。

nginxに設定

nginxでの設定は簡単で、既存の設定をコピーして、80番ではなく443番に変更し、SSLを有効にしてサーバーの鍵・証明書のファイルを指定してあげるだけです。

ちょっとその部分だけ書いてみます。

server {
	listen   443 default_server ssl;
	server_name	_;
	ssl_certificate /keys/server.cer;
	ssl_certificate_key /keys/server.key;

	location / {
		この辺は適当に
	}
}

リバースプロキシとしてnginxとして使っている場合も同様です。

名前ベースのバーチャルホストを使っている場合

ドメイン名を複数つかってバーチャルホストを使っている場合もあると思います。SSLではアクセスされたサーバー名がわかる前に証明書を渡さなければならないので、名前ベースのバーチャルホストでSSLは利用できませんでした。

が、SNI(Server Name Indication)というプロトコル拡張ができたので、名前ベースのバーチャルホストでも可能になりました。(ブラウザによっては対応してません)

設定は簡単で、httpと同じくserver_nameを設定するだけです。

リバースプロキシとして使っている場合は、証明書を変えるために、バーチャルホストの数だけServerディレクティブを作ってあげてください。

 

 

nginxでプロキシ&キャッシュサーバー

(多分)一般的なWebサーバーであるApacheは複雑な設定も可能で便利なのですが、その分重いのです。

どう重いのかというと、Apacheは一つのプロセスが一つのHTTPリクエストを同期処理で裁いてるのでその間は他の処理をしません。なので、同時アクセス数が増えるとApacheはプロセスをどんどん生成します。(あるいは後からきたリクエストを待たせる)

なので、アクセス数が増えると急激にパフォーマンスが落ちるという問題を抱えてます。(ほかにもプロセスIDが足りなくなってどんなにリソースがあっても最大プロセスIDで制限されてしまう)

で、最近話題のハイパフォーマンスWebサーバーがnginx(えんじんえっくす)です。

nginxは一つのプロセスで複数のリクエストを非同期で同時に処理します。なので、アクセス数が増えてもパフォーマンスが落ちにくいという特性があります。特に静的ファイルの場合は処理のほとんどがI/O待ちなので効果が大きいです。

そこで、PHPとかSVNとか設定がめんどくさいものはApacheに任せておいて、静的なファイルだけをnginxに処理させてみると、Apacheへのリクエスト数は激減するはずです。

例えば、このブログのトップページの場合PHPで生成されるHTMLが一個にたいして、CSSや画像等の静的ファイルが20個近くあります。単純計算で21個のリクエストのうち1個だけがApacheで処理されるのでApacheへのリクエストは約95%削減されます。

では設定してみましょう。OSはUbuntu Server 10.04(64bit)です。Apacheは既にインストール済みで運用されているとします。設定後はnginxがポート80で待ち受けて、Apacheはポート8080で待ち受けるということにします。

(記事の最後でキャッシュファイルをRAMに置くというのもやってみます)

Read more …

WordPressはどうすれば速くなるのか、検証実験

さっきの投稿でWordPressが遅い事を書きました。で、先輩のさくらのVPS(nginx+fastcgi)では速いってことも書きました。

ということで、僕も借りてるさくらのVPSで一からセットアップして実験してみました。OSはデフォルトではなくUbuntu 10.04が入ってます。

今回検証したのは、WebサーバーはApache/2.2.14とnginx/1.0.9、RDBMはMySQL(Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (x86_64) using readline 6.1)とPostgreSQL/8.4.9です。なので、合計4通りですね。

Apacheではmod_phpで、nginxでは後ろでspawn-fcgiが動いてます。

で、試してみた結果です。今回検証したいのは静的ファイルではなくPHPの出力なので、画像とかCSSがブラウザでキャッシュされてたりするのは気にしないでください。

Apache + MySQL + WordPress

Apache + MySQL + WordPress

Apache + PostgreSQL + WordPress

Apache + PostgreSQL + WordPress

nginx + MySQL + WordPress

nginx + MySQL + WordPress

nginx + PostgreSQL + WordPress

nginx + PostgreSQL + WordPress

平均もとってない1回こっきりのアクセスの結果なので互いの比較はそんなに意味がないです。

が、どれもレイテンシが数百ミリ秒あります。これは何回試しても同じでした。

あれ?…

先輩のVPSと同じ環境のはずなのになんでこんなに違うの?

WordPressが遅い…なぜ?

最近サーバーの設定を変えたり、リバースプロキシをしてる、HTTPのフロントをApacheからnginxに変えたり高速化を試みています。

が、どうしてもこのブログ(にかぎらず、稼働しているWordPress全部)が重い、というより遅いのです。
Memcachedでオブジェクトをキャッシュしてみたりしても改善されず…

で、Safariで開発ツールの「ネットワーク」をつかって取得の時間を見てみました。

Apache(mod_php) + WordPress 処理時間

Apache(mod_php) + WordPress ネットワーク時間

ここでPHPのファイルへのアクセスのレイテンシが334msもあることに気づきました。稼働しているどのWordPressもです。

で、WordPressはそうなのかと、さくらのVPSで運用してる先輩のWordPressを見てみると…

 

さくらのVPS nginx + WordPress(fast-cgi)

さくらのVPS nginx + WordPress(fast-cgi)

速い….レイテンシ45msです。静的ファイルはうちのサーバーのほうがレイテンシ含め速いので(どちらも304なので比較していいかな)、ネットワーク等の問題ではないみたい。

(あと、向こうはnginx+fastcgi(swanかな?)+WordPressですが、うちでもnginx+fastcgiにしてみたけど改善せず…)

なんで?

とりあえず、僕も借りてるさくらのVPSでDBをMySQLからPostgreSQLにしてみたり、いろいろ実験してみます。

 

 

Ubuntuでレンタルサーバ その2

前回に引き続き、今回はProFTPdをセットアップし、MySQLのテーブルに記録されたユーザー情報で認証できるようにします。

まずはProFTPdのセットアップから。proftpdをapt-getでinstallするとproftpdの設定画面が出ます。

ProFTPd セットアップ

ProFTPd セットアップ

固定IPではないのでIPマスカレードを利用しないといけませんが、そのためにもスタンダードアローンではなくinetd経由にします。

それでは /etc/proftpd/proftpd.conf を書き換えていきます。

  • ServerName を好きな文字列に
  • ListOptions を “-l” に “-la” に
  • PassivePorts をコメントアウトして ポート範囲を決定(デフォルトは49152 65534)
  • MasqueradeAddress を コメントアウトして hogehoge.net(ドメイン名)に
  • ServerIdent を off で追加
  • RootLogin を off に
  • DefaultRoot を ~ に
  • RequireValidShell を off に

ここまではMySQLによる認証は関係ありません。これからMySQLで認証するための設定を追記します。この部分は「にわか鯖管のメモ – ProFTPD ~ MySQL + quota 編 ~」をもとにというかそのまま。

注意点はmodule.confをいじったときは sudo /etc/init.d/proftpd reload をしないとだめってとこです。

Ubuntuでレンタルサーバ その1

今日からUbuntuでレンタルサーバを構築するまでの記録を載せようと思います。まぁ気力が続けばですけど。

それと、メモみたいなもので解説はたぶんしないとおもいます。LinuxをCUIで使えるぐらいの知識がないともしかすると読めないかもしれないです。解説でなく日記ですね。

レンタルサーバといっても身内、友人、後輩などに貸してるだけですのであまりセキュリティ、特にユーザー間のセキュリティはよろしくない設定をしていくかもしれませんのでそういう意味でもあまり当てにはしないでくださいね。

で、なぜいまさらサーバー構築なのかということなのです。普段はMac OSX Serverの上でこのページ含め個人のサーバと上記のレンタル部分とを稼動させているのですが、いわゆる公私混同の部分の管理がめんどくさくなってきた(なんとなくしんどくなってきた)ので他人の分は仮想環境のUbuntuに移動させてしまおうと思い立ったわけです。

で現状は、Ubuntu 10.04 ServerをLAMP + SSHのみでインストールしたまでです。

このあとユーザー情報をMySQLで管理してユーザーごとにApacheのバーチャルホストを設定し、proftpdはMySQL上の情報で認証できるようにしていくことが目標です。

PHP 5.2.12 + GD + gettext

Mac OSX Leopard Serverのセキュリティーアップデートを実行するとまたPHPが置き換えられてしまった。

ので、GD付きで再コンパイル。と、gettextも有効にしたかったのでついでにいっしょにコンパイルします。

基本的に前回の記事にgettextを追加した内容になります。

  • libpng 1.4.1
  • libjpeg jpeg-8a
  • gd 2.0.35
  • gettext 0.17
  • php 5.2.12

バグの修正については前回の記事と同様に適用します。

$ cd ~/Downloads/src/libpng-1.4.1
$ CFLAGS="-arch x86_64" CCFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" LDFLAGS="-arch x86_64" ./configure
$ make
$ sudo make install

$ cd ~/Downloads/src/gd-2.0.35
$ CFLAGS="-arch x86_64" ./configure
$ cp libtool ../jpeg-8a/
$ cd ../jpeg-8a/
$ MACOSX_DEPLOYMENT_TARGET=10.5 CFLAGS="-arch x86_64 -g -Os -pipe -no-cpp-precomp" CCFLAGS="-arch x86_64 -g -Os -pipe" CXXFLAGS="-arch x86_64 -g -Os -pipe" LDFLAGS="-arch x86_64 -bind_at_load" ./configure --enable-shared
$ make
$ sudo make install

$ cd ~/Downloads/src/gd-2.0.35
$ MACOSX_DEPLOYMENT_TARGET=10.5 CFLAGS="-arch x86_64 -g -Os -pipe -no-cpp-precomp" CCFLAGS="-arch x86_64 -g -Os -pipe" CXXFLAGS="-arch x86_64 -g -Os -pipe" LDFLAGS="-arch x86_64 -bind_at_load" ./configure --with-zlib-dir=/usr --with-jpeg-dir=/usr/local/lib --with-png-dir=/usr/X11R6 --with-freetype-dir=/usr/X11R6 --with-xpm-dir=/usr/X11R6
$ make
$ sudo make install

$ cd ~/Downloads/src/gettext-0.17
$ MACOSX_DEPLOYMENT_TARGET=10.5 CFLAGS="-arch x86_64" CCFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" LDFLAGS="-arch x86_64" ./configure --prefix=/usr
$ make
$ sudo make install

$ cd ~/Downloads/src/php-5.2.12
$ MACOSX_DEPLOYMENT_TARGET=10.5 CFLAGS="-arch x86_64 -g -Os -pipe -no-cpp-precomp" CCFLAGS="-arch x86_64 -g -Os -pipe" CXXFLAGS="-arch x86_64 -g -Os -pipe" LDFLAGS="-arch x86_64 -bind_at_load" ./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --disable-dependency-tracking --with-apxs2=/usr/sbin/apxs --with-ldap=/usr --with-kerberos=/usr --enable-cli --with-zlib-dir=/usr --enable-trans-sid --with-xml --enable-exif --enable-ftp --enable-mbstring --enable-mbregex --enable-dbx --enable-sockets --with-iodbc=/usr --with-curl=/usr --with-config-file-path=/etc --sysconfdir=/private/etc --with-mysql-sock=/var/mysql --with-mysqli=/usr/bin/mysql_config --with-mysql=/usr --with-openssl --with-xmlrpc --with-xsl=/usr --without-pear --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-freetype-dir=/usr/X11R6 --with-gd=/usr/local -with-gettext=/usr
$ make
$ make test
$ sudo make install

phpinfoを確認すると無事GDとgettextが有効になっていました。