Ideal Reality

興味の赴くままに

Raspberry Pi (Raspbian)上にNginxを使ったWordPressサーバーを構築する

Raspberry Pi 4を自宅サーバーにしようとしている人多いのではないでしょうか。僕もサーバーをCentOS 8にアップデートしている際、このサイトをRaspberry Pi 4で運用していました。

CentOS 8でNginxを使ったWordPressサーバーを構築する

今回、CentOS 8上にApacheよりも速度に有利なNginxとphp-fpmを利用してWordpressサーバーを立てたので、手順を残しておきます。 CentOS 8.1 1911をMinima...

基本的にはここと同じなのですが、インストールするパッケージ名やユーザー名、必要な設定などが微妙に違うので、別記事に残しておきます。

ちなみに、こちらではRaspbian Busterを使用しています。違うバージョンのRaspbian Stretchなどでは設定が異なるのでご注意ください。

Contents
スポンサーリンク

Nginx

インストール・設定

Nginxをインストールし、起動します。

sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx

インストール及び起動が成功していると、この状態でサーバーにブラウザから繋ぐとNginxのページが開かれます。

ただ、このページはWordpressを運用する上で必要ないので、Nginxへ接続できることを確認できたらオフにします。

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.confをスーパーユーザーのエディタで開き、include /etc/nginx/sites-enabled/*;の先頭に#を付けてコメントアウトしてください。編集が終わったら保存してエディタを終了してください。

#	include /etc/nginx/sites-enabled/*;

Let’s Encryptの設定

Let’s Encryptを使えば無料でWebサイトをTLS(SSL)に対応させることができます。対応させた方が絶対にいいので、Wordpressを入れる前に設定してしまいます。

certbotのインストール

TLSの証明書の取得にはcertbotを利用するので、こちらをインストールします。

sudo apt install certbot

Nginxの設定

certbotの認証にはWebサーバーが必要です。certbot自体Webサーバーとしての機能を持っているのですが、これを使うにはNginxを止める必要があります。また、Let’s Encryptの証明書の有効期限は90日なので定期的に更新が必要で、その都度Nginxを終了するのも不格好なので、今回は常に起動しているNginxをcertbotに利用させる形をとります。

sudo mkdir /var/www/certbot

certbot用のディレクトリを用意したら、

sudo nano /etc/nginx/conf.d/wordpress.conf

nginxフォルダのconf.d内にwordpress.confを生成する形でテキストエディタを開き、

server {
	listen 80;
	server_name _;
 
	location / {
		return 444;
	}
 
	location ^~/.well-known {
		alias /var/www/certbot/.well-known;
	}
}

以上の内容で保存したら

sudo systemctl restart nginx

Nginxを再起動してください。ちなみに、これは初めてcertbotで認証するための一時的な設定なので、あとで書き換えます。

認証

例えば、サーバーのドメインがexample.com、サーバー管理者のメールアドレスが[email protected]なら、

sudo certbot certonly --webroot --webroot-path /var/www/certbot --domain example.com --email [email protected] --non-interactive --agree-tos --no-eff-email

上記の例だと、/etc/letsencrypt/live/example.comというフォルダ内に認証鍵がダウンロードされます。

自動更新

certbotを利用すると、自動更新用のsystemd.timerが有効化されていると思うので、cronとか設定する必要なはい。

pi@raspberrypi:~ $ systemctl list-timers
NEXT                         LEFT         LAST                         PASSED       UNIT                         ACTIVATES
Thu 2020-04-02 12:50:16 JST  8h left      n/a                          n/a          certbot.timer                certbot.service

あと、証明書が更新された時にNginxがリロードだけされるように、/etc/letsencrypt/renewal-hooks/deploy以下にスクリプトを用意します。

nano /etc/letsencrypt/renewal-hooks/deploy/reload.sh

でエディタを開いたら

#!/bin/bash

systemctl reload nginx

の内容で保存してください。あとは

chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload.sh

で実行権限を与えてやればOKです。

PHP

PHP本体と、必要なモジュールをインストールするだけで大丈夫です。

sudo apt install php php-fpm php-mysql php-json php-mbstring php-gd

CentOSではnginxとphpのユーザーが違って合わせなければいけませんでしたが、Raspbianの場合、デフォルトで両方ともwww-dataという共通のユーザーに設定されているので、何もする必要ありません。

スポンサーリンク

MariaDB

インストール・起動

以下のコマンドでインストールと起動を行ってください。

sudo apt install mariadb-client mariadb-server
sudo systemctl start mariadb
sudo systemctl enable mariadb

rootユーザーパスワード設定

MariaDB(MySQL)ではユーザーを作成し、ユーザーごとにデータベースへのアクセス権限を設定できます。その中でもrootユーザーはすべてのデータベースにアクセスできる権限を持つのですが、初期状態ではrootユーザーにパスワードが設定されていないので設定します。

sudo mysql -u root

上のコマンドでMariaDBのrootユーザーにログインし、ターミナルの先頭がMariaDB [(none)]>に変わったら

update mysql.user set password=password('任意のroot用パスワード') where user = 'root';
flush privileges;
exit;

以上3つのコマンドを入力してください。もちろん任意のroot用パスワードは自分で決めたパスワードにしてください。

WordPress用のユーザー・データベースを作成

WordPressがデータを保存する場所と、Wordpressからデータベースにアクセスするためのユーザーを作成します。この記事ではデータベースをwp_databaseという名前で、ユーザーをwp_userという名前で作ります。

sudo mysql -u root -p

こちらのコマンドでMariaDBのrootユーザーにログインしたら、

create database wp_database;
grant all privileges on wp_database.* to wp_user@localhost identified by '任意のwp_user用のパスワード';
exit;

これらのコマンドでデータベースとユーザーを作成してください。こちらでも任意のwp_user用のパスワードは自分で決めたパスワードにするのですが、rootに設定したものとは別のものにすることをお勧めします。

WordPressのインストール

/var/www/wordpressにWordpressを配置します。

ダウンロード・展開

curl -O https://ja.wordpress.org/latest-ja.tar.gz
sudo tar -xzvf latest-ja.tar.gz -C /var/www
sudo chown -R www-data:www-data /var/www/wordpress

WordPressをダウンロードし/var/www/wordpressに展開、所有権をwww-dataに設定します。

Nginxの設定

sudo nano /etc/nginx/conf.d/wordpress.conf

/etc/nginx/conf.d/wordpress.confをエディタで開いて、以下の内容で書き換えてください。

server {
	listen 80;
	server_name _;
 
	location / {
		return 301 https://example.com$request_uri;
	}
 
	location ^~/.well-known {
		alias /var/www/certbot/.well-known;
	}
}
 
server {
	listen 443 ssl;
	server_name example.com;
 
	index index.php index.html;
	root /var/www/wordpress;
 
	ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
	ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
 
	location ~* /wp-config.php {
		deny all;
	}
	
	location / {
		try_files $uri $uri/ /index.php$is_args$args;	
	}
	
	location ~ \.php$ {
		include fastcgi.conf;
		fastcgi_pass   unix:/run/php/php7.3-fpm.sock;
	}
}

example.comとなっている場所はすべてご自身のドメインに置き換えてください。編集が終わったら以下のコマンドでNginxを再起動してください。

sudo systemctl restart nginx

インストール

ここまで来れば、あとはCentOSと同じです。

ブラウザからサーバーの/wp-admin/install.phpにアクセスしてください。例えば、ドメインがexample.comだとURLはhttps://example.com/wp-admin/install.phpになります。

次に進んで、データベースの設定の画面では以下のようにMariaDBで設定したデーターベース名・ユーザー名・パスワードを指定します。

この記事の通りにしているならばデータベース名はwp_database、ユーザー名はwp_user、パスワードはMariaDBのところで任意のwp_user用パスワードを置き換えたと思うので、そのパスワードを入れてください。

データベースの設定が合っていれば以上の画面になるので、「インストール実行」をしてください。

あとはサイトのタイトルと管理者のユーザーを作って「Wordpressをインストール」

成功したら「ログイン」を押すとログイン画面に移動するので、先ほど作った管理者用のユーザーでログインしてください。

これでインストール完了です。

スポンサーリンク

調整

こちらもCentOSの時と同じですが、Wordpressを動かすのに必要な設定のみを行なっただけで、このままだとページの表示速度は全然よくありません。

調整記事は別途上げるので、完成するまで少しお待ちください。

スポンサーリンク

コメント

  1. TAKOFUJI
    2020年8月6日 22時25分
    返信

    RaspberryPi 4B(4G)を入手し、何をしようか?と思っていた時、本記事を見つけ、早速追試してみました。
    実にわかりやすい文章で、一気にWordPressのインストールまで進めました。
    ただ、私のシステムとの関連だと思うのですが、うまくいかない(いかなかった)点が、2点あります。
    1.WordPress用のユーザー・データベースの作成
     MariaDBにログインするのに、
      mysql -u root -p …sudoが必要では?

    2.ブラウザでWordPressをインストール
     https://example.com/wp-admin/install.php  …ドメイン名では、インストール画面呼び出せず
     http://(サーバーlocal IPアドレス)/wp-admin/install.php で呼び出しました。
    そのため、WordPressアドレス、サイトアドレス共に、サーバーのlocalIPアドレスになっており、
    投稿・固定ページ共にパーマネントは、https://(サーバーlocal IPアドレス)/記事名 となります。
    LAN内で、WordPressで編集する時のサイトの表示は問題ないのですが、外部のネット空間からアクセスすると
    トップページはともかく、投稿・固定ページは表示できません。
    WordPressの設定で、サイトアドレスを、https://ドメイン名に変えると、外部空間からのアクセスはうまくいきますが、LAN内でWordPressを起動すると、サイト表示で表示しません。

    Webサーバーをdhcpcd.conf の中で、domain Server address = 192.168.0.1 としてるので、当然と言えば当然の話ですが、WordPressで編集中、サイト表示、WiFiオフにしてのスマホ表示 の両方にキッチリ表示させる方法は、何かないでしょうか?

     

    • アバター画像
      Hiroki Kawakami
      2020年8月9日 23時56分
      返信

      まず、1つ目の`mysql -u root -p`なのですが、sudoつけ忘れてたみたいですね。修正させていただきます。

      あと、2つ目についてはRaspberry Piに接続する際、外からだとグローバルIP、LAN内からだとプライベートIPアドレスが必要なのに対し、DNSサーバーが常にグローバルIPアドレスを返すために発生します。
      これに対処する方法は
      1. dnsmasqを利用してドメインでアクセスされた際にプライベートIPアドレスを返すLAN内専用のdnsサーバーを立てる
      2. クライアントPCのhostsファイルを編集し、特定のドメインにアクセスされた際はDNSサーバーへIPアドレスの問い合わせをせずに指定されたIPアドレスにアクセスさせる
      この2つが主ですかね。僕は1つ目の方法でWordpressと同じマシンにdnsmasqを入れて対処してます。これに関してはVPSやレンタルサーバーを使わず、自宅にWebサーバーを配置する人たちがみんな経験するトラブルだと思うので、要望があれば記事にします。

名前

メールアドレス(任意)

コメント

関連する投稿

[WordPress]メディアライブラリから画像を選べるカスタムフィールドを作成する

SlackでURLが展開されないのを修正する

SELinux環境でのEWWW Image Optimizer

CentOS 8でNginxを使ったWordPressサーバーを構築する

[WordPress]記事のもくじをJavascriptで生成する