Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2015-03-30

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だった)
    • OSX 10.9 Mavericksまで
$ 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の内容が表示されている。

f:id:zariganitosh:20150330124336p:image:w450

/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 <<EOS > /etc/apache2/users/zari.conf
<Directory \"$HOME/Sites/\">
    Options Indexes MultiViews
    AllowOverride None
    Require all granted
</Directory>
EOS

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

f:id:zariganitosh:20150330124337p:image:w450

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と状態の確認ができるのだ。

f:id:zariganitosh:20150330124339p:image:w450

f:id:zariganitosh:20150330124338p:image:w450

参考ページ

以下のページがたいへん参考になりました。感謝です!

tktk 2015/08/27 23:21 既に良く知られたことかもしれませんが、Server.app をインストールすると、/etc/apache2/httpd.conf は無効となり、/Library/Server/web/config/apache2/httpd_server_app.conf をシステムは参照することになるみたいです。まあ、Server.app をどれだけの人が使っているかは分かりませんが、結構苦労したのでとりあえずご報告しておきます。

HajimeHajime 2015/09/14 02:19 ユーザーdir を公開できるのがわかりました。同様にユーザーdir 内のCGI(peal)を実行するにはどうすればよいのでしょうか?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元