macのApache設定(localhost/~user)

osはlionです。


最近、apacheをlocal環境で使用することがなかったので
久しぶりにhttp://localhost/~user にアクセスしてみると
404 Not Found になりました。
あれ?どうだったけとなったので調べてみました。
httpd.conf / plistを参照したメモです。

最初に

Mac OSXを触ったとき、(当時は5色のiMac(ストロベリー)でした。)
おおすげー、localhost/~username でapache動くのかと感動した覚えがあります。
それ自体はmod_userdir - Apache HTTP サーバで実現しています。


結論から

web共有しないとhttpdのパラメータにWEBSHARING_ONが無い状態でapacheが起動します。
この値を見て、UserDirを有効にするかどうかをという設定が入っているため
localhost/~user でアクセスできません。


httpdの起動パラメータを設定しているplistに手動で追加でもokですが、
plistの書き換えは環境設定を変更することで自動でやってくれます。
SystemPreference > Sharing > Web Sharing



なのでweb共有okな人は、環境設定を変更。
web共有したくないけど、UserDirを使いたい場合は、
httpd.confの下記Includeを の外に出すでokです。
#httpd.conf

Include /private/etc/apache2/extra/httpd-userdir.conf

以降、調査メモ

まずはhttpd.confから見ていきます

#/etc/apache2/httpd.conf
<IfDefine WEBSHARING_ON>
(略)
# User home directories
Include /private/etc/apache2/extra/httpd-userdir.conf

で extra/httpd-userdir.conf を読み込んでいます。

#extra/httpd-userdir.conf
UserDir Sites

#
# Users might not be in /Users/*/Sites, so use user-specific config files.
#
Include /private/etc/apache2/users/*.conf
<IfModule bonjour_module>
       RegisterUserSite customized-users
</IfModule>


さらに users/*.conf を読み込んでいます。
users/loginusername.conf が存在し、中身も問題ありません。

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


設定自体は問題ないようです。

ん?

と思い、httpd.confを見直すと

<IfDefine WEBSHARING_ON>

という記述があります。


どうやら、起動時のパラメータとしてWEBSHARING_ONを渡しているようです。
macはlaunchctlでデーモン管理しているのでplistを見てみます。


plist名を調べます。

sudo launchctl list | grep apache                                                                                  /etc/apache2
4562	-	org.apache.httpd


あとは、locateで特定。
#/System/Library/LaunchDaemons/org.apache.httpd.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Disabled</key>
	<true/>
	<key>Label</key>
	<string>org.apache.httpd</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/sbin/httpd</string>
		<string>-D</string>
		<string>FOREGROUND</string>
	</array>
	<key>OnDemand</key>
	<false/>
	<key>SHAuthorizationRight</key>
	<string>system.preferences</string>
</dict>
</plist>