VPSでWEBサーバー

VPS とは?

VPSというのは、virtual private server の頭文字をとったものです。
日本語だと 仮想専用サーバという事になります。
ここでは、インターネット上の業者が自分の大きなサーバー内に、プログラムで別のコンピュータを複数、再現し、その一つを使用料をとって使わせているものを指します。
借りる側からすると、ネット上に公開されたサーバーで自由にプログラムを選んで使えるため、自分のWEBサイトを公開する場所としては自由度が高いのですが、デメリットとして、サーバー側はなにもしてくれないので、全て自分で設定する技術力が必要です。
最低でも、LAN内にサーバーを立ち上げる事が出来るだけの技量を要求されます。
今回は、当サイトの立ち上げについて記述していきます。

VPSを借りる。

いろいろな会社が、専用サーバーのサービスを展開しています。さくらのVPS カゴヤ・ジャパン GMOクラウド など、いくつか候補がありますから、月額使用料や、サーバーの容量、使用したいOSなどを比較して、サイトを選んでください。
特に決まりがあるわけではないですが、WEBサーバーとして見て頂くページを作るには、LAMPサーバーとして構築するのが一般的です。
LAMPは、 OSがLinux、WebサーバーとしてApache、データベースとしてMySQLかmariadb、その他、動的な動作をさせるためにPerl、PHP、Pythonをといったプログラム言語が動作するサーバー構成の事です。
このため、Linux が選択できるとベストですが、上記のVPSサービスはすべて、Linuxを持っているので大丈夫です。

今回は、さくらのVPSでやってみましょう。さくらインターネットの会員登録をし、サーバーを追加します。

さくらVPS新規サーバー追加

サーバーが置かれている場所と、容量やメモリ量から彫金設定されています。お好みのものを選びましょう。

さくらVPSサーバー新規追加

OSの選択と、rootのパスワードを聞かれます。今回は、Centos7にしました。あとは支払いの為のクレジットカードなどの情報を入力すれば大丈夫です。

さくらVPS契約画面

申し込んでしばらくは、上記の申込み中になります。少し時間がかかるところが多く、今回の例では1時間ほど待ちました。ですので時間のあるときに契約とサーバー選択をしておくとよいと思います。

コンソールを立ち上げる

さくらVPS契約画面

サーバーができあがったのを確認したら、起動ボタンを押して起動します。ここでは隠してありますが、この時点でIP決まっているため、

コンソール画面
コンソール画面

Tera Termで指定のIPアドレスを入力するだけで、rootでログインできてしまいます。
一応、設定時のパスワードとはいえ、それを破られてrootでログインされてしまうと、サーバーの中身は全て操作できてしまうため情報はダダ漏れになってしまいますし、最悪、犯罪に使われたりします。
まず、なにはともあれ、サーバーの安全性の確保が最優先です。
そのためには、まずあらゆる事が可能な万能ユーザーのrootではサーバーにログイン出来なくすること。
それと、サーバーはインターネット上にあるので、自分のパソコンとの通信も誰かに見られているかもしれませんから、通信をすべて暗号化してしまうこと。
この二点は何より最優先にする作業になります。

まず、rootログインを禁止するため、ユーザーを一つ作成し、ログインはそのユーザーで行うようにします。
root権限が必要な作業は、そのユーザーからrootチェンジする事で実施しましょう。

# adduser user01
# passwd user01
Changing password for user user01.
New password:
Retype new password:

ユーザーを作成したら、通信を暗号化するためのTera TermでSSHキーを作ります。

SSH鍵作成
SSH鍵作成

生成ボタンを押し、先ほど作成したユーザーのパスワードを鍵のパスフレーズとして入力します。
公開鍵と秘密鍵を、パソコンのどこかに保存してください。特に秘密鍵は重要で、無くしてしまうとログイン出来なくなるのでご注意ください。
作成できたら、公開鍵を作成したユーザーにセットアップします。

# su - user01
$ cd $HOME  ← ユーザーのホームディレクトリに移動。
$ mkdir -p ~/.ssh ← 公開鍵格納ディレクトリ作成
$ chmod 700 ~/.ssh ← 公開鍵格納ディレクトリのパーミッションを変更
$ vi ~/.ssh/authorized_keys ← authorized_keysというファイルを作成し、編集
SSHキー貼り付け

先ほど保存した「公開鍵」をパソコンのエディタで開き、全てコピーします。
ターミナル上では、authorized_keys が編集状態 になっていますので、iキーを押して挿入状態にし、コピーしたキーを貼り付けします。
viエディタの保存は、:x!を順番に打つと保存されますので、保存します。
(なにか間違った時は、:q!を順番に打つと、保存しないで終了するので破棄できます)
保存したら、 authorized_keys はパーミッションの変更が必要なので、変更します。

$ chmod 600 ~/.ssh/authorized_keys ← authorized_keysのパーミッションを変更

Tera Termのファイル→新しい接続で別のターミナルを開け、サーバーIPで接続します。

ユーザー名は、先ほど作成したユーザー、パスワードは設定パスワード、秘密鍵に、先ほど自分のパソコンの何処かに保存した秘密鍵を指定します。
これで接続ができれば、鍵認証でのログインが出来ると証明されましたので、今後のログインは鍵認証に限定し、パスワードだけではサーバーにログイン出来ないようにします。
ついでにrootでもログインできなくします。

# vi /etc/ssh/sshd_config ← SSHサーバー設定ファイル編集

#PasswordAuthentication yes
↓
PasswordAuthentication no ← パスワード認証無効化

#PermitRootLogin yes
↓
PermitRootLogin no ← rootログイン無効化

:q!で保存
# systemctl restart sshd  ← SSHを再起動して設定を読み込ませる。

これで、鍵認証でないとログインできなくなりましたので、作成したユーザーでのログインも必ずSSHキーが必要になります。ログインする自宅PCや、ノートPCなど、機器を限定してSSHキーをコピーしておけば、万一、パスワードが漏れたとしても、すぐにログインされる事は無いでしょう。
また、rootで直接ログインも出来ないので、必ずユーザーでログインしてから、suコマンドでrootになって作業を行います。
では、通信が暗号化出来たので、rootのパスワードを変更します。

# passwd
Changing password for user root.
New password:[英大文字、英小文字、数字、記号を含む複雑なパスワード]
Retype new password:[上と同じパスワードをもう一度]

次にサーバーを初期設定します。
まず、サーバーを最新の状態に更新します。
この更新は定期的に行った方が良いですが、いちいち人間がやるのは面倒です。
ついでに定期実行を設定します

# yum -y update で最新に更新
# yum -y install yum-cron ← yum-cronインストール
# apply_updates = yes ← ダウンロード&アップデートを自動で行うようにする
# systemctl start yum-cron ← パッケージ自動更新起動
# systemctl enable yum-cron ← パッケージ自動更新自動起動設定

VPSはOSがインストールされただけの状態で提供されているので、必要なものをインストールしておきます。

# yum -y groupinstall base "Development tools" ← ベース、開発ツールパッケージ群インストール
# yum install  ← 日本語化パッケージインストール

セキュリティ項目も確認します。
これはさくらVPSの状態なので、別のVPSだと状態が違うかもしれません。

# getenforce ← SELinux状態確認
# Disabled ← SELinux無効

# firewall-cmd --state ←  firewalld状態確認
# running ← firewalld実行中

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh

さくらの初期では、SELinuxは無効で、firewalldは有効になっており、上記のようにsshが開いています。
この状態では、sshしかこのサーバーに接触するポートが無く、そのsshは暗号キーが必要にしましたので、セキュリティ的には高いと思います。
それでは、必要なサーバープログラムをインストールしていきます。

WEBサーバープログラムをインストール

WordPressを実行するには、当然、WEBサーバーが必要ですので、インストールします。
WEBサーバーとしては、Linux系のサーバーとしては最も一般的なApacheを使用します。
早速インストールしましょう。

# yum -y install httpd

インストールが完了したら、設定をします。

# vi /etc/httpd/conf/httpd.conf

ServerName [ipアドレス]:80 ← サーバー名を指定

    Options Indexes FollowSymLinks
  ↓
    Options Includes ExecCGI FollowSymLinks ← CGI,SSIの許可

    AllowOverride None
  ↓
    AllowOverride All ← .htaccessの許可


#AddHandler cgi-script .cgi
↓
AddHandler cgi-script .cgi .pl ← CGIスクリプトに.plを追加

以下を最終行に追加
TraceEnable off ← Traceメソッドを無効化(クロスサイトトレーシング対策)

設定が完了したら、Apacheを起動します。

# systemctl start httpd ← Apacheの起動
# systemctl enable httpd ← サーバー起動時にApacheを自動起動
# httpd -v
Server version: Apache/2.4.6 (CentOS)

バージョンを確認するコマンドの httpd -v に反応しますから、Apacheは正常に起動しています。 http://[IPアドレス] で開いてみましょう。

エラーがでますね。
これは、当然といえば、当然なのですが、先ほどのfirewalldで、sshのみが許可されているため、httpの接続がブロックされてしまうからです。
では、http接続を許可しましょう。

# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh http https

先ほどはdhcpv6-client と、ssh だけでしたが、http と、https が新たに加わっています。
ここでもう一度、 http://[IPアドレス] へ接続してみると

これは、サーバー上に表示するHTTPがない為、ウェルカムページが表示されています。つまり、WEBサーバーとしての設定が成功したという事になります。
念のため、普通の場合真っ先に表示される index.html ファイルを作成してみましょう。

# vi /var/www/html/index.html ← テストページ作成
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test-page</title>
</head>
<body>
test-page
</body>
</html>

viエディタでindex.htmlを新規作成し、保存してもう一度 http://[IPアドレス] を再読込してみると

ちゃんと内容が表示されているので、WEBサーバーはこれでOKです。

PHPをインストール

WordPressは、PHPで動作するので、PHPをインストールします。
このWordPressを構築した時点だと最新のPHPは7.3になるのですが、訳あって7.2を選択しました。

# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum -y install --enablerepo=remi,remi-php72 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql
# php -v
PHP 7.2.14
#systemctl restart httpd

インストールが終わって、最後の行はWEBサーバーの再起動コマンドです。
これで、WEBサーバーからPHPが使用できるようになたはずなので、確認します。

# vi /var/www/html/test.php ← PHPテスト用ページ作成
<?php
  phpinfo();
?>

viエディタでphpプログラムが動作する簡単なファイルを作成し、
http://[IPアドレス] /test.php で呼び出します。

PHP が正常にインストールされたことが確認できました。

データベースサーバーのインストール

WordPressには、データベースが必要なので、インストールします。
Linuxのデータベースサーバーとしては、MySQLが有名でしたが、現在は、その派生にあたるMariaDBが Centos7の標準データベースサーバーになっていますので、こちらを選択しました。

# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
# yum install MariaDB-server MariaDB-client

インストールが完了したら、起動します。

# systemctl start  ← mariadbを起動
# systemctl enable mariadb ← サーバー起動時にmariadbを自動起動

MySQL系なので、初めて使用するときは初期設定が必要です。

# mysql_secure_installation

rootユーザーのパスワードを決めるほかは、デフォルトのままでOKです。
初期設定が完了したら、データベースの起動を確認してみます。

# mysql -u root -p
Enter password:  ← 初期設定で決定したパスワード
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5101
Server version: 10.3.12-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

コマンドでは大丈夫なようなのです。
ただ、この後、ユーザーの作成やデータベースの追加など、色々な管理をする必要があり、それをすべて、上のようにコマンドで行うのは大変です。
このため、データベースのメンテナンス用に、phpMyAdminをインストールします。

# yum --enablerepo=remi -y install php72-php-mysql
# yum --enablerepo=remi -y install php72-php-mcrypt
# yum --enablerepo=remi-php72 update
# yum --enablerepo=remi-php72 install phpmyadmin

# vi /etc/httpd/conf.d/phpMyAdmin.conf

#Alias /phpMyAdmin /usr/share/phpMyAdmin ← #挿入してコメントアウト
#Alias /phpmyadmin /usr/share/phpMyAdmin ← #挿入してコメントアウト
Alias /hogehoge /usr/share/phpMyAdmin

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
       Require all granted ← 追加
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from All ← 追加
     Allow from ::1
   </IfModule>
</Directory>

# systemctl restart httpd

設定ファイルを保存し、WEBサーバーを再起動すれば、phpMyAdminは、http://[ip]/hogehoge/ で接続できます。

設定ファイルの変更した内容について解説すると、まず前提として、データベースを全操作できてしまう phpMyAdmin のログインページは、防御がパスワードのみとなってしまうため、設置した当人以外の人に見られるのは好ましくありません。
このため、初期状態ではRequire ip 127.0.0.1 により、ローカルホスト、つまりサーバー自身からしかリクエストを受け付けないことになっています。
サーバーを管理するなら、直接サーバーをいじれって事ですね。
しかし、このサーバーはVPSですから、設置した当人がインターネット越しに繋いだ接続も、全て外部接続という事になり、このままでは設置した人すら
phpMyAdmin を使う事ができません。
それでは自分もメンテナンスに困るので、接続できるIPを指定する必要がありますが、絶対にIPの判っている場所からしか接続しないのであればともかく、
外出先から急にメンテをしなくてはならなくなったときなどは、IPが違うという事で弾かれたのでは困ります。
つまり、どんなIPからの接続も、許可しておかないと困る事になります。
しかし、それではちょっと知識がある人なら、http://[ip]/phpmyadmin/をリクエストすれば、このページが出てくると判っていますから、万一パスワードを抜かれたりしたら大事になってしまいます。
そこでAlias /phpmyadmin をコメントアウトし、Alias /hogehogeを設定しておきます。
すると、図のようにhttp://[ip]/hogehoge/ でphpMyAdminが起動します。一方、コメントアウトしたので、http://[ip]/phpmyadmin/ では起動しません。

このAlias /hogehoge の部分を、無意味な英数の文字列にしておけば、相当時間をかけてアタックしないと、phpMyAdminに辿り着けないでしょう。
phpMyAdminは非常に便利なので是非欲しいですが、ログインページは必ず隠蔽するようにしましょう。

WordPressをインストールする際聞かれる、データベースのユーザーを作成します。
また、WordPressが使用するデータベースも作成しておきます。

WordPressをインストール

それでは、WordPressをインストールしましょう。まず、WEBサーバーが、
http://[ip]/
と、なにも付けない状態のリクエストを受けたとき、表示するファイルが置かれる場所をルートフォルダといいます。
今回は、Apacheをほぼ標準でインストールしているので、
/var/www/html/
がルートになります。
ここに、cdコマンドで移動し、wgetで、WordPressの圧縮ファイルを取得します。

# cd /var/www/html/
# wget https://ja.wordpress.org/latest-ja.tar.gz
# ls
latest-ja.tar.gz

ファイルのダウンロードを確認したら、圧縮ファイルを展開します。

# tar -xzvf latest-ja.tar.gz

展開すると、wordpress というディレクトリが作られ、ここにシステムが展開しています。
ディレクトリの所有者と、実行権を修正します。

# chown -R apache:apache wordpress
# chmod -R 755 wordpress

これで、 http://[ip]/wordpress/ でWordPressが実行されます。

先ほどデータベースのところで決めたIDとpassを入力すれば、インストールは正常に進行します。途中、出現するログインアカウントとパスワードを必ずメモしておきます。

ダッシュボードに入れました。これで、WordPressのインストールは完了になります。

ドメインを設定

WordPressの機能としてはこれでOKですが、http://[ip]/wordpress をユーザーさんに伝えるのもおかしいですので、ドメインを取得します。
私の場合、既にこの yoshisyou.com をムームードメインにて取得していましたので、今回のさくらのVPSと、取得したドメインを連結します。

この辺りは、どこでドメインを購入するかによって違ってくるところですが、DNSのサービスをしているところに、購入したドメインは、取得したIPを指す事をデータとして投入すれば、http://[ドメイン] で繋がるようになります。
ただし、DNSというのは仕組み上、他にデータを行き渡らせる必要があり、長くかかるときは、1日以上かかる事があります。
また、自分の契約しているプロバイダは行き渡ったけれど、お客様の使用しているプロバイダには行き渡っていないという事もよくあるので、数日はかかると思って対処してください。

さて、これで http://[ドメイン] /wordpress でインストールしたWordPressに繋がるようになりますが、この /wordpress をいちいち付けないといけないのは、お客様にとっては面倒しょう。また、WordPressを導入する以上は、別にルートフォルダに、自分で書いたhtmlファイルを設置して、表示させる必要がある場合を除いてはWordPressで作成したコンテンツがそのサイトのメインになるはずです。
そこで、http://[ドメイン]  と何も付けない接続が来たら、自動で
http://[ドメイン] /wordpress  へ飛ばすよう設定します。

# cd /var/www/html/wordpress/

# cp .htaccess ../
# cp index.php ../

※.htaccess と index.php を、一つ上、つまり/var/www/html/ へコピー

# vi .htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress

# vi index.php
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
↓
require( dirname( __FILE__ ) . '/wordpress/wp-blog-header.php' );

これにより、https://yoshisyou.com とリクエストすると、DNSにより、さくらVPSのhttp://[IP]へ転送され、ルート上におかれている .htaccess と index.phpにより、 http://[IP] /wordpressへ転送されるという仕組みにより、WordPressサイトが表示されます。

SSL化

このままでも一応の完成ではありますが、特に企業のサイトの場合は、これからAOSSL( Always on SSL(常時SSL))は必須でしょう。
サイト内のどのページをリクエストしたかや、どんな画像を読み込んだなど、サイト側とのやりとりが全て暗号化されるため、セキュリティが格段に向上します。
とはいえ、このSSLを実現するのに必要な「SSL証明書」が結構高額で、安いものでも年額で数万円します。
そんな中、無料のSSL証明書が存在しています。
Let’s Encryptというところで、ドメインを登録するだけで、SSL証明書が無償利用できます。

mod_sslをインストールします。
# yum install mod_ssl

# vi /etc/httpd/conf/httpd.conf
※一番下の行まで移動
NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin root@freepc.jp
DocumentRoot /var/www/html
ServerName freepc.jp
</VirtualHost>

を追記して保存

# systemctl restart httpd
WEBサーバー再起動

# yum install certbot python2-certbot-apache
# certbot --apache -d yoshisyou.com

# systemctl restart httpd
WEBサーバー再起動

この設定により、https://yoshisyou.com/
でサイトが表示されるようになります。

ただ、WordPress内部もSSL対応にする必要があります。これはWordPressのプラグイン 「Really Simple SSL」をインストールして有効化する事で実装します。

メールサーバーのインストール

WordPressは、インストールの際にメールアドレスを入力します。
このアドレスには、WordPressの更新情報などが送られてきますので重要です。
ところが、VPSはもともと、OSだけの状態なので、そのままではメールは送られません。
WordPressの内部では、インストール時のアドレスに「メール送って」と依頼を出すのですが、その依頼を受ける担当が居ない状態です。
そこで、メールサーバーをインストールします。

# yum -y install postfix

# vi /etc/postfix/main.cf
myhostname = mail.yoshisyou.com
mydomain = yoshisyou.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost
↓
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

smtpd_banner = $myhostname ESMTP unknown ← 追加(メールサーバーソフト名の隠蔽化)

mynetworks = 127.0.0.0/8

relay_domains = $mydestination

# 送受信メールサイズを10Mに制限
message_size_limit = 10485760

# メールボックスサイズを250MBに制限
mailbox_size_limit = 262144000
※普通は1GBくらいですが、何分メールを送るだけなので小さくしてあります。

postfixは、 MTA(Mail Transfer Agent) とも呼ばれ、実は、メールを「受け取る」作業もしています。
この場合、yoshisyou.com宛で誰かがメールを送ると、サーバー内の
postfix が受け取り、@より前のユーザー名を見て、それぞれのユーザーのメールボックスに転送します。
逆に、メールを出す依頼が来ると、@より後ろのドメインに接続し、メールを送る役割になっています。
ただ…WordPressのサイトを立ち上げるだけでしたら、WordPress自体がメールを送って欲しいとの要請があったときに応えられればOKなので、きちんとしたメールサーバーとして運用する必要がありません。
そのため、ポート(smtpの25番)を開ける事もしません。

これで、VPSサーバをレンタルし、必要なプログラムを導入して、WordPressのサイトとして立ち上げるまでの一連の流れが出来た事になります。

これからWEBサイトを公開してみたい企業様や、いま運用しているけれどいろいろ自由にできなくて困っているという企業様は、一度ご相談ください。