【CentOS-5.x】レンタルサーバのつくりかた

自宅サーバやVPSに、複数ユーザをホスティングさせる際の忘備録です。

概要

レンタルサーバのように、ホスティングユーザ権限でCGI/PHPを実行できるようにします。
これにより、複数のユーザを一つのサーバに共存させたときのセキュリティリスクを
最小限に抑えるとともに、ホスティングユーザへ一定の可用性を提供することができます。
ApacheのsuEXECという機能を使用して実現します。

この記事でできるプログラム実行環境: Perl, PHP5 (suEXEC)
ホスティングユーザのDocumentRoot: /home/ユーザ名/public_html
所要時間: 1~2時間

  1. Webサーバをインストール(RPMパッケージから / ソースコードから)
  2. PHP5をCGIモードでインストール
  3. Webサーバの設定
  4. ホスティングユーザの環境整備
  5. Webサーバ起動・テスト

1. Webサーバをインストール

CentOS5にWebサーバ(apache2)をインストールします。

RPMパッケージを取得

ユーザごとのDocumentRoot(/home/ユーザ名/public_html)配下に設置したCGIを正しく動作させるためには、
ソースRPMパッケージをダウンロードしてインストールする必要があります。
(残念ながらyumは使用できません)

[sukobuto@bar ~]$ sudo wget ftp://ftp.riken.jp/Linux/centos/5/updates/SRPMS/httpd-2.2.3-53.el5.centos.1.src.rpm
~省略~
 
100%[===========================================================================================>] 6,552,695   3.51M/s 時間 1.8s    
 
2012-02-08 20:07:42 (3.51 MB/s) - `httpd-2.2.3-53.el5.centos.1.src.rpm' へ保存終了 [6552695]
[sukobuto@bar ~]$ sudo mkdir -p /usr/src/redhat/SOURCES
[sukobuto@bar ~]$ sudo useradd -s /sbin/nologin mockbuild
[sukobuto@bar ~]$ sudo rpm -ivh httpd-2.2.3-53.el5.centos.1.src.rpm

コンパイルオプションの修正

suEXECのオプションを修正します。

[sukobuto@bar ~]$ sudo vi /usr/src/redhat/SPECS/httpd.spec
1
%define contentdir /home    # /var/www → /home

この修正により、/home/ユーザ名/public_html 配下に設置したCGIが、ホスティングユーザの実行権限で動作するようになります。
(この修正をしない場合、ホスティングユーザのCGIを /var/www/配下に設置しなければならない。)

ビルド・インストール

まず、ビルドに必要なパッケージをインストールします。

[sukobuto@bar ~]$ sudo yum -y install rpm-build autoconf automake libtool xmlto apr-devel apr-util-devel pcre-devel distcache-devel

httpd(apache2)をビルドします。環境にもよりますが、少々時間がかかります。

[sukobuto@bar ~]$ sudo rpmbuild --bb /usr/src/redhat/SPECS/httpd.spec

インストールします。

32bitシステム(i386)の場合

[sukobuto@bar ~]$ ls -l /usr/src/redhat/RPMS/i386
合計 5780
-rw-r--r-- 1 root root 1314658  2月  8 12:09 httpd-2.2.3-53.1.i386.rpm
-rw-r--r-- 1 root root 3484975  2月  8 12:09 httpd-debuginfo-2.2.3-53.1.i386.rpm
-rw-r--r-- 1 root root  155635  2月  8 12:09 httpd-devel-2.2.3-53.1.i386.rpm
-rw-r--r-- 1 root root  841582  2月  8 12:09 httpd-manual-2.2.3-53.1.i386.rpm
-rw-r--r-- 1 root root   95996  2月  8 12:09 mod_ssl-2.2.3-53.1.i386.rpm

64bitシステム(x86_64)の場合

[sukobuto@bar ~]$ ls -l /usr/src/redhat/RPMS/i386
合計 5780
-rw-r--r-- 1 root root 1314658  2月  8 12:09 httpd-2.2.3-53.1.x86_64.rpm
-rw-r--r-- 1 root root 3484975  2月  8 12:09 httpd-debuginfo-2.2.3-53.1.x86_64.rpm
-rw-r--r-- 1 root root  155635  2月  8 12:09 httpd-devel-2.2.3-53.1.x86_64.rpm
-rw-r--r-- 1 root root  841582  2月  8 12:09 httpd-manual-2.2.3-53.1.x86_64.rpm
-rw-r--r-- 1 root root   95996  2月  8 12:09 mod_ssl-2.2.3-53.1.x86_64.rpm

上記コマンドにより表示されたパッケージ

  • httpd
  • httpd-debuginfo
  • httpd-devel
  • httpd-manual
  • mod_ssl

をすべてインストールします。

例(32bitシステムの場合)

[sukobuto@bar ~]$ sudo rpm -ihv --force httpd-2.2.3-53.1.i386.rpm \
httpd-debuginfo-2.2.3-53.1.i386.rpm \
httpd-devel-2.2.3-53.1.i386.rpm \
httpd-manual-2.2.3-53.1.i386.rpm \
mod_ssl-2.2.3-53.1.i386.rpm
 
Preparing...                ########################################### [100%]
   1:httpd                  ########################################### [ 20%]
   2:httpd-debuginfo        ########################################### [ 40%]
   3:httpd-devel            ########################################### [ 60%]
   4:httpd-manual           ########################################### [ 80%]
   5:mod_ssl                ########################################### [100%]

2. PHP5をCGIモードでインストール

準備

事前に必要なライブラリをインストールする

[sukobuto@bar ~]$ sudo yum -y install libxml2-devel libjpeg-devel libpng-devel zlib-devel

PHPが既にインストールされている場合はアンインストールする

[sukobuto@bar ~]$ sudo yum remove php
~省略~
Remove        1 Package(s)
Reinstall     0 Package(s)
Downgrade     0 Package(s)
 
Is this ok [y/N]: y [Enter]

ビルド・インストール

rootで作業する

[sukobuto@bar ~]$ su -

ソースコードをダウンロード・展開

[root@bar ~]# wget http://jp.php.net/get/php-5.3.10.tar.gz/from/this/mirror
[root@bar ~]# tar -xzf php-5.3.10.tar.gz

ビルド・インストール

[root@bar ~]# ./configure \
--enable-cgi \
--enable-mbstring \
--enable-mbregex \--enable-zip \
--enable-exif \
--with-regex \
--with-curl=/usr \
--with-gd \
--with-mysql=/usr/local/mysql \
--with-mysqli \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-jpeg-dir \
--with-iconv=/usr/local \
--with-tsrm-pthreads \
--with-mcrypt \
--with-openssl \
--enable-gd-native-ttf \
--enable-maintainer-zts
[root@bar ~]# make
[root@bar ~]# make install

/usr/local/php としてアクセスできるようにシンボリックリンクを作成

[root@bar ~]# ln -s /usr/local/php-5.3.10 /usr/local/php

php-cgi ができていれば成功

[root@bar ~]# ls -l /usr/local/php/bin
合計 52108
-rwxr-xr-x 1 root root      867 12月 20 13:04 pear
-rwxr-xr-x 1 root root      888 12月 20 13:04 peardev
-rwxr-xr-x 1 root root      804 12月 20 13:04 pecl
lrwxrwxrwx 1 root root       34  1月 25 20:22 phar -> /usr/local/php-5.3.10/bin/phar.phar
-rwxr-xr-x 1 root root    53470  1月 25 20:22 phar.phar
-rwxr-xr-x 1 root root 26560775  1月 25 20:22 php
-rwxr-xr-x 1 root root 26642349  1月 25 20:22 php-cgi
-rwxr-xr-x 1 root root     2814  1月 25 20:22 php-config
-rwxr-xr-x 1 root root     4522  1月 25 20:22 phpize

php.ini の編集

[root@bar ~]# vi /usr/local/php/lib/php.ini

タイムゾーンを「Asia/Tokyo」に設定

649
650
651
652
[Date]
; Defines the default timezone used by the date functions
;date.timezone =
date.timezone="Asia/Tokyo"

3. Webサーバの設定

ホスティングユーザの仮想ホストを設定する

ここでは、ホスティングユーザごとのWebサイトを、名前ベース仮想ホストを使って
登録する方法を説明します。

設定例

Webサイト(サーバ名) ユーザ名
www.foo.jp foo
www.hoge.com hoge

設定ファイルhttpd.confを編集します

[root@bar ~]# vi /etc/httpd/conf/httpd.conf
ScriptAlias /php5-foo /home/foo/cgi-bin/php-cgi    # fooさんのPHP実行スクリプト指定
ScriptAlias /php5-hoge /home/hoge/cgi-bin/php-cgi  # hogeさんのPHP実行スクリプト指定
 
# fooさんの仮想ホスト設定
<VirtualHost *:80>
  ServerName www.foo.jp
  DocumentRoot "/home/piyo/public_html"
  ServerAlias foo.jp
  SuexecUserGroup foo foo
 
  ErrorLog /var/log/httpd/foo-error.log
  CustomLog /var/log/httpd/foo-access.log
  <Directory "/home/foo/public_html">
    Options FollowSymLinks ExecCGI
    DirectoryIndex index.php index.html index.htm index.cgi
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
 
# hogeさんの仮想ホスト設定
<VirtualHost *:80>
  ServerName hoge.com
  DocumentRoot "/home/hoge/public_html"
  ServerAlias www.hoge.com
  SuexecUserGroup hoge piyo
 
  ErrorLog /var/log/httpd/hoge-error.log
  CustomLog /var/log/httpd/hoge-access.log
  <Directory "/home/hoge/public_html">
    Options FollowSymLinks ExecCGI
    DirectoryIndex index.php index.html index.htm index.cgi
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

「レンタルサーバー・自宅サーバー設定・構築のヒント」様を参考にさせて頂きましたので、詳細はそちらをご覧ください。

ホスティングユーザの環境整備

ホスティングユーザの作成と、環境整備を行います。

ホスティングユーザfooの例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@bar ~]# useradd foo             # ユーザの作成
[root@bar ~]# passwd foo              # 初期パスワードの設定
[root@bar ~]# chmod 710 /home/foo     # グループまで参照可にする
[root@bar ~]# usermod -a -G foo apache  # fooグループにapacheユーザを追加する
[root@bar ~]# su - foo                # fooユーザで作業する
[foo@bar ~]$ mkdir public_html        # ドキュメントルートのディレクトリを作成
[foo@bar ~]$ mkdir cgi-bin            # php-cgi用のディレクトリを作成
[foo@bar ~]$ cat << EOS > cgi-bin/php-cgi    # php-cgiの実行スクリプトを作成
#!/bin/sh
exec /usr/local/php-5.3.8/bin/php-cgi
EOS
[foo@bar ~]$ cat << EOS > public_html/.htaccess  # .htaccessを作成
Action php5-cgi /php5-foo
AddHandler php5-cgi .php
EOS
[foo@bar ~]$ chmod 710 public_html    # グループまで参照可にする
[foo@bar ~]$ chmod -R 710 cgi-bin     # グループまで参照可にする
[foo@bar ~]$ exit                     # rootユーザに戻る

※注意
4行目は、「apacheユーザをfooグループに追加所属させる」という意味だと捉えて下さい。
usermodコマンドにて、オプション「-a」を忘れてしまうと
apacheユーザが所属するグループが上書きされてしまいます。
かならず「-a」をつけて下さい。

これを各ホスティングユーザで繰り返します。

Webサーバ起動・テスト

httpdを起動します。

[root@bar ~]# service httpd start

テスト用のCGI, PHPファイルを設置します。

【重要】
ファイルやディレクトリは適切なアクセス権が設定されていないと、エラーになり実行できません。
具体的には、所有者(ホスティングユーザ)以外に書き込み権限を与えては行けません。

CGI(perl)のテスト

[root@bar ~]# su - foo
[foo@bar ~]# cd public_html
[foo@bar public_html]# vi test.cgi
1
2
3
4
5
#!/usr/bin/perl
print "Content-type:text/html\n\n";
print "<h1>It works!</h1><p>Exec user : ";
print `whoami`;
print "</p>";
[foo@bar public_html]$ chmod 755 test.cgi

この状態で、ブラウザから/test.cgiにアクセスして、ユーザ名が表示されれば成功です。

PHPのテスト

[foo@bar public_html]# vi test.php
1
2
3
<?php
    phpinfo();
?>
[foo@bar public_html]$ chmod 755 test.php

この状態で、ブラウザから/test.phpにアクセスして、PHP情報ページが表示されれば成功です。

以上です。

Posted in: Linux