きっと正しくないレンタルサーバーの作り方 Vol.1 -プロジェクト事始め
はじめに
皆さん、突然ですが Twitter、やってますか(・∀・)? やってる人が多いと思いますが、何だか人間関係とかギスギスしてますよね(・∀・)? (偏見)
だから Twiter もいいけど、もうギスギスするのとか、SNSとか疲れたからさ、どこかの無料ホームページスペースにコミュニティー作ってさ、自作のイラストサイトとか作ってさ、PHPで掲示板とか。。作ってさ、身内でワイワイ盛り上がってさ、でさ、でさ。。。PHPとかでアクセスカウンターとか設置してさ、キリ番踏んだらイラストの。。グスッ( ;∀;)。。。リクエストとか。。。うぅ。。。・゚・(ノ∀`)・゚・
昔懐かしいレンタルサーバースペース、最近見かけませんよね(・∀・)。 見かけないなら作ってみたくなりませんか(・∀・)?
なりますよね(・∀・)?
なりましたよね(・∀・)?
と言う訳で、今回はごく普通のレンタルサーバーを作ってみましょう(´ω`)。
※注意! この一連の記事で紹介するコードは動作の概念を説明するものでありセキュリティーなどはあまり意識していません(・∀・)。
実際に運用するシステムなどに使用しないでください(・∀・)。 (そのまま使うひともいないと思いますがw)
また、私も記事を書きながら開発をしていくので「後になってみたら最初の方の記事間違えてたー」なんて事は起きそうです(・∀・)。
ご了承ください(・∀・)。
作るもの
- PHPの動くレンタルサーバーサービス(今風に言うとホスティングサービス)
- 今回は rentaserve.com と言う名前で作っていこうと思います(・∀・)。
「はいはい出ました、どうせお手軽に Apache に PHP と FTP 入れてれんたるさ~ば~って言うつもりでしょ?」
という声が聞こえてきそうですねですが、基本はそのとおりです(・∀・)。 ですが、それだけでは面白くないので、もうちょっとだけ機能を付け加えます(・∀・)。
方針
学習目的なので、可能な限りフルスクラッチする方向で、出来るだけ外部のライブラリを使用しないで実装していこうと思います(・∀・)。
要求っぽいもの
今回作る rentaserve の仕様は ロリポップ! や XServer などを参考に 独自の仕様を検討していきます (・∀・)。
まず、簡単にレンタルサーバーに必要な機能を列挙していきます(・∀・)。
- 好きなファイルを FTP でアップロードできる
- アップロードしたファイルはインターネットに公開できる
- PHPが動く
- Let's Encrypt による SSL対応
- メールアドレスを作成可能
- FTPユーザーを作成可能
- データベースを使える
- 独自ドメインでウェブページを公開できる
など、それなりに機能があります(・∀・)。
他にも
- ユーザーが上記の操作を出来るウェブサイト
- 管理者側のウェブサイトと管理機能
- アクセスログ解析
- バックアップとリストアの仕組み
- ディスク領域の制限
- 最低限のセキュリティー
などを考慮しないといけませんね(・∀・)。 記事を書いていていすでに億劫になってきました (・∀・)w
まだまだ仕様にはなっていませんが、やりたいことは見えてきたかと思います(・∀・)。
ざっくりしたアーキテクト
どこから書くのがよのか分かりませんが、適当に順不同で書いていきます(・∀・)。 色々と技術検討をした結果、脳内で決まった技術要素を書いていきます(・∀・)。
サービスを動かす環境
まず、環境としては
- IPアドレスとインターネットに公開する Linux マシン
を前提とします(・∀・)。
今回は ConoHa 上にレンタルサーバーを構築していきます(・∀・)。 他のVPSサービスでも構いませんし、自宅サーバーとかでも良いと思います(・∀・)。
ホスティングサービスである ConoHa VPS 上にホスティングサービスであるレンタルサーバーを構築して良いのか良く分かりませんが、怒られたら方針を変更します(・∀・)w
ざっくり必要なサーバー
まず Linux、私が個人的に使い慣れている Debian/GNU Linux 11 を使います(・∀・)。
最初は CentOS で構築を試みていたのですが、CentOS は標準のパッケージが古い傾向があって見送りました(・∀・)。
もちろん、CentOS を使っても FreeBSD を使っても自由です(・∀・)。
各サーバーの設定をいじれるのであればおおむね似た手順だと思います(・∀・)。
もしもリクエストが多ければ他の OS での手順の併記も考えます(・∀・)w
rentaserve では、以下のサーバーソフトウェアを使うことになります(・∀・)。
- Apache2.4
- PHP 8.1
- Postfix/Dovecot
- mariaDB
- ProFTPd
- PowerDNS
他にもこまごまと使用しますが、それは個々の手順の解説の際に個別に説明します(・∀・)。
セキュリティーアップデートなんかは apt update && apt upgrade で行けると思います(・∀・)。
どんな仕様になるのん?
ユーザーアカウントとURL
ユーザーはメールアドレスを登録してメールアドレスとパスワードでログインするという、何とも面白くない仕様にします(・∀・)。
ユーザー登録の際にユーザーIDを決めて、そのIDが Linux ユーザー になります(・∀・)。
ホームページへのアクセスはサブドメイン形式で公開されます(・∀・)。 例えば mao というユーザーIDなら
https://mao.rentaserve.com
にてユーザーの公開したいホームページへアクセスできる仕様にします(・∀・)。
後述するメールアドレスのルールとドメイン名を一致させるため
メールアドレスとFTP
メールアドレスは「好きなユーザー名@ユーザーID.rentaserve.com」の命名ルールで、自由に作成できるようにします(・∀・)。 例えば mao というユーザーIDなら
xxxx@mao.rentaserve.com
メールアドレスに対するパスワードも個別に設定します(・∀・)。
これならエンドユーザーがどんな名前をつけても、エンドユーザーの割り当てられてるユーザーID(例:mao)が違うので全体として重複することはありませんね(・∀・)。
またFTPユーザーもメールアドレスでログインします(・∀・)。 パスワードはメールアドレスと同じ仕様にします(・∀・)。
つまり、メールアドレスを発行するとそのメールアドレスでFTPにアクセスできるようになる訳です(・∀・)。 (メールのみアクセス可能、FTPのみアクセス可能、どっちもアクセス可能にも出来るようにします)
FTPユーザーを複数作りたいがアカウント毎で重複チェックが大変なためですこのような仕様にしました(・∀・)。
また、FTPへのアクセスは、全てユーザーが各々用意したFTPクライアントアプリに任せることにして、ウェブ上からファイルアップロード機能などは提供しない方針とします(・∀・)。
ウェブから出来てしまうとセキュリティーを担保するのが大変そうなため
mariaDB
普通に mariaDB を使用します(・∀・)。
ディスク容量
とりあえず、アカウントあたり1GBに制限します(・∀・)。 ConoHa 上で運用するため、あんまり大きな容量を与えるのは厳しいためです(・∀・)。
この容量にはウェブページに公開するデータ以外にも
- アクセスログ
- 各メールデータ
- データベース の全てを含めます(・∀・)。
ユーザーに割り当てるディスク領域をとにかく制限したい(・∀・)w
PHP
ナウでヤングな 8.1 を採用します(・∀・)。 採用する理由は、単純に管理システム部分を Laravel 9 で構築したいため、Laravel 9 での推奨バージョンの PHP を使用したいためです(・∀・)。
セキュリティー担保のため、Apache モジュールではなく php-fpm を使用して、アカウント毎 Linux ユーザー権限で動作させます (・∀・)。
これによりファイル所有者にのみ書き込み権限を与えることが可能になり、重要なデータにグループやその他に読み込み権限を与えなくても PHP からアクセス可能になります(・∀・)。
更に、いくつかのセキュリティー的に不適切な関数を使用不能にしておきます(・∀・)。 更に更に、ユーザー毎に個別のxdebug設定を可能にします (・∀・)。
最後に
さて、ここまで機能を付ければちょっと楽しくありませんか(・∀・)?w 参考にした他のレンタルサーバーではあまりやっていない設定や仕様も入れているので、普通と言っておきながら若干ヘンテコな仕様になりました(・∀・)。
でもまあ、エンドユーザーから見れば他と大差ない仕様だと思っています(・∀・)。
次回からは実際にレンタルサーバーの構築やサービスページと管理ページの実装を始めていきたいと思います(・∀・)。