CentOS 8でNginxを使ったWordPressサーバーを構築する
今回、CentOS 8上にApacheよりも速度に有利なNginxとphp-fpmを利用してWordpressサーバーを立てたので、手順を残しておきます。
CentOS 8.1 1911をMinimalインストールして、SELinuxを有効化したままのサーバーで動作確認を行っています。CentOS 7などバージョンやディストリビューションが違うと、初期設定やパスが違ってそのまま参考には出来ないので注意してください。SELinuxを無効化しているならSELinuxの部分は飛ばしてもらって構いません。スーバーユーザーで実行が必要なコマンドはsudoをつけてますが、ほとんどがそうなのでrootユーザーで作業した方がいいと思います。
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オススメ設定は現在執筆中ですので、完成したら更新します。なので、更新あるまで少しお待ちください。
コメント