ArchLinux: Apacheのuserdirモジュールでpublic_htmlを公開する

ユーザ毎のwebサーバを立ち上げるuserdirモジュールの使い方を記載します。

 

1 apacheのインストール

pacmanでapacheをインストールします。

$ sudo pacman -S --noconfirm apache
$ sudo systemctl enable httpd
$ sudo systemctl restart httpd

2 ホームディレクトリのパーミッションは701か710

ホームディレクトリのパーミッションを700から701へ変更しないと403 Forbiddenとなります。

/home/*/の実行権限がなく、public_htmlを開くことができないからです。

$ chmod 701 ~

あるいはホームディレクトリの所有グループをhttpグループに変更します。

$ sudo chown hiroom2:http ~
$ chmod 710 ~

なお、701の場合も710の場合でも、他者からホームディレクトリ配下のディレクトリを隠蔽したい場合は700のディレクトリを一つ作成し、その下にファイルやディレクトリを置くようにする必要があります。

3 public_htmlの作成

public_htmlを作成します。

$ mkdir ~/public_html

このまま以下のURLにアクセスすると以下の様な画面が表示されます。

ファイルをダウンロードさせるだけならばこのままpublic_htmlにファイルを置くだけでも良いでしょう。

http://<server>/~<username>

0001_FileList.png

URLにアクセスするとDirectoryIndexにindex.htmlがデフォルトで呼ばれます。

index.htmlを作成して簡易なページを表示させることもできます。

0002_IndexHTML.png

4 Digest認証の導入

httpd.confでauth_digest_moduleをロードするようにします。

$ diff -uprN /etc/httpd/conf/httpd.conf{.org,}
--- /etc/httpd/conf/httpd.conf.org      2016-06-04 20:49:46.046666665 +0000
+++ /etc/httpd/conf/httpd.conf  2016-06-04 20:49:50.329999997 +0000
@@ -81,7 +81,7 @@ LoadModule authz_core_module modules/mod
 LoadModule access_compat_module modules/mod_access_compat.so
 LoadModule auth_basic_module modules/mod_auth_basic.so
 #LoadModule auth_form_module modules/mod_auth_form.so
-#LoadModule auth_digest_module modules/mod_auth_digest.so
+LoadModule auth_digest_module modules/mod_auth_digest.so
 #LoadModule allowmethods_module modules/mod_allowmethods.so
 #LoadModule file_cache_module modules/mod_file_cache.so
 #LoadModule cache_module modules/mod_cache.so

httpdを再起動します。

$ sudo systemctl restart httpd

以下の様なpublic_html/.htaccessを作成します。"hiroom2"はレルムと呼ばれるものです。

AuthType Digest
AuthName "hiroom2"
AuthUserFile /home/hiroom2/.htdigest
require valid-user

レルム"hiroom"へアクセスするユーザhiroom2を追加します。

$ htdigest -c ~/.htdigest "hiroom2" hiroom2
Adding password for hiroom2 in realm hiroom2.
New password:
Re-type new password:

ページにアクセスするとユーザ名とパスワードを求められます。

0003_Password.png

5 CGIの導入

userdirはデフォルトでExecCGIを許可していません。

CGI導入するならDocker等でコンテナを作成した方が良いのかもしれません。

 

httpd.confでmod_cgiをロードするようにします。

$ diff -uprN /etc/httpd/conf/httpd.conf{.org,}
--- /etc/httpd/conf/httpd.conf.org      2016-06-04 21:11:04.709999998 +0000
+++ /etc/httpd/conf/httpd.conf  2016-06-04 21:17:42.176666667 +0000
@@ -152,8 +152,8 @@ LoadModule lbmethod_byrequests_module mo
 LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
 LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
 LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
-LoadModule mpm_event_module modules/mod_mpm_event.so
-#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
+#LoadModule mpm_event_module modules/mod_mpm_event.so
+LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
 #LoadModule mpm_worker_module modules/mod_mpm_worker.so
 LoadModule unixd_module modules/mod_unixd.so
 #LoadModule heartbeat_module modules/mod_heartbeat.so
@@ -168,7 +168,7 @@ LoadModule autoindex_module modules/mod_
        #LoadModule cgid_module modules/mod_cgid.so
 </IfModule>
 <IfModule mpm_prefork_module>
-       #LoadModule cgi_module modules/mod_cgi.so
+       LoadModule cgi_module modules/mod_cgi.so
 </IfModule>
 #LoadModule dav_fs_module modules/mod_dav_fs.so
 #LoadModule dav_lock_module modules/mod_dav_lock.so

DirectoryIndexにindex.cgiを追加します。

$ diff -uprN /etc/httpd/conf/httpd.conf{.org,}
--- /etc/httpd/conf/httpd.conf.org      2016-06-04 21:19:30.453333336 +0000
+++ /etc/httpd/conf/httpd.conf  2016-06-04 21:19:34.489999999 +0000
@@ -280,7 +280,7 @@ DocumentRoot "/srv/http"
 # is requested.
 #
 <IfModule dir_module>
-    DirectoryIndex index.html
+    DirectoryIndex index.html index.cgi
 </IfModule>

 #

httpd-userdir.confのOptionsにExecCGIを追加します。

$ diff -uprN /etc/httpd/conf/extra/httpd-userdir.conf{.org,}
--- /etc/httpd/conf/extra/httpd-userdir.conf.org        2016-06-04 20:57:13.936666661 +0000
+++ /etc/httpd/conf/extra/httpd-userdir.conf    2016-06-04 20:57:29.709999999 +0000
@@ -15,7 +15,7 @@ UserDir public_html
 #
 <Directory "/home/*/public_html">
     AllowOverride FileInfo AuthConfig Limit Indexes
-    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
+    Options ExecCGI MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
     Require method GET POST OPTIONS
 </Directory>

httpdを再起動します。

$ sudo systemctl restart httpd

以下の様なpublic_html/.htaccessを作成します。

AddHandler cgi-script .cgi

以下のindex.cgiを追加し、実行権限を付与します。

$ cat <<EOF > ~/public_html/index.cgi
#!/bin/sh

echo "Content-type: text/html"
echo ""
echo "hello"
EOF
$ chmod a+x ~/public_html/index.cgi

URLにアクセスするとindex.cgiによるHTMLが出力されました。

0004_IndexCGI.png