構築・運用‎ > ‎OS X‎ > ‎

Mac OS X で Web スタック管理

Mac OS X はクライアント OS として充実している一方で、ちゃんとした UNIX OS であることから、Windows のような変な OS と違って、OSS の Web スタックが普通に動作します。ですから、仮想マシンで Linux を動かしてテストをするなどというまだるっこしいことをせずに、直接実行すれば良いのんです。とはいえ、初期設定の流儀は Linux 等とはいろいろと異なりますので、それらをまとめて行きます。ところで、LAPP, LAMP ではなく、MAPP, MAMP とか言うそうな。

以下で想定している OS X のバージョンは 10.7 (Lion) です。

インストール済み Apache の管理

「システム環境設定」→「共有」(当該ホストを、他のホストから共有)で、「Web 共有」にチェックを入れることで、Apache が起動します。

んー、OS X 10.9 Mavericks で(いや、10.8 Mountain Lion からか)、この設定項目がどこかへ行ってしまいました。

普通に apachectl を使わなければならなくなったようです。

$ sudo apachectl stop

$ sudo apachectl restart

$ sudo apachectl stop

各ユーザごとの ~ でのアクセスには、/etc/apache2/users/$(ユーザ名).conf の設定を。

主設定ファイルは /etc/apache2/httpd.conf にあり、初期 DocumentRoot は /Library/WebServer/Documents/ です。

このダイアログで言う「パーソナル Web サイトフォルダ」は ~/Sites/ に相当し、http://127.0.0.1/~<User ID>/ でアクセスできます。

バージョンは下記で確認できますので、設定については、右記より該当するバージョンの項目を参照してください ∥Documentation: Apache HTTP Server - The Apache HTTP Server Project

$ httpd -v
Server version: Apache/2.2.21 (Unix)
Server built:   Nov 15 2011 15:12:57

PHP はデフォルトでオフですので、必要ならば /etc/apache2/httpd.conf の下記の行のコメントを外してから再起動してください。

#LoadModule php5_module libexec/apache2/libphp5.so

再起動は、「共有」でチェックの外し付けをしても良いのですが、コマンドラインであれば、以下のように。

$ sudo /usr/sbin/apachectl restart

Homebrew による追加パッケージ管理

これ以降で、PostgreSQL と MySQL のインストールの際に Homebrew を利用しますので、右記よりインストールしてください。Homebrew は、いわゆる BSD で言うところの ports システムですが、OS X で最初から /usr/ の下 (/usr/local/ を除く) にインストールされているプログラム群を尊重する点で、MacPorts に比べて優れています ∥Homebrew — MacPorts driving you to drink? Try Homebrew!

文書にも書かれていますが、JDK (javac のため) と Xcode (gcc のため) も入れておくことを忘れないでください。

ご参考までに、前職在籍中に書いた記事も ∥ SIOS "OSSよろず" ブログ出張所: ソースの入手と再ビルド & デバッグ ~ Mac OS X Homebrew 編

PostgreSQL の管理

OS X 10.7 (Lion) には、元々 PostgreSQL 9.0.5 が入っているようなのですが、使い方がよく分かりません。postmaster(1) や psql(1) はあるのですが、/System/Library/LaunchDaemons/ にもそれらしい設定ファイルはなく、そもそも initdb(1) が無いため、DB クラスタを新規に作ることができません。OS X Server を作りかけて入れてあるとか?

しかたがないので、Homebrew でインストールします(EnterpriseDB 社のワンクリック・インストーラを使ってもいいと思います。Mac OS X 版は触ったことありませんが、インストーラは Java だったので問題なく動くでしょう)。

なお、OS X に依存しない内容については、「日本 PostgreSQL ユーザ会: PostgreSQL 付属ドキュメント」や、「ホーム — Let's Postgres」にある読み物等を参照してください。

インストール

特に問題が起こらなければ、簡単です。

$ brew install postgersql

こうなると、元から入っている PostgreSQL 関連のバイナリが邪魔ですので、脇へどけておきます(まずは、ドメインソケットファイルを作成するパスが DB サーバと異なるのでハマると思います)。

# mv /usr/bin/psql /usr/bin/psql.orig

インストール後は、下記のようにして、バージョンや利用方法を参照することができます。

$ brew info postgresql

DB クラスタの作成

PostgreSQL は、本来は一般ユーザでも稼働させることのできる RDBMS なのですが、ポートの重複や、ドメインソケットの作成権限を考えると、上記の "info" の instruction の通りに動かした方が無難だと思われます。

まず、DB クラスタ (複数データベースが収められた、PostgreSQL のデータベース領域ディレクトリ) を作成します。クラスタのディレクトリのパスは、後述する launchd のための設定ファイル (org.postgresql.postgres.plist) の内容に合わせておきます。上記 "info" には "initdb /usr/local/var/postgres" とありますが、これではあまりに寂しいので、下記のようにしてみます。

$ initdb -D /usr/local/var/postgres --encoding=UTF-8 \
   --no-locale --username=admin --pwprompt --auth=md5

各オプションの意味合いとしては、以下のようになります(ロケールについては「文字列処理と日本語全文検索 — Let's Postgres」等を、認証については「認証方式 - PostgreSQL 文書」等を参照してください)。

--encoding=UTF-8データベースの内部文字符号は、デフォルトでは環境変数から自動設定されるのだったと思いますが、明示的に UTF-8 を使用します
--no-localeロケール固有の機能が有効になっていると、ソートやインデックスで意図しない固有ルーチンが働いて性能が出ないことがあるので、ロケールを "C" にします
--username=adminDB スーパーユーザ名には、デフォルトでは initdb を実行したユーザのユーザ ID と同名の文字列が設定されますが、DB クラスタ内のユーザと OS のユーザとは本質的には無関係であることを強調するために、ここでは固有の DB ユーザ名を設定しています
--pwpromptDB スーパーユーザの初期パスワードを設定するプロンプトを出します
--auth=md5pg_hba.conf に設定されるアクセスメソッドは、デフォルトでは "trust" (全通し) になります。MD5 ハッシュを保持してのパスワード認証となるよう設定します

自動起動・終了

デーモンを、launchd 配下で自動的に起動されるように設定します。詳しくは launchctl(1) を参照してください("brew --prefix postgresql" の実行結果が間違っているの。イヤン)。

$ mkdir -p ~/Library/LaunchAgents/
$ pgver=$(postgres --version | sed -e 's/.* //')
$ cp /usr/local/Cellar/postgresql/$pgver/org.postgresql.postgres.plist \
   ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist

アクセスしてみます。

$ PGHOST=localhost PGPORT=5432 PGUSER=admin PGPASSWORD=hogepass psql -l
                         List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+---------+-------+-------------------
 postgres  | admin | UTF8     | C       | C     |
 template0 | admin | UTF8     | C       | C     | =c/admin         +
           |       |          |         |       | admin=CTc/admin
 template1 | admin | UTF8     | C       | C     | =c/admin         +
           |       |          |         |       | admin=CTc/admin
(3 rows)

$ 

再起動をするには、下記のようにします。設定ファイルの変更の後で再起動が必要な場合などに実行します。plist ファイルの "KeepAlive" に "true" が設定されているので、"launchctl stop" で停止後、launchd はすぐに再度の起動を行います。

$ launchctl stop org.postgresql.postgres

launchd 配下から外すには、以下のようにします。その後、削除します(launchctl は、管理ファイルが有ること即 launchctl の管理下にあること、なので)。

$ launchctl unload -w ~/Library/LaunchAgents/org.postgresql.postgres.plist

DB クラスタの作り直し

テスト用ですので、一旦データを全てチャラにしたい場合には、launchd 配下から外した(停止もされた)後で、DB クラスタを作成しなおし、改めてサービスの登録を行います。

$ launchctl unload -w ~/Library/LaunchAgents/org.postgresql.postgres.plist
$ rm -fr /usr/local/var/postgres/*
$ initdb -D /usr/local/var/postgres --encoding=UTF-8 \
   --no-locale --username=admin --pwprompt --auth=md5
$ launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist

MySQL の管理

どうも以前の OS X では PostgreSQL ではなく MySQL が入っていたらしいのですが、まあいいか。

インストール

特に問題が起こらなければ、簡単です。

$ brew install mysql

インストール後は、下記のようにして、バージョンや利用方法を参照することができます。

$ brew info mysql

データディレクトリの作成

下記の通りです。MySQL はビルド時の $TMPDIR を覚えてしまうのですが、Mac OS X の $TMPDIR は、セッションごとに変わるようですので注意します。右記参照 ∥ MySQL :: MySQL 5.5 Reference Manual :: 4.4.3 mysql_install_db — Initialize MySQL Data Directory

$ TMPDIR=/tmp/ mysql_install_db --basedir="$(brew --prefix mysql)" \
   --datadir=/usr/local/var/mysql/

自動起動・終了

デーモンを、launchd 配下で自動的に起動されるように設定します。詳しくは launchctl(1) を参照してください。

$ mkdir -p ~/Library/LaunchAgents/
$ cp $(brew --prefix mysql)/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

DB ユーザ "root" の初期パスワードは空です。対話的に、アクセスコントロールを設定します。

$ mysql_secure_installation

試しにアクセスしてみます。

$ mysql -u root -p -e "SELECT version()" mysql
Enter password: 
+-----------+
| version() |
+-----------+
| 5.5.20    |
+-----------+
$ 

launchd 配下から外すには、以下のようにします。

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

再起動をするには、下記のようにします。設定ファイルの変更の後で再起動が必要な場合などに実行します。plist ファイルの "KeepAlive" に "true" が設定されているので、"launchctl stop" で停止後、launchd はすぐに再度の起動を行います。

$ launchctl stop ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

なお、ここまでで、お馴染みの my.cnf ファイルを設置していません。my.cnf を設置しない場合に使われるデフォルトパラメータと、設置した場合に優先されるパスの順序については、以下で確認できます。

$ mysqld --help --verbose

データディレクトリの作り直し

テスト用ですので、一旦データを全てチャラにしたい場合には、launchd 配下から外した(停止もされた)後で、DB クラスタを作成しなおし、改めてサービスの登録を行います。

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
$ rm -fr /usr/local/var/mysql/*
$ TMPDIR=/tmp/ mysql_install_db --basedir="$(brew --prefix mysql)" \
   --datadir=/usr/local/var/mysql/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
$ mysql_secure_installation 

nginx の管理

最近流行りの、非同期実装のウェブサーバでござる ∥ nginx news

インストール。

$ brew install nginx

自動起動。

$ mkdir -p ~/Library/LaunchAgents/
$ cp $(brew --prefix nginx)/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

http://localhost:8080/ へ。

ビルドオプションは "-V" で表示されます。設定ファイルの位置もここで指定されています。"root" に指定した相対パスは、prefix からの位置ですね、 $(brew --prefix nginx)/html/ 。

$ nginx -V
nginx version: nginx/1.2.0
TLS SNI support enabled
configure arguments: --prefix=/usr/local/Cellar/nginx/1.2.0
 --with-http_ssl_module --with-pcre --with-cc-opt='-I/usr/local/include'
 --with-ld-opt='-L/usr/local/lib' --conf-path=/usr/local/etc/nginx/nginx.conf
 --pid-path=/usr/local/var/run/nginx.pid
 --lock-path=/usr/local/var/nginx/nginx.lock
8080 が取り合いなので、ポートを変えます。 $ diff -uNr /usr/local/etc/nginx/nginx.conf.default /usr/local/etc/nginx/nginx.conf --- /usr/local/etc/nginx/nginx.conf.default +++ /usr/local/etc/nginx/nginx.conf @@ -33,7 +33,7 @@ #gzip on; server { - listen 8080; + listen 8081; server_name localhost; #charset koi8-r; 再起動します。 $ launchctl stop homebrew.mxcl.nginx

後でちゃんとやろう。

Ruby on Rails の管理

断然 ”–user-install” です。

$ gem install --user-install rails
$ export PATH=$PATH:$(ruby -r rubygems -e "puts(File.join(ENV['HOME'], \
 '.gem', 'ruby', Gem::ConfigMap[:ruby_version], 'bin' ))")

Node.js

node.js

$ brew install nodejs
$ node <<EOF
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
EOF
Comments