ユーザ毎のwebサーバを立ち上げるuserdirモジュールの使い方を記載します。
Table of Contents
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>
URLにアクセスするとDirectoryIndexにindex.htmlがデフォルトで呼ばれます。
index.htmlを作成して簡易なページを表示させることもできます。
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:
ページにアクセスするとユーザ名とパスワードを求められます。
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が出力されました。