Raspberry Pi (Raspbian)上にNginxを使ったWordPressサーバーを構築する
Raspberry Pi 4を自宅サーバーにしようとしている人多いのではないでしょうか。僕もサーバーをCentOS 8にアップデートしている際、このサイトをRaspberry Pi 4で運用していました。
今回、CentOS 8上にApacheよりも速度に有利なNginxとphp-fpmを利用してWordpressサーバーを立てたので、手順を残しておきます。 CentOS 8.1 1911をMinima...
基本的にはここと同じなのですが、インストールするパッケージ名やユーザー名、必要な設定などが微妙に違うので、別記事に残しておきます。
ちなみに、こちらではRaspbian Busterを使用しています。違うバージョンのRaspbian Stretchなどでは設定が異なるのでご注意ください。
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を動かすのに必要な設定のみを行なっただけで、このままだとページの表示速度は全然よくありません。
調整記事は別途上げるので、完成するまで少しお待ちください。
コメント
-
-
早速のコメントありがとうございます。
WordPressをインストールする時点で気付いているべきでした。
クライアントPC(Windows10)のhostsは、書換えていたので、https://example.com/wp-admin/install.php でインストール画面にならなかった時点で、hostsが正しく機能してないことに気付くべきでした。
”hostsの設定が反映されないされない場合のチェック事項”などの記事に従ってチェックしましたが、不良個所が見つからず、困っていたのですが、コメントしていただいたように、
自宅LAN内でのみ働くDNSサーバーを立てることが良いことが分かり、dnsmasqをWordPressと同じRaspberryPiに導入して、問題を解決しました。
もちろん、WordPressの一般設定のサイトアドレスは、https://example.com/にしています。
参考にした記事は、
raspberry pi : DNSサーバーを立てる – 覚え書き
https://qazsedcftf.blogspot.com/2019/12/raspberry-pi-dns.html です。
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オフにしてのスマホ表示 の両方にキッチリ表示させる方法は、何かないでしょうか?