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から推奨されているようだ。