読者です 読者をやめる 読者になる 読者になる

tsujimotterのノートブック

日曜数学者 tsujimotter の「趣味で数学」実践ノート

CentOS 6.5 で ユーザーディレクトリに public_html を作り、その中の html ファイルを Apache で公開するためには

技術系

だいぶ長いタイトルですね。笑

タイトルの通りそのままの記事です。

結構苦戦したので、数ヶ月後の自分のために丁寧にまとめて残しておきます。

実は、1ヶ月前にも一度この手順を踏んでいて、今回は CentOS の再インストールのため2度目の挑戦だったのですが・・・やっぱり苦戦しました。笑



まず、「そもそも、なぜ公開用の html ファイルをユーザーディレクトリ下に置きたいのか」という点に触れておきます。

Apache をインストールしたときには、/var/www/html が公開ファイルのデフォルトの配置先になるのですね。

で、これは非常に気持ちが悪い。

だって、ユーザーが自分用の情報を置きたいだけなのに、わざわざほかのユーザーも見える共用のディレクトリ (/var/www/html) に置かないといけないのです。

しかも、/var/www/html に置くためには管理者権限が必要です。


そこで、ユーザー毎のホームディレクトリの下に、ユーザー自身が管理者権限なしに自由に配置できるような公開ディレクトリを作れたらいいなと思うわけです。


今回はユーザーを hoge として、/home/hoge 内に public_html を作成し、その中に自由に html を配置して、ブラウザからアクセスできることを目指します。



基礎知識

Apache (httpd) のインストール

$ sudo yum install httpd

Apacheの起動

$ sudo /etc/init.d/httpd start

Apache の再起動

$ sudo /etc/init.d/httpd restart

Apache の停止

$ sudo /etc/init.d/httpd restart

http://localhostApacheの画面が出てくれば成功です。

この時点で /var/www/html 以下に管理者権限で html ファイルをおけば、任意のページをブラウザで表示させることができます。


また、デバッグ用に以下のコマンドを覚えておくといいでしょう。


アクセスログの確認

# tail -f /var/log/httpd/access_log

エラーログの確認

# tail -f /var/log/httpd/error_log

参考:
CentOS apache アクセスログ デフォルトディレクトリ - R-KのはてなD
apacheのログの確認(CentOS) : Android PHP デザインまとめ

ユーザーディレクトリの公開

まず、あなたのユーザー名を hoge と仮定します。


ブラウザから、

http://localhost/~hoge/

へアクセスすると、

/home/hoge/public_html/index.html

が呼ばれるように設定しましょう。



まず、/home/hoge/ すなわち ~/ に public_html と index.html を配置します。

$ cd ~
$ mkdir public_html
$ cd public_html
$ echo 'Otsukare sama desu.' > index.html


これで、http://localhost/~hoge/ にアクセスしてみても正しく表示されませんね。次のエラーページが表示されることでしょう。

Not Found
The requested URL /~hoge/ was not found on this server.


原因はあなたがアクセスしたディレクトリに対する Apache の許可がないからです。

そこで、Apacheの設定ファイルである httpd.conf を変更して、public_html 以下のファイルを公開出来るようにしましょう。

$ sudo /etc/httpd/conf/httpd.conf
<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    UserDir disabled
    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disable" line above, and uncomment
    # the following line instead:
    #
    #UserDir public_html

</IfModule>

これはテキスト形式の設定ファイルなので、vim を使って編集していきましょう。

この記述を・・・

<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    UserDir disabled
    UserDir enabled hoge
    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disable" line above, and uncomment
    # the following line instead:
    #
    UserDir public_html

</IfModule>

このようにできれば完成です。

ユーザー hoge の UserDir を許可して、公開ディレクトリの名称を public_html と設定しています。


httpd.conf を操作したら、必ず Apache を再起動させます。

Apache の再起動

$ sudo /etc/init.d/httpd restart

httpd.conf の構文が間違っていれば、再起動に失敗するはずです。



さて、この状態で、http://localhost/~hoge/ にアクセスしてみましょう。

Forbidden
You don't have permission to access /~hoge/ on this server.

のようなエラーが出たと思います。


こんなときこそ、エラーログです。

[Xxx XXX XX XX:XX:XX 20XX] [error] [client ::1] (13)Permission denied: access to /~hoge/index.html denied


わかりにくいですが、Permission denied です。
これは、ファイルやフォルダのパーミッションが間違っているということです。

パーミッションの設定

chmod 701 /home/hoge
chmod 701 /home/hoge/public_html

この2つはアクセスしたい index.html に到達するためのディレクトリですね。
ややこしいのですが、権限は 701 です。 700 ではダメです。

参考:
apache を利用しての public_html が公開できない - 解 - いろきゅう.jp 〜Programmable maiden〜 Tech side


権限関係でもう1つ。
CentOS には SELinux というセキュリティがかかっています。

デフォルトの設定では、これのせいでブラウザからユーザーディレクトリにアクセスできません。

ここでは、SELinux を切ってしまいましょう。


SELinuxの設定

$ sudo getenforce 
Enforcing
$ sudo setenforce 0 
$ sudo getenforce 
Permissive

このままだと、一時的に切れただけなので、再起動すると元に戻ってしまいます。

起動時に自動で設定されるようにするためには、次のようにファイルの編集が必要です。

$ sudo vim /etc/sysconfig/selinux

デフォルトでこんな風になっているはずです。

SELINUX=enforcing

これをこうしておきましょう。

#SELINUX=enforcing
SELINUX=disabled

参考:
[CentOS][Apache]ユーザ毎のディレクトリを公開する | ごった煮 - tips about programming and building a server
[CentOS]SELinuxを無効にするには | ごった煮 - tips about programming and building a server

ただ、このやり方はあまりスマートなやり方ではないようですね。
まあ、セキュリティを自らぶち壊しているわけですから。

もう少しスマートにやりたい方は、次を読んでください。

参考:
ユーザーディレクトリを公開するときの SELinux の設定
[CentOS][Apache]SELinux有効下でのユーザ毎のディレクトリを公開する | ごった煮 - tips about programming and building a server


さぁ、アクセスしたまえ!

これで表示されるはず!

http://localhost/~hoge/

次のようなページが表示されればオーケーです。

Otsukare sama desu.

お疲れ様です。


今後の方向性

どうでしたか。ユーザーディレクトリのページを公開するだけで、非常に面倒な作業でしたね。


さて、今回 HTML が表示できたわけですが、次にやりたくなるのは CGI ですね。

やはり静的なページよりも、動的なページを作りたいものです。

しかし、残念ながらここには suEXEC という非常に面倒な話が入ってきてしまいます。


そういえば、外部のPCから下記のようにIPアドレスを打ち込んで表示するのも、残念ながら今の段階ではできません。

http://xxx.xxx.xxx.xxx/~hoge/

CentOSファイアウォールの設定が必要なのですね。気になる方は 「iptables」 で検索してみてください。


というわけで、これから先も長くなりそうなので、今回はここら辺で切り上げて、次回以降の内容に期待しましょう。

それでは。