Ideal Reality

興味の赴くままに

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

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

CentOS 8.1 1911をMinimalインストールして、SELinuxを有効化したままのサーバーで動作確認を行っています。CentOS 7などバージョンやディストリビューションが違うと、初期設定やパスが違ってそのまま参考には出来ないので注意してください。SELinuxを無効化しているならSELinuxの部分は飛ばしてもらって構いません。スーバーユーザーで実行が必要なコマンドはsudoをつけてますが、ほとんどがそうなのでrootユーザーで作業した方がいいと思います。

Contents
スポンサーリンク

Nginx

インストール・設定

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

sudo dnf install nginx
sudo systemctl start nginx
sudo systemctl enable nginx

あと、CentOS標準だとfirewalldが有効化されているので、Webアクセスを許可します

sudo firewall-cmd --add-service=http --zone=public --permanent
sudo firewall-cmd --add-service=https --zone=public --permanent
sudo firewall-cmd --reload

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

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

sudo vi /etc/nginx/nginx.conf

/etc/nginx/nginx.confをスーパーユーザーのエディタで開き、以下の範囲の行頭に#をつけてコメントアウトします

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
#    server {
#        listen       80 default_server;
#        listen       [::]:80 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

編集ができたら保存してエディタを終了してください。

Let's Encryptの設定

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

certbotのインストール

TLSの証明書の取得にはcertbotを利用するので、こちらをインストールします。epelにパッケージがあるので、epelを有効化してからインストールします。

sudo dnf install epel-release
sudo dnf install certbot

Nginxの設定

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

sudo mkdir /var/www/certbot

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

sudo vi /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というフォルダ内に認証鍵がダウンロードされます。

自動更新

CentOS標準レポジトリからcertbotをインストールしたならば自動更新用のsystemd.timerが用意されているので、そいつを有効化します。

sudo systemctl enable --now certbot-renew.timer

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

vi /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 dnf install php php-fpm php-mysqlnd php-json php-mbstring php-gd

ユーザーの変更

標準設定だとapacheユーザーで実行されるので、nginxに変更します。

sudo vi /etc/php-fpm.d/www.conf

/etc/php-fpm.d/www.confをスーパーユーザーのテキストエディタで開き、

user = apache
group = apache

ここの部分を

user = nginx
group = nginx

このように変更。あと、NginxがPHPを実行する際にUNIXソケットを使うのですが、そのパーミッションも設定します。

;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

この部分を

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

このように変更してください。

以上編集が終わったら保存してエディタを終了します。また、このままだとセッションを保存しておくディレクトリ のパーミッションがapacheとなっており、ユーザーのログインなどが出来なくなってしまうので、

sudo chown -R nginx:nginx /var/lib/php/session

nginxに変更しておきます。これが終わったら以下のコマンドでphp-fpmを再起動してください。

sudo systemctl restart php-fpm
スポンサーリンク

MariaDB

インストール・起動

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

sudo dnf install mariadb 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という名前で作ります。

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 nginx:nginx /var/www/wordpress

Wordpressをダウンロードし/var/www/wordpressに展開、所有権をnginxに設定します。CentOSをMinimalインストールした状態だとtarが入ってないので、dnfでインストールしてくださいね。

Nginxの設定

sudo vi /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-fpm/www.sock;
	}
}

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

sudo systemctl restart nginx

SELinuxの設定

SELinuxが有効化された状態だとPHPによるファイルの書き込みとインターネットアクセスが制限されるので、テーマやプラグイン、アップデートのインストールができません。なので、これらを許可してやる必要があります。

sudo setsebool -P httpd_can_network_connect 1
sudo chcon -R -h -t httpd_sys_script_rw_t /var/www/wordpress

インストール

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

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

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

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

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

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

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

スポンサーリンク

調整

以上でインストール完了ですが、現状ではWordpressを動かすのに必要最低限の設定しか行っていないので、ページの表示速度は全然よくありません。

Wordpressを高速に動作させるためのNginxオススメ設定は現在執筆中ですので、完成したら更新します。なので、更新あるまで少しお待ちください。

スポンサーリンク

コメント

投稿されたコメントはありません

名前

メールアドレス(任意)

コメント

関連する投稿

SELinux環境でのEWWW Image Optimizer

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

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

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

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