Apache on Mac OS X

Abstract

Mac OS X にせっかく Apache がのっかってんだからローカルで CGI を動かしちゃおう、という感じの私的メモ。自己責任で。

この記事は 2002 年 11 月 20 日に公開されたもので当時はまだ Mac OS X 10.2 (Jaguar) でした。そのため今現在では内容が古くなっています。Mac OS X の設定は OS のバージョンによって異なり、httpd.conf などのファイルの行番号が多少ずれているかもしれません。その辺に気をつけて下さい。

Mac OS X 10.5 (Leopard) 以降では Apache 2 がバンドルされ、システム自体のディレクトリ構造も変更されています。この記事中に記載されている .conf の内容自体は問題ないと思いますがディレクトリやファイル名が変わっていますのでご注意ください。

Table of Contents

目次を生成中です・・・

はじめに

Mac OS X について

Mac OS X については賛否両論あると思います。否定的な意見としては「見た目重視・効率無視の激重 GUI 」や「旧 Mac OS とは似て非なる操作感」や「堅牢になった代わりに柔軟さを失ったシステム」とかとか。でも、待ちに待ったメモリ保護とプリエンティヴマルチタスクの実装や、ここで注目する Apache の標準バンドルなど、Mac OS X は十分な魅力を備えているのも確かです。まだまだ不具合や不満が多いことも否めませんが、それでもなお使ってみる価値があると感じています。

セキュリティについて

あくまでローカルで CGI のテスト環境を構築することが目的なので、ルータなり市販のファイアーウォールなりでポート 80 番を閉じている環境が前提。自宅サーバとして公開するのであれば、この記事を参考にしてはいけません。セキュリティーに関しては一切考えずに無茶なこともしてるので、いつクラックされるとも知れません。もしそうなっても責任取りません。

用意するツール

Terminal (ターミナル)
もともと Mac OS X の中に入っています。場所は「/Applications/Utilities/Terminal」。UNIX システムにアクセスして、コマンドや情報を入力することで、シェルやアプリケーションとやりとりをするための端末エミュレータ。ここではファイル移動やパーミッション変更などに使います。
mi - Mac OS X 用テキストエディタ
テキストエディタです。スクリプトを書くのに特化していますし、嬉しいことにフリーウェアです。インストールしたついでに、テキストファイルをドラッグ&ドロップしやすいように mi を Dock へ登録するなりしておきましょう。

Apache の起動

システム環境設定を開き、「共有」の「サービス」タブの中の「(パーソナル)Web共有」にチェックするだけで Apache が起動します。

起動したら Web ブラウザで http://127.0.0.1/http://localhost/ にアクセスしてみましょう。テストページが表示されるはずです。この表示されている HTML ファイルは「/Library/WebServer/Documents/index.html」です。

次に、各ユーザのページにアクセスしてみましょう。アクセス先は http://127.0.0.1/~user_name/http://localhost/~user_name/ (※ user_name は各々のユーザ名に置き換えてください) と、なります。すると「ここはあなた専用の Web サイトです。」と表示されるはずです。これは「~/Sites/index.html」です。

とりあえず CGI を動かしてみる

初期状態だと CGI ファイルは「/Library/WebServer/CGI-Executables/」の中に入れて実行します。既に printenv と test-cgi というテスト用のファイルが入ってます。printenv は環境情報表示の Perl スクリプトです。ここではこの printenv を使ってテストすることにします。

別名でコピー・パーミッションの変更

Terminal を使用して、printenv を printenv.cgi というファイル名でコピーし、さらに、その別名でコピーした printenv.cgi のパーミッションを変更します。Termial を起動してください。

cd /Library/WebServer/CGI-Executables/
cp printenv printenv.cgi
sudo chmod 755 printenv.cgi

パスワードを入力し、リターンキーを押して完了です。

ブラウザで確認

ブラウザで http://127.0.0.1/cgi-bin/printenv.cgihttp://localhost/cgi-bin/printenv.cgi にアクセスしてください。環境情報がずら〜っと出てくれば成功です。

なお、「/Library/WebServer/CGI-Executables/」をブラウザから閲覧する場合のアクセス先は「http://localhost/cgi-bin/」となっています。「CGI-Executables」ではなく「cgi-bin」であることに注意。

「CGI-Executables」の中に置かれたファイルは全て CGI として見なされます。なので、CGI 実行ファイル以外の .html 等のファイルを置いても CGI として実行しようとしサーバエラーになります。

Apache を実用的にする

perl のパスを「/usr/local/bin」にも通す

perl のパスが、Mac OS X のデフォルトのままだと「/usr/bin/perl」です。しかし、一般的な Web サーバでは「/usr/local/bin/perl」となっていることもあります。で、何が問題かというと、インターネット上で配布されていたりする CGI スクリプトをダウンロードしてきて使う時なんかに、CGI スクリプトファイルの 1 行目で perl のパスを指定するわけですが、それをいちいち書き換えてられるか!ってことで「/usr/local/bin/perl」でも動くようにパスを通します。では、Terminal を起動。パスワードを聞かれたら現在ログインしてるユーザのパスワードを入力してください。

sudo mkdir /usr/local/bin
sudo ln -s /usr/bin/perl /usr/local/bin/
sudo ln -s /usr/bin/perl5.6.0 /usr/local/bin/

「~/Sites/」ディレクトリ内でも CGI と SSI を実行可能にする

スクリプトを「~/Sites/」内のどこに置いても CGI として動くようにします。そのためには「/private/etc/httpd/users/」の中にある user_name.conf を書き換えます。このファイルは不可視な上に権限が届かないので、書き換えは一旦「~/Documents/」へコピーしてから行うことにします。では Terminal を起動。

cp /etc/httpd/users/user_name.conf ~/Documents/

これで Finder から見られる「~/Documents/」ディレクトリの中に user_name.conf がコピーされたと思います。あとは、コピーした user_name.conf を mi を使って書き換えていきます。

その前に、Finder上でこのファイルをさらに複製し user_name.conf.back とでもリネームしてバックアップしておくと良い。

なお、OS X 付属の TextEdit で編集すると改行コードが CR になったりします。.conf ファイルの改行コードは LF じゃないといけないので注意が必要です。mi ならば改行コードが変わらないし文字コードに関する不安もありません。では、mi で user_name.conf を開いて編集開始。

初期状態
<Directory "/Users/user_name/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
CGI を実行可能にする
<Directory "/Users/user_name/Sites/">
    AddHandler cgi-script cgi
    Options Indexes MultiViews ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
SSI も実行可能にする
<Directory "/Users/user_name/Sites/">
    AddType text/html shtml
    AddHandler server-parsed shtml
    AddHandler cgi-script cgi
    Options Indexes MultiViews ExecCGI Includes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

書き換えたら Terminal を使って元の場所に上書きコピーします。

sudo cp ~/Documents/user_name.conf /etc/httpd/users/

パスワードを入力してリターンキーで完了です。

.conf の文法チェック

.conf ファイルはシステムにとって重要な役割をしてるので Terminal で以下のようにして、間違いがないか調べてみましょう。

apachectl configtest

または

httpd -t

Syntax OK と返答があれば問題ありません。

Apache を再起動

.conf を書き換えたら忘れずに Apache (Web共有) を再起動します。再起動の方法は 2 つあります。

  1. システム環境設定で Web 共有を一度オフにしてからオンにする
  2. Terminal (ターミナル) でコマンド実行

Terminal を使って Apache の再起動を行う場合は以下のコマンドを実行。

sudo apachectl restart

現在ログインしているユーザのパスワードを入力しリターンキーで再起動完了。

「~/Sites/」以下で CGI テスト

これで「~/Sites/」ディレクトリ内のどこにスクリプトを置いても CGI として動くようになりました。それでは、以前にも使った printenv.cgi でテストしてみましょう。まずは Terminal を使って printenv.cgi を「~/Sites/」へコピーします。

cp /Library/WebServer/CGI-Executables/printenv.cgi ~/Sites/

ブラウザからのアクセス先は http://127.0.0.1/~user_name/printenv.cgihttp://localhost/~user_name/printenv.cgi です。

テストに使った printenv.cgi は忘れずに削除しておきましょう。不要なだけでなく、もしこのスクリプトにアクセスされると、環境情報が外部から簡単に取得できてしまいます。

「~/Sites/」以下で SSI テスト

Finder 上で「~/Sites/」の中にある index.html を複製し index.shtml とリネームし、index.shtml を mi で開く。そして <body> の行の次あたりにでも以下の行を書き足します。

<p>今日の日付は <!-- #config timefmt="%Y/%m/%d"--><!-- #echo var="DATE_LOCAL" --> です。</p>

書き換えて保存したら、Web ブラウザで http://127.0.0.1/~user_name/index.shtmlhttp://localhost/~user_name/index.shtml にアクセスします。今日の日付けがが表示されていれば成功です。

ついでに PHP も実行可能に

httpd.conf 以下の 2 行の # を削除する。

書き換え対象の行
#LoadModule php4_module        libexec/httpd/libphp4.so
#AddModule mod_php4.c

index.shtml を index ファイルに追加

デフォルトでは http://127.0.0.1/http://localhost/ のようにファイル名を指定せずにアクセスした場合、自動的に index.html を Web ブラウザに送り返してくれますが、index.html がなくて index.shtml がある場合はディレクトリの中身を表示するだけで index.shtml を送り返してくれません。index.html がない場合は自動で index.shtml を探して送り返すように設定を変更してみます。

まずは Terminalを使って「/private/etc/httpd」の中にある httpd.conf を「~/Documents/」にコピーします。

cp /etc/httpd/httpd.conf ~/Documents/

これで Finder 上から編集できるようになったので mi で開きます。440 行目あたりに次のような行があります。

初期状態
<IfModule mod_dir.c>
    DirectoryIndex index.html
</IfModule>
変更後
<IfModule mod_dir.c>
    DirectoryIndex index.html index.shtml
</IfModule>

書き換えて保存したら、httpd.conf を Terminal を使って元の位置に戻します。

sudo cp ~/Documents/httpd.conf /etc/httpd/

現在ログインしてるユーザのパスワードを入力してリターンキーを押したら書き換え完了。あとは忘れずに Apache (Web共有) を再起動しましょう。

.htaccess を有効にする

再び user_name.conf を書き換えます。 mi で user_name.conf を開く。

書き換え前
    AllowOverride None
書き換え後
    AllowOverride All

書き換えて保存したら Terminal を使って user_name.conf を元の位置に戻します。

cd ~/Documents/
sudo cp user_name.conf /etc/httpd/users/

パスワードを入力しリターンキーを押す。終わったら忘れずに Apache (Web共有) を再起動しましょう。

sudo apachectl restart

他のボリュームのディレクトリを公開する

ふだん開発に使っているサイトフォルダを Web 共有でアクセスする方法。

シンボリックリンクを許可する

まず、自分の公開領域でシンボリックリンクが使えるように再び user_name.conf の次の 1 行をを変更します。

書き換え前
    Options Indexes MultiViews ExecCGI Includes
書き換え後
    Options Indexes MultiViews ExecCGI Includes FollowSymLinks

書き換えて保存したら、Terminal で user_name.conf を元の位置に戻して、Apache を再起動します。

cd ~/Documents/
sudo cp user_name.conf /etc/httpd/users/
sudo apachectl restart

シンボリックリンクの作成

次に、Terminal を使ってシンボリックリンクを作ります。

cd ~/Sites/
ln -s 元となるディレクトリのパス 公開する時のディレクトリ名
(例 : ln -s /Volumes/www/apache_on_osx/ apache_on_osx)

オーナー権限で実行

ローカルで動作確認用として動かす場合のみ前提で、Apache そのものをオーナー権限で実行してみましょう。この方法は恐ろしく楽ですが逆に危険度が増します。公開するサーバでこの設定をしてはいけません。

httpd.conf の以下の部分の www を自分のユーザ名に書き換えるだけです。

書き換え前
User www
書き換え後
User user_name

上記は一般ページのブラウズもすべてオーナー (というか自分の) 権限になります。不特定多数の人にその権限でアクセスさせるのは危険です。あくまで、ローカルでのテスト用としてだけ使ってください。うっかり公開にも充分気をつけてください。

付録

用語解説

パーミッション
アクセス権のことです。Finderでも読み書きの権限変更は可能ですが、実行権は変更できません。実行権を変更するには Terminal で UNIX システムにアクセスして行います。
シンボリックリンク
Mac OS でいうところのエイリアスと同じですが、ファイルパスの概念によるものです。エイリアスはリンク先が移動してもエイリアスは生きていますが、シンボリックリンクはリンク先を移動すると機能しません。Windows のショートカットと同じ概念です。Apache や Terminal では、エイリアスは使えないようです。シンボリックリンクを使います。
Apache
現在多くの UNIX サーバで利用されているオープンソースの Web サーバ・アプリケーションです。MacOS X の Web 共有でも Apache が使われています。
127.0.0.1
操作しているコンピュータ自身を示すアドレスです。「localhost」と入力しても同じ動作をします。
ディレクトリ
ファイルの階層構造を作っている物です。Finder ではフォルダと言われている概念です。
カレントディレクトリ
現在、ターゲットになっているディレクトリの事です。Finder で言えば現在開いているフォルダです。
相対パス
現在のディレクトリから見た階層構造を示します。上の階層は ../ で示されます。
絶対パス
ルートから示したパス表記です。「http://〜」あるいは「/」から始まることがほとんどです。
ルート
ディレクトリ構造の一番上の階層です。UNIX および Mac OS X では「/」で示されます。Finder では、起動ボリュームの第一階層目です。Terminal では、「cd /」でルートディレクトリへ移動します。
root
上の「ルート」と“ルート”という言い方は同じですが、こちらはアクセス権の用語です。通常、MacOS X では、インストール時に設定したユーザでログインしますが、インストール時に設定したユーザは絶対的なアクセス権は持っていません。絶対的なアクセス権を持つユーザが「root」です。
ホーム
MacOS X の各ユーザが所有するフォルダです。Finder ではショートカットキー Command + option + H で移動します。Terminalでは「cd ~」で各ユーザのホームディレクトリへ移動します。

ホームディレクトリまでのパス

ホームディレクトリまでのパスは「~」と省略することができます。Mac OS X で言うと、「/Users/user_name/」と「~/」という表記は同じことになります。

起動ボリューム以外のパス

起動ボリューム以外のすべてのボリュームは、「/Volumes/」というフォルダの中のディレクトリとして指定します。

Terminal のパーミッションの見方

パーミッションが全部 ON になっていると「-rwxrwxrwx」となります。Web 制作者には「777」という意味です。と言えば分りやすいでしょうか。要するに、所有者・グループ・その他のすべてのユーザに、r(読み込み)・w(書き込み)・x(実行が可能)であるという意味です。実際にインターネット上でこんな設定にすると危険なわけですが、ローカルでは外部からのアクセス自体を許可していなければ大丈夫です。もちろん例えローカルでもこんな設定にはしない癖をつけておくことをお勧めします。

一番左の文字が「-」であれば、それが通常のファイルであることを示します。ディレクトリの場合は「d」、シンボリックリンクの場合は「l」になります。つまり、「755」を設定したディレクトリのパーミッション表示は「drwxr-xr-x」という表示になります。

基本的なコマンド

ls -al
現在のカレントディレクトリ (フォルダ) 内にあるファイルとフォルダを一覧表示します。「-al」はオプションで、これをつけると不可視ファイルなども全て表示し、かつファイルのパーミッションも表示します。
cd 移動先のディレクトリ名
カレントディレクトリの移動。「cd」の後に半角スペースをおいて、移動先ディレクトリ名を相対パスで指定します。絶対パスで指定したい時は、「cd /」から目的のディレクトリを入力します。
chmod パーミッション 変更したいファイル名
ファイルもしくはフォルダ (ディレクトリ) のパーミッションを設定します。「chmod 755 counter.cgi」といった感じで、入力します。
ln -s 元ファイル名 シンボリックリンクファイル名
シンボリックリンクを作成します。
mkdir 作成するディレクトリ名
ディレクトリを作成します。
sudo コマンド
sudo の次に続くコマンドを root 権限で実行します。ログインしたユーザがアクセス権を持たないファイルやフォルダを操作できます。sudo を実行すると、パスワードを聞いてきます。この時は、現在ログインしているユーザのインストール時に設定したパスワードを入力します。
rm -R 消したいディレクトリ名
ディレクトリをファイルごと削除

Terminal からApache を再起動

sudo apachectl restart

シングルユーザモード

Mac OS X ではシステム起動時に「cmd + S」キーをホールドする事でシングルユーザモードで立ち上がる。 シングルユーザモードでは一切 GUI がなされない所謂 CUI の世界となるので、操作はキーボード上からコマンドを入力する事で成立するのだが、ここで大事なコマンドが「fsck」。コマンドラインプロンプト(「#」の部分)から

fsck -y

と入力して改行するとディスクチェックが行われる。最後に「****** FILE SYSTEM WAS MODIFIED ******」と表示されれば他にエラーが発生しているので再度 fsck -y をする。ディスクチェックが完了したらプロンプトに続けて

logout

としてシステムの起動を続けるか

reboot

としてシステムを再起動する。

Mac OS X のシステム最適化

sudo update_prebinding -root /

として改行し、ログインパスワードを入力して再度改行すると、インストーラーで行われる「最適化」と同様の作業が行われる。

終わりに

このページの先頭へ