OSX 10.10 YosemiteでWeb共有を有効にする
OSX 10.8以降、システム環境設定からWeb共有のGUI設定がなくなってしまった。しかし、なくなったのはGUI設定だけで、apache2の設定ファイルを修正すれば、以前同様Web共有が使える。そこで、簡単にWeb共有を開始できるように、以前の日記でAppleScriptにまとめておいた。
ところが、時は流れてOSX 10.10 Yosemiteでは、上記AppleScriptではWeb共有が使えなくなっていた...。
apacheのバージョン
$ 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.soLoadModule 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 から 2.4の変更箇所は以下の部分。
- Upgrading to 2.4 from 2.2 - Apache HTTP Server Version 2.4
-
# apache 2.2
Order allow,deny
Allow from all
# apache 2.4
Require all granted
Webサーバーを再起動
- 以上の設定を反映させるため、Webサーバーを再起動する。
$ sudo apachectl restart
- http://localhost/~zari/
- ~/Sites/index.htmlの内容が表示されている。
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
-
-
- ちなみに、前回の優先順位の高いローカルIPアドレスを取得するコマンドは、このスクリプトで使うために調べた。
-
- 上記スクリプトを実行すると、以下のように表示され、Web共有のON・OFFと状態の確認ができるのだ。
参考ページ
以下のページがたいへん参考になりました。感謝です!
- Install and configure Apache, MySQL, PHP on OSX 10.8 Mountain Lion
- Install Apache, MySQL, PHP and phpMyAdmin on OSX 10.9 Mavericks for Local Development
- Apache, MySQL, PHP and phpMyAdmin on OSX 10.10 Yosemite for Local Development
- Apache - MacOS X の Yosemite (10.10) で Sites ディレクトリを使って localhost をアカウント別に利用する方法 - Qiita