Raspberry PiでWebサーバを作る

Raspberry Piで立てたサーバにWebサーバ(Apache)をインストールして、PHPMySQLPerlRuby等が動作するように最低限の設定を行ってみる。

HTTPポートの開放

下記コマンドで既に作成したポート開放スクリプトにHTTP(80番ポート)のポート番号を追加する。

sudo sed -i -e 's/for port in \([0-9 ]*\); do/for port in \1 80; do/' /usr/local/bin/mydnsupdate.sh

HTTPポートの開放とWebサーバのインストール

下記コマンドでWebサーバのApacheをインストールする。

sudo apt-get install -y apache2

CGIを使う

下記コマンドでApacheCGIモジュールを有効化して、Apacheを再起動する。

sudo a2enmod cgid
sudo systemctl restart apache2

以後、/usr/lib/cgi-bin/が/cgi-bin/として見えるようになり、/cgi-bin/ディレクトリ内のすべてのファイルがCGIとして実行可能になる(もちろん、CGIファイルには実行属性を付加しておく必要がある)。
下記コマンドで/usr/lib/cgi-bin/perltest.cgiが作成され、http://example.mydns.jp/cgi-bin/perltest.cgiで実行できることが確認できる。

sudo su -c 'echo "#!/usr/bin/perl" > /usr/lib/cgi-bin/perltest.cgi'
sudo su -c 'echo '\''print "Content-type:text/plain\n\n";'\'' >> /usr/lib/cgi-bin/perltest.cgi'
sudo su -c 'echo '\''print "Perl CGI test.";'\'' >> /usr/lib/cgi-bin/perltest.cgi'
sudo chmod +x /usr/lib/cgi-bin/perltest.cgi

cgi-binディレクトリ以外でCGIを使う

下記コマンドでserve-cgi-binの設定ファイルを無効にして、securityの設定ファイルにWebサーバのルートディレクトリでのCGI実行を許可する設定を追加して、Apacheを再起動する。

sudo a2disconf serve-cgi-bin
sudo sh -c 'echo "<Directory /var/www/html>" >> /etc/apache2/conf-available/security.conf'
sudo sh -c 'echo "    Options +ExecCGI" >> /etc/apache2/conf-available/security.conf'
sudo sh -c 'echo "    AddHandler cgi-script .cgi" >> /etc/apache2/conf-available/security.conf'
sudo sh -c 'echo "</Directory>" >> /etc/apache2/conf-available/security.conf'
sudo systemctl reload apache2

以後、/usr/lib/cgi-bin/は/cgi-bin/として見えなくなり、ディレクトリ内のファイルをCGIとして実行することは出来なくなるが、/var/www/html/ディレクトリ内で拡張子が.cgiのファイルをCGIとして実行することが出来るようになる。

.htaccessを使う

下記コマンドでsecurityの設定ファイルに.htaccessを許可する設定を追加して、Apacheを再起動する。(前提として、cgi-binディレクトリ以外でCGIを使う設定を行なっている必要がある。)

sudo sed -i -e '/<Directory \/var\/www\/html>/a\    AllowOverride All' /etc/apache2/conf-available/security.conf
sudo systemctl reload apache2

ユーザディレクトリを使う

下記コマンドでuserdirモジュールを有効化して、Apacheを再起動する。

sudo a2enmod userdir
sudo systemctl restart apache2

以後、/home/newuser/public_html/が/~newuser/として見えるようになる。

ユーザディレクトリでCGIを使う

下記コマンドでuserdirの設定ファイルにユーザディレクトリでのCGI実行を許可する設定を追加、書き換えて、Apacheを再起動する。

sudo sed -i -e '/<\/Directory>/i\\t\tAddHandler cgi-script .cgi' /etc/apache2/mods-available/userdir.conf
sudo sed -i -e '/Options /s/IncludesNoExec/Includes ExecCGI/' /etc/apache2/mods-available/userdir.conf
sudo systemctl reload apache2

ユーザディレクトリで.htaccessを使う

下記コマンドでuserdirの設定ファイルを.htaccessを許可する設定に書き換えて、Apacheを再起動する。

sudo sed -i -e 's/AllowOverride .*/AllowOverride All/' /etc/apache2/mods-available/userdir.conf
sudo systemctl reload apache2

PHPのインストール

下記コマンドでPHPApachePHPモジュールをインストールする。

sudo apt-get install -y php libapache2-mod-php

下記コマンドで/var/www/html/phpinfo.phpが作成され、http://example.mydns.jp/phpinfo.phpで実行できることが確認できる。

sudo sh -c 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php'

ユーザディレクトリでPHPを使う

下記コマンドでphp7.0の設定ファイルのユーザディレクトリでのPHP実行不可設定をコメント化して、Apacheを再起動する。

sudo sed -i -e '/<IfModule mod_userdir\.c>/,/<\/IfModule>/s/^/#/' /etc/apache2/mods-available/php7.0.conf
sudo systemctl reload apache2

MySQLのインストール

下記コマンドでMySQLPHPMySQLモジュールをインストールし、MySQLのrootユーザーのパスワードを設定したら、PHPMySQLモジュールを読み込ませるためにApacheを再起動する。

sudo apt-get -y install mysql-server php-mysql
sudo mysqladmin -u root password 'sqlpass'
history -c
sudo systemctl restart apache2
  • ※sqlpassの部分は実際に設定したいMySQLのrootユーザーのパスワードに置き換える。
  • ※~/.bash_historyにパスワードが記載されてしまうので「history -c」でコマンド履歴を削除している。

WordPressのインストール

下記コマンドでWebサーバのルートディレクトリをリネーム、WordPressをダウンロードして展開、wordpressディレクトリをルートディレクトリとして設置後に所有者をWebサーバのユーザであるwww-dataに変更、MySQLにrootユーザーでログインし、WordPress用のデータベースを作成、WordPress用のユーザとパスワードを作成してデータベースの所有者に設定する。

sudo mv /var/www/html /var/www/html.bak
wget http://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
sudo mv wordpress /var/www/html
sudo chown -R www-data:www-data /var/www/html
sudo mysql -u root -e "CREATE DATABASE wpdata;"
sudo mysql -u root -e "GRANT ALL ON wpdata.* TO wpuser@localhost IDENTIFIED BY 'wppass';"
history -c
  • ※wpdata、wpuser、wppassの部分はMySQLWordPress用の任意のデータベース名、ユーザ名、パスワードに置き換える。
  • ※~/.bash_historyにパスワードが記載されてしまうので「history -c」でコマンド履歴を削除している。
  • MySQLのユーザの削除は「DROP USER wpuser@localhost;」で、データベースの削除は「DROP DATABASE wordpress;」で行える。
  • ※Webブラウザでhttp://example.mydns.jp/を開いて、日本語を選択→続ける→さあ、始めましょう!→データベース名にwordpress、ユーザー名にwpuser、パスワードにwppassを入力して、送信→インストール実行→サイトのタイトル、ユーザー名、パスワード、メールアドレスを入力して、WordPress をインストールで初回設定を行う。初回設定後、入力したメールアドレスにwordpress@example.mydns.jpから初回設定終了の旨のメールが届く。
  • WordPressは初回設定したURL以外からアクセス出来ないので、URLを変更する場合は、ダッシュボード→設定→一般からWordPress アドレス (URL)とサイトアドレス (URL)を書き換えて、変更を保存(この後、エラー404が表示され、これまで使用していたURLからはアクセス出来なくなる)。
  • WordPressのインポートで表示される最大サイズの2MBが小さい場合は、/etc/php/7.0/apache2/php.ini、/etc/php/7.0/cli/php.iniの「upload_max_filesize = 2M」を書き換えて、Apacheを再起動する。

Rubyのインストール

下記コマンドでRubyをインストールする。

sudo apt-get install -y ruby

tDiaryのインストール

下記コマンドでtDiary 5.0.8(基本セット)をダウンロードして展開し、tdiary-v5.0.8ディレクトリをユーザディレクトリのdiaryディレクトリとして設置、tDiary用ユーザー名とパスワードを作成、これに合わせて.htaccessを変更、tDiary用データディレクトリを作成してパーミッションを設定、これに合わせてtDiaryの設定ファイルを変更し、絵日記プラグインのimage.rbで使うimagesディレクトリを作成してパーミッションを設定する。

wget https://github.com/tdiary/tdiary-core/releases/download/v5.0.8/tdiary-v5.0.8.tar.gz
tar zxf tdiary-v5.0.8.tar.gz
cd tdiary-v5.0.8
mv dot.htaccess .htaccess
mv tdiary.conf.beginner tdiary.conf
mkdir images
chmod 777 images
chmod 777 data
sed -i -e 's:/home/foo/.htpasswd:/etc/apache2/.htpasswd:' .htaccess
sed -i -e 's/foo/tduser/' .htaccess
cd
sudo htpasswd -bc /etc/apache2/.htpasswd tduser tdpass
history -c
sudo mv tdiary-v5.0.8 /var/www/html/diary
sudo chown -R www-data:www-data /var/www/html/diary
  • ※tduser、tdpassの部分はtDiary用の任意のユーザ名とパスワードに置き換える。
  • ※~/.bash_historyにパスワードが記載されてしまうので「history -c」でコマンド履歴を削除している。

nkfのインストール

下記コマンドでnkfをインストールする。

sudo apt-get -y install nkf

PerlのJcodeモジュールのインストール

下記コマンドでPerlのJcodeモジュール(Jcode.pm)をインストールする。

sudo perl -MCPAN -e shell
install Jcode
exit

※「Would you like to configure as much as possible automatically? [yes] 」が出たら「yes」を入力する。(初回のみ)
perl -MJcode -e ''」と入力して何も出なければJcodeモジュールはインストールされている。

簡易BBSのインストール

下記コマンドで簡易BBS タイプ1 バージョン 10.32をダウンロードし、nkfコマンドでUTF-8に変換して、内部の表示処理もシフトJISからUTF-8に書き換えて、jcode.plを使わずにJcode.pmを使うように処理を書き換えて、ユーザディレクトリの/cgi-bin/ディレクトリに設置する。

wget http://www.rescue.ne.jp/cgi/minibbs/10.32/minibbs.cgi
nkf -w --overwrite minibbs.cgi
sed -i -e 's/charset=Shift_JIS/charset=utf-8/' minibbs.cgi
sed -i -e 's/require.*jcode\.pl.*/use Jcode;/' minibbs.cgi
sed -i -e 's/&jcode'\''convert(\*\([^,]*\),'\''\([^'\'']*\)'\'')/$\1 = Jcode->new($\1)->\2/' minibbs.cgi
sed -i -e 's:/usr/local/bin/perl:/usr/bin/perl:' minibbs.cgi
sed -i -e '/^$reload = /s#http://[^/]*/minibbs\.cgi#http://example.mydns.jp/cgi-bin/minibbs.cgi#' minibbs.cgi
sed -i -e '/^$modoru = /s#http://[^/]*/#http://example.mydns.jp/cgi-bin/#' minibbs.cgi
sudo mkdir /var/www/html/cgi-bin
sudo mkdir /var/www/html/cgi-bin/data
sudo chmod 777 /var/www/html/cgi-bin/data
touch /var/www/html/cgi-bin/data/data.cgi
sudo mv minibbs.cgi /var/www/html/cgi-bin/
sudo chmod 755 /var/www/html/cgi-bin/minibbs.cgi
sudo chown -R www-data:www-data /var/www/html/cgi-bin
  • ※Webブラウザでhttp://example.mydns.jp/cgi-bin/minibbs.cgiを開いて、新管理キーを任意に決めて、2箇所に入力して、OKで初回のマスターキーの設定を行う。
  • ※example.mydns.jpの部分はMyDNS.JPに設定したドメイン名に置き換える。

phpMyAdminのインストール

下記コマンドでphpMyAdminをインストールして、Apache用の設定ファイルのシンボリックリンクを作成して、設定を有効化した後、Apacheを再起動し、別のユーザからrootログインできるようにMySQLのrootユーザからunix_socketプラグインをはずす。

sudo DEBIAN_FRONTEND=noninteractive apt-get install -y phpmyadmin
cd /etc/apache2/conf-available/
sudo ln -s ../../phpmyadmin/apache.conf phpmyadmin.conf
cd
sudo a2enconf phpmyadmin
sudo systemctl reload apache2
sudo mysql -u root mysql -e "update user set plugin='' where user='root';"
sudo mysql -u root mysql -e "flush privileges;"

Webブラウザで「http://example.mydns.jp/phpmyadmin/」を開き、「ユーザ名」に「root」、「パスワード」にMySQLのrootユーザのパスワードを入力して「実行」。

Webサーバを任意のユーザで実行する

下記コマンドでsuEXECモジュールのインストールと有効化を行う。

sudo apt-get install -y apache2-suexec-custom
sudo a2enmod suexec
sudo systemctl restart apache2
  • ※「sudo /usr/lib/apache2/suexec -V」で確認できるが、/var/www以下はwww-dataで、public_html/cgi-bin以下はその所有者のユーザで実行される状態になっている。
  • CGIファイルおよびCGIファイルの置かれているディレクトリの所有者が実行ユーザでなければ、Internal Server Errorとなるので注意。

下記コマンドでpublic_html/cgi-binではなくpublic_html以下がその所有者のユーザで実行されるように書き換える。

sudo sed -i -e 's:public_html/cgi-bin:public_html:' /etc/apache2/suexec/www-data
sudo systemctl restart apache2

下記コマンドで/var/www以下の実行ユーザをwww-dataではなく、任意のユーザに変更する。任意のユーザを作成してパスワードを設定し、そのユーザ名を設定して、Apacheを再起動する。

sudo useradd wwwuser
cat < EOT | sudo passwd wwwuser
wwwpass
wwwpass
EOT
history -c
sudo sed -i -e '/DocumentRoot \/var\/www\/html/a\\tSuexecUserGroup wwwuser wwwuser' /etc/apache2/sites-available/000-default.conf
sudo systemctl restart apache2
  • ※wwwuser、wwwpassの部分は任意のユーザ名とパスワードに置き換える。
  • ※WebサーバをSSL化した場合は、/etc/apache2/sites-available/000-default.confと同様の変更を/etc/apache2/sites-available/default-ssl.confに行う必要がある。
  • ※~/.bash_historyにパスワードが記載されてしまうので「history -c」でコマンド履歴を削除している。