白い平屋の暮らし

白い平屋を建てて断熱気密リカバリーとキャンプとDIYしてます。後悔ポイントは1つもないですが改善ポイントはたくさんあります。

Synology NAS 上で WordPress を構築しサーバー費用無しで独自ドメインのブログを公開する

概要

  • 少し前に念願の Synology NAS を購入しました。
  • この NAS は多機能で、いろいろなソフトウェアがパッケージとして組み込まれており気軽に導入できます。
  • WordPress と関連する必要なソフトウェアも標準で用意されており、この NAS 上に WordPress 環境を構築できます。
  • 今回は独自ドメインを利用して、レンタルサーバー費用無しで NAS 上に WordPress 環境を構築したいと思います。

Synology NAS の好きなところ

  • 多くのパッケージが用意されており、NAS の機能以外にも無料で手軽に色々なことができる、これは凄い嬉しいです。
  • 例えば Synology NAS に内包されている Moments というアプリケーションで Google Photo と同じように写真・動画の管理が可能です。
  • PC, スマホ, タブレット等マルチデバイスに対応しています。
  • 家族間で写真・動画の共有が可能です。

  • YouTube Music から Synology の Audio Station というアプリケーションに音楽を移行して、月額費用を無くしつつ出先で音楽を聴くことができます。
    • iTunes Server というアプリケーションもあり、こちらで iTunes の曲を管理することも可能です。
  • メーラー、メモ帳、コード管理 (GitLab) 等他にも多くのアプリケーションがあります。

Synology NAS で自分のサイトを運用するメリット

  • 何と言ってもサーバー費用が (電気代以外は) 掛からないこと、これに尽きるのではないでしょうか。
    • 独自ドメインの場合はもちろんドメイン代金は掛かります。
    • Synology のドメインを無料で利用することも可能です。
  • 自分で構築したサイトのため、愛着が沸きます。
    • モチベーション維持に繋がります:)
  • Synology NAS 内でパッケージとして管理できるため、メンテナンスコストがほぼ無い。
    • たまにバージョンアップのために1クリックするくらいでしょうか。。?

環境

構築した環境は以下の通りです。

  • Synology NAS DS918+
  • 仮想ホスト (Web Station)
    • Nginx
    • PHP7.3
  • MariaDB10

作業手順

以下に Synology NAS 上に WordPress を構築し、独自ドメインでアクセスするまでの手順を記述します (2021/06 検証)。

NAS private IP の固定

自宅のルーター管理画面へログインし、再起動した際などに NAS の IP が DHCP で動的に振られないように固定 IP を指定します。

出来れば DHCP アドレス範囲外が望ましいです。

ASUS ルーター管理画面

Control Panel > Network > Network Interface で DHCP の自動割り当て設定を手動に変更し、固定 IP にします。

Network Interface: LAN1

Network Interface: Use manual configuration

ルーター側で、ポートフォワーディングの設定を行います。

Asus WAN ポートフォワーディング

ポートフォワードで外からの(特定ポートへの)アクセスを許可するということは、世界中からのアクセスを許可するということです。つまりは許可した瞬間から攻撃者の標的になる可能性があるので念のためにもセキュリティは強固にしておくべきです。私はルーター自体にセキュリティ製品が組み込まれているものを使用し、攻撃があった場合にメール通知されるようにしています。

攻撃を受けた場合にメール通知する

DNS の設定

MyDNS.jp にてアカウントを作成し、メニューの "Domain Info" をクリックします。

MyDNS Domain Info

"Domain" にドメイン名、"Hostname" にワイルドカード (*) を入力し、MyDNS.JP にドメインを登録します。

MyDNS Domain Info

続いて NAS > Control Panel > External Access > DDNS > Customize にて次の情報を入力します。

  • サービスプロバイダ: MyDNS.jp
  • Query URL: http://www.mydns.jp/directip.html?MID=USERNAME&PWD=PASSWORD&IPV4ADDR=MYIP

DDNSモーダル

Add ボタンをクリックして MyDNS.JP のサービスプロバイダーを登録します。

DDNSモーダル

ステータスが Normal となり、 ping <Hostname> で応答が返ることを確認します。ブラウザからアクセスすると、HTTP プロトコルでアクセスできるはずです。

ブラウザからアクセスした場合の表示

SSL 通信設定

SSL 通信となるよう設定します。 Control Panel > Security > Certificate にて Add ボタンをクリックします。

Create Certificate モーダル

"Add a new certificate" を選択します。

Create Certificate モーダル

私は "Let's Encrypt" を選択しました。

blog.xxx.com のようにサブドメインを利用する場合は、 "Domain name" は xxx.com、 "Subject Alternative Name" は blog.xxx.com にして下さい。

Create Certificate: ドメイン名とemailの入力

ドメイン名とEmailを入力して "Apply" をクリックします。

有効な Certificate の表示

エラー無く Certificate が作成されたことを確認します。

https:// でアクセスし証明書が有効なことを確認

WordPress のインストール

こちらは "Synology wordpress インストール" 等で調べるとやり方が幾つか出てくるため、そちらを参考になさってください。

仮想ホスト設定

デフォルトだと WordPress をインストールしただけでは "http://192.168.xx.xx/wordpress/" のように LAN -> DSM -> WordPress へのアクセスとなり外から見えません。

仮想ホストを作成し、独自ドメインでアクセスされた場合は File Station の web/wordpress 配下へフォワードするように設定します。

"Web Station > Virtual Host" にて Create ボタンをクリックし、以下のように仮想ホストを作成します。

仮想ホスト作成モーダル

続いて、 "Control Panel > Security > Certificate" の先ほど作成した証明書を編集します。

Services に仮想ホストで作成したホストが新しく追加されているため、証明書を設定します。

ドメインに対象の証明書を設定する

WordPress > メニュー > 設定 > 一般 のサイトアドレスを独自ドメインに変更します。

入力フォームがグレーアウトされている場合は File Station > web > wordpress > wp-config.php をダウンロードして以下の記述をコメントアウト、または削除してアップロードし直してください。

define('WP_SITEURL', $pageURL.$alias);
define('WP_HOME', $pageURL.$alias);
↓
#define('WP_SITEURL', $pageURL.$alias);
#define('WP_HOME', $pageURL.$alias);</code></pre>

トラブルシューティング

DB に接続出来ず Fatal Error が発生する

恐らく WordPress のバグかと思われますが、WordPress のパッケージを入れて初期設定を行い、サイトを見に行った (だけで) 際に次のエラーに遭遇しました。

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /volume1/web/wordpress/wp-includes/wp-db.php:1667 Stack trace: #0 /volume1/web/wordpress/wp-includes/wp-db.php(632): wpdb->db_connect() #1 /volume1/web/wordpress/wp-includes/load.php(482): wpdb->__construct('xxx', 'xxx*…', 'xxx', 'localhost') #2 /volume1/web/wordpress/wp-settings.php(124): require_wp_db() #3 /volume1/web/wordpress/wp-config.php(110): require_once('/volume1/web/wo…') #4 /volume1/web/wordpress/wp-load.php(37): require_once('/volume1/web/wo…') #5 /volume1/web/wordpress/wp-blog-header.php(13): require_once('/volume1/web/wo…') #6 /volume1/web/wordpress/index.php(17): require('/volume1/web/wo…') #7 {main} thrown in /volume1/web/wordpress/wp-includes/wp-db.php on line 1667
There has been a critical error on your website.

環境は上述の通りですが、PHP7.0-7.4 全てで発生しました。

mysql_connect() で DB へ接続した際に Fatal Error が発生しており、これは wp-config.php にて以下の行を変更し、暫定対応として直しました。

<pre class="wp-block-code"><code>define( 'DB_HOST', 'localhost' );
↓
define( 'DB_HOST', 'localhost:/run/mysqld/mysqld10.sock' );</code></pre>

記事を新規作成・更新できない、記事が404になる

パーマリンクを設定してある状態で記事を新規作成・更新しようとすると 更新に失敗しました。 返答が正しい json レスポンスではありません。 とエラーが出力され、サイト上の記事を表示すると記事が存在しない 404 ステータスが返ってくる事象に見舞われました。

暫定対応としてパーマリンク設定を初期に戻し復旧しました。独自ドメインへ設定を移行する過程でどこかに旧設定が残っているのかもしれません。

余談

独自ドメインを取得して Synology で WordPress を入れてサイトを公開するまで、ちょっと躓きつつも5時間くらいで終わりました。