超簡単 Mac OS XのローカルでCGI (SSIもPHPも)

'02.2.12 ('03.1.18更新)

全世界に公開するにしても同じように設定しますが、たぶんローカルテストのために使いたい人が大多数じゃないでしょうか。というわけで「ローカル」です。

OS Xの基礎はUNIXです。Web共有のためのサーバはApacheですし、PerlもUNIX用のものが標準で入っています。テスト環境としては理想的ですね。

そして、なんと、特に設定を変えずとも最初から CGIが使えるんですよ。ほんのちょっと、UNIX的なコマンドラインの操作も必要ですが。

(OS 9までの方法は別ページで)

  1. Perlのパスを合わせる
  2. 改行コードはLF
  3. /Library/WebServer/CGI-Executables/ にCGIファイルを置く
  4. パーミッションを設定
  5. Web共有を起動
  6. ブラウザから呼び出して実行

さらに

  1. 設置サーバとPerlのパスを同じにする
  2. ユーザのSitesディレクトリ内で実行 (SSIも)
  3. .htaccessを有効にする
  4. オーナー権限で実行
  5. おまけにアクセス制限
  6. PHPも簡単
  7. Rubyも簡単

Perlのパスを合わせる

Mac OS XのPerlのパスは /usr/bin/perl です。設置サーバに合わせて /usr/local/bin/perl でも動くようにする方法も後述しますが、まずはプログラムの方を書き換えて、とにかく動かしてみましょう。テストだけなら、OS X付属のプログラムファイル、printenvを試すのもよいでしょう (後述)。

改行コードはLF

従来のMacはCRでしたが、OS XはUNIXなのでLFが基本になります。TextEdit (テキストエディット)では、改行すればLFになりますが、よそからコピーしてくるとCRでも改行して表示して、見分けがつかないので要注意です。

/Library/WebServer/CGI-Executables/ にCGIファイルを置く

CGIのファイルは /Library/WebServer/CGI-Executables/ ディレクトリに入れて実行します。一方、Webサーバのルートは /Library/WebServer/Documents/ になります。

既にprintenvとtest-cgiというファイルが入ってますね。printenvは環境変数表示のPerlスクリプトです。これを試してもかまいませんが、パーミッションの設定は必要です。test-cgiはシェルスクリプトです。

CGI-Executablesディレクトリの中

パーミッションを設定

実行権は、Finderの「情報を見る (インスペクタ)」では設定できません。ここだけはUNIXのコマンドラインによる操作が必要です。

アプリケーションのUtilitiesの「Terminal (ターミナル)」を起動して設定します。

置いたのがhoge.cgiなら、

chmod 755 /Library/WebServer/CGI-Executables/hoge.cgi

と記入してreturnです (上記をコピーしてペーストもできます)。(Terminal (ターミナル) では、入力し終わったらreturnキーを押してコマンド実行です)

Terminal (ターミナル) の画面

Terminal (ターミナル) を終える時は exit とタイプします。(今回は他に何もしていないので、いきなり「Terminal (ターミナル) を終了」でも大丈夫)


printenvのパーミッションを変える時は、管理者権限が必要なのでsudoを使います。(sudoをコマンドの前に入れることによって、管理者権限でコマンド実行できます)

sudo chmod 755 /Library/WebServer/CGI-Executables/printenv

と入力します。パスワードを聞かれますから、(変えてなければ) OS Xインストール時の管理パスワードを記入しreturnです。


コマンドラインを使わなくてもパーミッション変更できるソフトもあります。BatChmod (フリーウェア)。実行権追加だけなら、system OSAXというAppleScriptでShellコマンドを使えるようにするOSAXの、付属のScriptでもできます。

Web共有を起動

システム環境設定の「共有」でWeb共有を「開始」します。インターネットに繋いだままの状態だと、全世界に公開することになってしまうので注意してください。ルータ経由でWebの非公開設定になっていれば大丈夫ですが。(大抵のルータの初期設定では非公開ですが、よくわからないなら安全第一に、Ethernetケーブルを外して試しましょう。また、Web共有をオンにしたままだと、再起動してもオフになりません。終わったらオフにしましょう)

10.1の共有の設定画面

OS X10.2では「共有」の「サービス」の「パーソナルWeb共有」を選んで「開始」。または、「パーソナルWeb共有」のチェックボックスクリック。

ブラウザから呼び出して実行

http://localhost/cgi-bin/hoge.cgi あるいは http://127.0.0.1/cgi-bin/hoge.cgi とCGIを呼び出します。

http://localhost/ あるいは http://127.0.0.1/ がトップページですね。

http://localhost/cgi-bin/hoge.cgi

簡単でしょう。

ただし、CGI-Executables ディレクトリの中にCGI実行ファイル以外のファイルを置いても、呼び出すことはできません。(CGIとして実行しようとしてサーバエラーになります。その方が安全ですが)

設置サーバとPerlのパスを同じにする

OS X デフォルトの /usr/bin/perl に加え /usr/local/bin/perl でも動くようにします。

sudo mkdir /usr/local/bin

で bin ディレクトリを作って、

sudo ln -s /usr/bin/perl /usr/local/bin/perl

で、その中に perl のシンボリックリンクを作ります。

シンボリックリンク作成画面

ユーザのSitesディレクトリ内で実行 (SSIも)

本当は、UNIX的にはユーザのSitesディレクトリ内だけで操作したいところですね。設置サーバとディレクトリ構成を合わせるためにも、もっと自由にCGIファイルを置きたいですし。というわけで、Sitesディレクトリ内でCGIの実行を可能にしてみましょう。

/etc/httpd/users にある name.conf (nameはユーザ名) を書き換えます。しかし、users はFinder上では通常見えないディレクトリですし、ユーザにはname.confファイルを書き換える権限もありません。UNIXに慣れた人なら何も問題有りませんが、Macユーザなら、コマンドラインの入力は最小限にしたいですね (権限上必要なsudo使用時くらいにね)

書き換え方法は色々考えられます。たとえば、

  1. Terminal (ターミナル) でファイルが見えるディレクトリにコピーしてきて、通常の (コマンドラインで無い) テキストエディタで編集、Terminal (ターミナル) でファイルを入れ替える時にsudo使用。
  2. Terminal (ターミナル) で通常のテキストエディタをsudoで起動して権限確保。ファイル・オープンダイアログの「移動先」にパスを記述して見えないファイルを開く。保存。
  3. Finderの「移動」メニューの「フォルダへ移動...」にパスを入れて、Finderでname.confファイルを表示。通常のテキストエディタにドラッグしてファイルを開く。「別名で保存」で書込みできる自分のディレクトリに保存。Terminal (ターミナル) でsudoでファイル入れ替え。
  4. 通常のテキストエディタのファイル・オープンダイアログの「移動先」にパスを記述して見えないファイルを開く。「別名で保存」で書込みできる自分のディレクトリに保存。Terminal (ターミナル) でsudoでファイル入れ替え。

ここでは4の方法の解説をします。(このページオリジナル?)

  1. TextEdit (テキストエディット)を起動し、ファイルオープンダイアログの「移動先」に「/etc/httpd/users」と入力しreturn (開く)。カラムのname.conf (nameは自分のユーザ名) を選んで開きます。
  2. もし「リッチテキスト」として開いてしまったら、フォーマットメニューで「標準テキスト」にします。
  3. ファイルメニューの「別名で保存...」で自分のHomeのDocuments (書類) フォルダに「name.conf.org」等の名前でバックアップコピーを作ります。(.txtの拡張子は追加しない)
  4. 内容を書き換えます。(後述)
  5. 「別名で保存...」で「name.conf」と名前を戻して、変更したファイルをDocuments (書類) フォルダに保存します。(.txtの拡張子は追加しない)
  6. Terminal (ターミナル) を起動し、
    sudo cp ~/Documents/name.conf /etc/httpd/users
    と入力し、書き換えたファイルをオリジナルに上書きコピーします。
  7. Terminal (ターミナル) で apachectl configtest または httpd -t と入力して文法間違いがないかチェックします。Syntax OK ならOK。改行コードが違ってもOKになりません。
    以下のアラートは無視して平気。
    [alert] httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
  8. (パーソナル) Web共有 (Apache) を再起動します。(Terminal (ターミナル) で sudo apachectl restart でも可)

書き換え内容

下記はデフォルト。

<Directory "/Users/name/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

CGI実行可能にするためには、下記のように追記します。

<Directory "/Users/name/Sites/">
    AddHandler cgi-script cgi
    Options Indexes MultiViews ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

ついでにSSIも実行可能にするなら。

<Directory "/Users/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>

ついでにindex.shtmlをindexファイルに追加するなら。

<Directory "/Users/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
    <IfModule mod_dir.c>
        DirectoryIndex index.html index.shtml
    </IfModule>
</Directory>

上記の内容を丸ごとコピーペーストすると、改行コードがCRになったりするので注意してください。改行コードはすべてLFにします (TextEdit (テキストエディット)でreturn入力すればLFになります)。nameは自分のユーザ名に置き換えること。

ブラウザの呼び出しは、http://localhost/~name/hoge.cgi あるいは http://127.0.0.1/~name/hoge.cgi です (nameはユーザ名で置き換え)。サブディレクトリの中に置いてもCGIは動きます。

その他:

.htaccessを有効にする

これもname.confを書き換えます。

/Library/WebServer/Documents/ で有効にするなら、/etc/httpd/httpd.conf の
<Directory "/Library/WebServer/Documents"></Directory>の中を書き換えます。

# デフォルト
AllowOverride None
# 書き換え後
AllowOverride All

OS Xでは頭に「.」(ドット) が付くファイルはFinderで表示されません。下記のいずれかの方法を使います。

  1. 「htaccess」というファイル名で内容を書いて、Terminal (ターミナル) でmvして名前変更。書き換えるときはドットを取り見えるようにする。
    # ドットを付ける
    mv htaccess .htaccess
    # ドットを取る
    mv .htaccess htaccess
  2. /etc/httpd/httpd.conf の以下の部分を書き換える。「htaccess」のままで使えるようになります。
    # デフォルト
    AccessFileName .htaccess
    # 書き換え後
    AccessFileName htaccess
  3. TinkerTool」というシステム環境設定 (フリーウェア) を入れて、不可視ファイルをFinderで見えるようにする。(お勧め)
  4. Terminal (ターミナル) でvi等のエディタを使って内容を書き換える。

Apacheのデフォルトでは「.ht」から始まるファイルはWebから読まれないようになっています。ところが、OS X (のHFS+フォーマット) ではファイル名の大文字小文字を区別しないので、「.Htaccess」とアクセスすれば読めてしまいます。全世界に公開する人は「HFS+フォーマットの落とし穴と不可視ファイル」を必ず読んでください。

オーナー権限で実行

@nifty等、サーバによってはオーナー権限でCGIを実行するようになっていますね。その方がパーミッションを厳しくできて安全だし、CGIが作ったファイルを消せなくなったりしない利点もあります。逆に権限が強くなる副作用もあって、Apacheで使うsuEXECというプログラムでは、ディレクトリやパスの制限等、安全度を高める工夫がしてあります。しかし、インストールにはApacheをコンパイルする必要があり、ローカルでCGIのテストをするだけには、ちょっと面倒です。(本当にsuEXECを設定する人は「Mac OS XにsuEXECを」)

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

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

# デフォルト
User www
# 書き換え後
User name

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

おまけにアクセス制限

name.confを書き換えるなら、ついでにアクセス制限もしてみましょう。ローカルだけの利用に制限します。ディレクトリとファイルへのアクセスの制限ですから、サーバにアクセスされるリスクは消えません。過ってインターネットに公開してしまった時の保険のようなものでしょうか。

allow (許可) とdeny (拒否) とorder (見る順序指定等) を書き換えます。デフォルトではすべてのアクセスを許可してます (拒否がありません)。

デフォルト

    Order allow,deny
    Allow from all

すべてを拒否してから、自分自身 (localhost) だけ許可します。

    Order deny,allow
    Deny from all
    Allow from 127.0.0.1

加えて、LAN内 (192.168.*.*) からを許可するなら。

    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 192.168

Web共有のルートディレクトリのアクセス制限をするには、/etc/httpd/httpd.conf を書き換える必要があります。

Basic認証やダイジェスト認証の設定までするなら、「Mac OS XでWebDAVサーバ」の中の記述が参考になるでしょう。

PHPも簡単

OS X 10.1と10.2にはApache用のPHP4のモジュールも入っています。あとは使えるように設定するだけ。

まず、/etc/httpd/httpd.confファイルの次の2行の頭の「#」を消してコメントでなくします。

    #LoadModule php4_module        libexec/httpd/libphp4.so

    #AddModule mod_php4.c

次に、10.1では下記を探して#を取るだけ。10.2のhttpd.confには書いてないので自分で記述します。
(850行目辺りのAddType application/x-tar .tgzの下に書くと分かりやすい)

    #AddType application/x-httpd-php .php
    #AddType application/x-httpd-php-source .phps

あとはApacheの再起動。これだけで使えます。書き換え方法はname.confの時と同じですね。

Rubyも簡単

OS X10.2にはRubyも入りました。CGIとして実行するだけなら、Perlと同じくApacheの設定をして「#!/usr/bin/ruby」と1行目に書くだけです。そのパスを変えるのもPerlと同じ

参考文献

謝辞

お世話になりました。ありがとうございます。