ZFWordPress™

CentOS 7 + Nginx + php 7 + Let’s Encrypt WEBサーバの覚書

3852 views
It takes about 12 minute(s) to read this content.

CentOS 7.5

最近の CentOS(限らないが…)はインストールそのものは概ねオートマチックに完了、sshだけ通しておいて環境に合わせてファイアウォール等の設定を行う。webサーバとして構築するならSELinuxも有効にしたままでも問題ないようだし、大変簡単になってきましたね… 覚書くことがない感じです (笑)

ひとまずCentOSのインストールを完了させ、sudo yum update で更新をして、下記サービス・プログラムをインストールすれば立派なwebサーバが完成です。

  • NGiNX
  • PHP
  • MariaDB
  • WordPress
  • Let’s Encrypt

ポートは ssh・http・https これら3つのポートだけが開いている状態なら問題も発生しづらいのではないだろうか。

基本的にサーバOSには個人的カスタマイズはできる限り施さないようにしているのだけど、どうしても入れてしまうのがひとつある、bash のタブ補完拡張モジュールだ。ubuntu なんかはデフォルトで有効になってるのかな? これがないとどうしようもなく作業時間が伸びてしまうので、ココ最近CentOS を構築する場合は必ずインストールしている。

  • bash-completion
  • bash-completion-extras
  • vim
$ sudo yum install epel-release
$ sudo yum update
$ sudo yum install bash-completion bash-completion-extras vim

PHPメールなどでホスト名がFQDNでない場合、メールサーバに弾かれてしまうという現象があったのでホスト名にはFQDNを設定するようにした。

$ sudo hostnamectl set-hostname YOUR.SERVER.NAME

NGiNX

Install

下記の内容で nginx 用リポジトリファイルを作成する。

$ sudo vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
enabled=0
gpgcheck=1

ファイル作成の後、yum を使ったインストールを行う

$ sudo yum --enablerepo=nginx install nginx

Settings

nginx の設定ファイルはマルチドメインで使用するときに簡単なので sites-available・sites-enabled ディレクトリを使用した方法をとります。

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled
$ sudo vim /etc/nginx/nginx.conf

開いたファイル先頭行あたりの user の値をnginxに設定し、後部に
include /etc/nginx/sites-enabled/*; を追加、さらに WordPress で使用する予定なので
client_max_body_size 24M; も追加する。

<この行を編集(先頭あたり)>
    user  nginx;

<この二行を追加>
    include /etc/nginx/sites-enabled/*;
    client_max_body_size 24M;

ここまでで nginx を起動してブラウザからアクセスすれば、nginx からの反応が見られると思う。

<nginx 起動>
$ sudo systemctl start nginx

設定に問題があれば nginx のエラーが表示される、起動できれば下記コマンドで起動設定を行う。

<nginx 自動起動設定>
$ sudo systemctl enable nginx

nginx の設定ファイルは php 等の設定後作成します。

php 7.2

Install

Remi リポジトリを使って、php 7.2 をインストール

Remi リポジトリのインストール前に epel-releaseのインストールをしておく必要がある、Remi リポジトリをインストールし、php 7.2をインストール

$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum install --enablerepo=epel,remi-php72 php php-mbstring php-pear php-fpm php-mcrypt php-mysql

Settings

php-fpm の設定ファイルを開いて user・group 項目を探して、ともに値を nginx に設定し、php-fpm を再起動させる。

$ sudo vim /etc/php-fpm.d/www.conf
<下記項目を探して値を nginx に設定>
user = nginx
group = nginx
<php-fpm を再起動>
$ sudo systemctl restart php-fpm

MariaDB

Install

MySQL の代わりに MariaDB をインストール、こちらもリポジトリを追加し yum によるインストールを行う。

$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
$ sudo yum install MariaDB-server MariaDB-client

Settings

<MariaDBを起動、インストールのときとは綴が違うので… >
$ sudo systemctl start mariadb

<自動起動設定>
$ sudo systemctl enable mariadb

mysql コマンドで起動確認ができるので、ユーザ・パスワードをしっかりと設定する。

Let’s Encrypt

Install

こちらもepel-releaseが必要ではあるが、下記コマンドで Let’s Encrypt クライアント certbot のインストールは終了する。

$ sudo yum install certbot

Settings

nginx の設定ファイルをパスなどは各環境に合わせて作成し、httpでアクセスできる環境を構築する、下記は WordPress 用の設定が含まれているが、大きな問題はないと思う。ドキュメントルートに適当な index.php などを置いておき、sites-enabled ディレクトリに設定ファイルのシンボリックリンクを作成し nginx を再起動。

<WordPress 用のドキュメントルートディレクトリを作成>
$ sudo mkdir -p /var/www/html/wordpress
<index.php ファイルを作成しておく>
$ sudo vim /var/www/html/wordpress/index.php
$ sudo vim /etc/nginx/sites-available/YOUR.SERVER.NAME.config

server {
  listen 80;
  server_name YOUR.SERVER.NAME YOUR2.SERVER.NAME;
  charset utf-8;

  location / {
      root   /var/www/html/wordpress;
      index  index.php index.html index.htm;
      try_files $uri $uri/ /index.php?q=$uri&$args;
  }

  location ~ \.php$ {
    root           /var/www/html/wordpress;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include        fastcgi_params;
  }
}
<sites-enabled ディレクトリに設定ファイルのシンボリックリンクを作成>
$ sudo ln -s /etc/nginx/sites-available/YOUR.SERVER.NAME.config /etc/nginx/sites-enabled/
<nginx を再起動>
$ sudo systemctl restart nginx

上記でエラーが出た場合は設定ファイルを見直す、再起動が完了したらブラウザでアクセスしてみる、アクセスが成功したなら certbot を使って証明書の作成を行う。

$ sudo certbot certonly --webroot -w /var/www/html/wordpress -d YOUR.SERVER.NAME
<複数のサーバ名を使いたいときは繰返し実行しサーバ名ごとの証明書を作成する>
$ sudo certbot certonly --webroot -w /var/www/html/wordpress -d YOUR2.SERVER.NAME

certbot を初めて使用するときは、メールアドレスや利用規約への同意が必要。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/YOUR.SERVER.NAME/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/YOUR.SERVER.NAME/privkey.pem
   Your cert will expire on 2019-01-11. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

上記のような表示が出れば終了、証明書のフルパスを使って nginx の設定ファイルを編集し https に対応させる。

server {
    listen 80;
    server_name YOUR.SERVER.NAME YOUR2.SERVER.NAME;
    return 301 https://YOUR.SERVER.NAME$request_uri;
}

server {
    listen 443;
    server_name YOUR2.SERVER.NAME;
    ssl_certificate     /etc/letsencrypt/live/YOUR2.SERVER.NAME/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/YOUR2.SERVER.NAME/privkey.pem;
    return 301 https://YOUR.SERVER.NAME$request_uri;
}

server {
  listen       443 ssl http2;
#  listen       80;
  server_name YOUR.SERVER.NAME;
  charset utf-8;

  ssl_certificate     /etc/letsencrypt/live/YOUR.SERVER.NAME/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/YOUR.SERVER.NAME/privkey.pem;

  add_header Strict-Transport-Security 'max-age=31536000';

  location / {
      root   /var/www/html/wordpress;
      index  index.php index.html index.htm;
      try_files $uri $uri/ /index.php?q=$uri&$args;
  }

  location ~ \.php$ {
    root           /var/www/html/wordpress;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include        fastcgi_params;
  }
}

上記設定で2つ目の server コンテキストはサーバが単一のドメイン用にセットアップされていれば必要ないようだが、https://YOUR2.SERVER.NAME でアクセスがかかったときに安全でない接続と表示されてしまう。

$ sudo systemctl restart nginx

これらの設定で、HTTP/2 でのアクセスも可能な状態になる。

/etc/sysconfig/certbot ファイルを編集し証明書更新後に nginx を再起動する設定。

sudo vim /etc/sysconfig/certbot
<POST_HOOK="" となっている行を下記のように編集>
POST_HOOK="--post-hook 'systemctl restart nginx'"

$ sudo systemctl enable --now certbot-renew.timer

cron を使わず systemd で更新することが Let’s Encryptから推奨されているようだ。

Comments

No commented yet.

Share on FacebookShare on TwitterShare on Pinterest