OSX 10.10 YosemiteでWeb共有を有効にする

OSX 10.8以降、システム環境設定からWeb共有のGUI設定がなくなってしまった。しかし、なくなったのはGUI設定だけで、apache2の設定ファイルを修正すれば、以前同様Web共有が使える。そこで、簡単にWeb共有を開始できるように、以前の日記でAppleScriptにまとめておいた。

ところが、時は流れてOSX 10.10 Yosemiteでは、上記AppleScriptではWeb共有が使えなくなっていた...。

apacheのバージョン

  • 調べてみると、OSX 10.10 Yosemiteから、apacheのバージョンが2.4に変更されていた。(以前はバージョン2.2だった)
$ apachectl -v
Server version: Apache/2.2.26 (Unix)
Server built:   Dec 10 2013 22:09:38
    • OSX 10.10 Yosemiteから
$ apachectl -v
Server version: Apache/2.4.9 (Unix)
Server built:   Sep  9 2014 14:48:20
  • apacheの設定ファイルをバージョン2.4に対応したものに修正することで、YosemiteでもWeb共有を使えるようになるのだ。

Web共有を有効にする手順

Webサーバーを起動
  • Webサーバーを起動するだけで、Web共有は始まる。但し...
    • /Library/WebServer/Documents/をルートとするWeb共有のみ有効。
    • ユーザーごとの~/SitesをルートとするWeb共有はまだ無効。
$ sudo apachectl start
  • http://localhost
    • /Library/WebServer/Documents/index.html.enの内容が表示されている。


/etc/apache2/httpd.confを修正
  • ユーザーごとのWeb共有を有効にするため、以下のコメントマークを外して、有効にしておいた。
    • userdir_moduleをロードすることを指定。
    • /etc/apache2/extra/httpd-userdir.confの設定も取り込むことを指定。


LoadModule authz_host_module libexec/apache2/mod_authz_host.so

LoadModule authz_core_module libexec/apache2/mod_authz_core.so

-#LoadModule userdir_module libexec/apache2/mod_userdir.so
+LoadModule userdir_module libexec/apache2/mod_userdir.so

# User home directories
-#Include /private/etc/apache2/extra/httpd-userdir.conf
+Include /private/etc/apache2/extra/httpd-userdir.conf

      • −赤い行 = 修正前
      • +緑の行 = 修正後
      • 黒い行 = デフォルトの設定状態
  • ついでにPHPも有効にするには、以下のコメントマークも外して、有効にしておく。
    • php5_moduleをロードすることを指定。


-#LoadModule php5_module libexec/apache2/libphp5.so
+LoadModule php5_module libexec/apache2/libphp5.so

/etc/apache2/extra/httpd-userdir.confを修正
  • ユーザーごとのWeb共有を有効にするため、以下のコメントマークを外して、有効にしておいた。
    • 上記/etc/apache2/httpd.confで取り込みを指定された設定ファイルである。
    • ユーザごとの設定ファイル/etc/apache2/users/*.confの設定も取り込むことを指定。


# Settings for user home directories
#
# Required module: mod_authz_core, mod_authz_host, mod_userdir

#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received. Note that you must also set
# the default access control for these directories, as in the example below.
#
UserDir Sites

#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
-#Include /private/etc/apache2/users/*.conf
+Include /private/etc/apache2/users/*.conf
<IfModule bonjour_module>
RegisterUserSite customized-users
</IfModule>

      • −赤い行 = 修正前
      • +緑の行 = 修正後
      • 黒い行 = デフォルトの設定状態
~/Sites フォルダを追加
  • ユーザーごとのWeb共有の起点となる ~/Sites を追加した。(以前と同じ)
    • 上記/etc/apache2/extra/httpd-userdir.confの"UserDir Sites"という設定によって、指定されたフォルダである。
$ mkdir -p ~/Sites
~/Sites/index.htmlも追加
  • ユーザーごとのWebページの動作確認用として、「Now Web Sharing!」というテキストファイルも保存しておいた。(以前と同じ)
$ echo Now Web Sharing! > ~/Sites/index.html
/etc/apache2/users/USER_NAME.confを追加
  • ユーザーごとのWeb共有の設定である。
  • 例えば、ログインユーザー名がzariであれば、/etc/apache2/users/zari.confというパスになる。
    • 上記/etc/apache2/extra/httpd-userdir.confの"Include /private/etc/apache2/users/*.conf"という先ほど有効にした設定によって、Includeされる。
$ cat < /etc/apache2/users/zari.conf

    Options Indexes MultiViews
    AllowOverride None
    Require all granted

EOS
# apache 2.2
Order allow,deny
Allow from all
# apache 2.4
Require all granted
Webサーバーを再起動
  • 以上の設定を反映させるため、Webサーバーを再起動する。
$ sudo apachectl restart


AppleScriptにまとめる

  • 以上の仕組みをAppleScriptにまとめておくのだ。



activate
set res to display dialog web_sharing_msg() buttons {"キャンセル", "OFF", "ON"} cancel button 1 default button web_sharing_btn() with title "Web共有コントローラー"

if res's button returned = "ON" then
apachectl_init() apachectl_restart() end if

if res's button returned = "OFF" then
apachectl_stop() end if




on apachectl_init() activate
do shell script "mkdir -p ~/Sites"
--do shell script "chmod +x ~/Sites" --ホーム直下ではデフォルト権限なので不要
do shell script "[ -f ~/Sites/index.html ] || echo Now Web Sharing! > ~/Sites/index.html"
if apache_version() starts with "2.2" then
do shell script "f=/etc/apache2/users/`basename $HOME`.conf
cat <<EOS > $f~
<Directory \"$HOME/Sites/\">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
EOS
diff -q $f~ $f || mv $f~ $f
rm -f $f~
" with administrator privileges
end if
if apache_version() starts with "2.4" then
do shell script "f=/etc/apache2/users/`basename $HOME`.conf
cat <<EOS > $f~
<Directory \"$HOME/Sites/\">
Options Indexes MultiViews
AllowOverride None
Require all granted
</Directory>
EOS
diff -q $f~ $f || mv $f~ $f
rm -f $f~
" with administrator privileges
end if
do shell script "f=/etc/apache2/httpd.conf
cat $f |
sed -E 's|#(LoadModule[ \\t]+authz_core_module[ \\t]+libexec/apache2/mod_authz_core.so)|\\1|g' |
sed -E 's|#(LoadModule[ \\t]+authz_host_module[ \\t]+libexec/apache2/mod_authz_host.so)|\\1|g' |
sed -E 's|#(LoadModule[ \\t]+userdir_module[ \\t]+libexec/apache2/mod_userdir.so)|\\1|g' |
sed -E 's|#(Include[ \\t]+/private/etc/apache2/extra/httpd-userdir.conf)|\\1|g' |
sed -E 's|#(LoadModule[ \\t]+php5_module[ \\t]+libexec/apache2/libphp5.so)|\\1|g' | # PHP enabled
cat > $f~
diff -q $f~ $f || mv $f~ $f
rm -f $f~
" with administrator privileges
do shell script "f=/etc/apache2/extra/httpd-userdir.conf
cat $f |
sed -E 's|#(Include /private/etc/apache2/users/\\*.conf)|\\1|g' > $f~
diff -q $f~ $f || mv $f~ $f
rm -f $f~
" with administrator privileges
end apachectl_init

on apachectl_restart() activate
do shell script "apachectl restart" with administrator privileges
end apachectl_restart

on apachectl_stop() activate
do shell script "apachectl stop" with administrator privileges
end apachectl_stop

on web_sharing_state() try
do shell script "curl -s http://localhost/"
true
on error
false
end try
end web_sharing_state

on web_sharing_btn() if web_sharing_state() then
3
else
2
end if
end web_sharing_btn

on web_sharing_msg() if web_sharing_state() then
"Web共有の状態 : ON
" & access_url_msg() & "
" & php_enabled_msg() else
"Web共有の状態 : OFF"
end if
end web_sharing_msg

on http_code(url_text) do shell script "curl -LI " & url_text & " -o /dev/null -w %{http_code}"
end http_code

on user_level_root_state() try
http_code("http://localhost/~" & (system info)'s short user name) = "200"
on error
false
end try
end user_level_root_state

on access_url_msg() if user_level_root_state() then
"
http://" & first_ip_address() & "/
http://" & first_ip_address() & "/~" & (system info)'s short user name & "/
"
else
"
http://" & first_ip_address() & "/
"
end if
end access_url_msg

on php_enabled() try
set status_code to do shell script "grep -E '^LoadModule[ \\t]+php5_module[ \\t]+libexec/apache2/libphp5.so$' /etc/apache2/httpd.conf"
true
on error
false
end try
end php_enabled

on php_enabled_msg() if php_enabled() then
" <?php ... ?> 有効"
else
" <?php ... ?> 無効"
end if
end php_enabled_msg

on apache_version() do shell script "apachectl -v | awk '/version/{print $3}' | sed -E 's/[^0-9.]+//'"
end apache_version

--優先順位の高いIPアドレスを取得
on first_ip_address() do shell script "ipconfig getifaddr `netstat -rn -f inet | awk '/^default/{print $6;exit}'`"
end first_ip_address

  • 上記スクリプトを実行すると、以下のように表示され、Web共有のON・OFFと状態の確認ができるのだ。