CentOS7 + nginx PHP7.4のインストール

phpのインストール

#rpm -qa | grep php
インストールされているパッケージの確認

#yum remove php-*
古いものがある場合は削除

#yum install epel-release
先にepelレポジトリを入れないとremiレポジトリが入らない

#rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
Remiリポジトリの追加

#yum install --enablerepo=remi,remi-php74 php
PHP7.4のインストール

#php -v
バージョン確認

phpの初期設定

#vi /etc/php.ini

379行目あたり
expose_php = On
↓
expose_php = Off

694行目あたり
post_max_size = 8M
↓
post_max_size = 20M

846行目あたり
upload_max_filesize = 2M
↓
upload_max_filesize = 20M

923行目あたり
;date.timezone =
↓
date.timezone = "Asia/Tokyo"

1502行目あたり
;mbstring.language = Japanese
↓
mbstring.language = Japanese

ここでアップロードファイルサイズの上限を20MBに設定しているが、nginx側でも制御されるのでそれは「CentOS7 + nginx WordPressで大きいサイズのファイルアップロード時のエラーの対処法」の設定ページへ

php-fpmのインストール

#yum install --enablerepo=remi,remi-php74 php-fpm
#systemctl start php-fpm
#systemctl enable php-fpm
#systemctl status php-fpm

バーチャルホストのデフォルトサーバーの設定方法と確認方法

apacheの挙動

※バーチャルホストを設定するとapacheでのデフォルトサーバーが「conf.d」の配下の設定ファイルの辞書順の一番先頭のものが設定される。(知らなかったぁ・・)

IPを直打ちされた場合、自分の意図しないバーチャルホストが表示される場合があり、Googleが別サイト扱いし、コピーコンテンツと見なされ、ペナルティの対象になる場合があるので厳重に注意が必要!

apacheのデフォルトサーバーの確認方法

#httpd -S

表示例

*:80 is a NameVirtualHost
default server www.main.000.jp (/etc/httpd/conf.d/01main.conf:1)
port 80 namevhost www.main.000.jp (/etc/httpd/conf.d/01main.conf:1)
port 80 namevhost www.sub.000.jp (/etc/httpd/conf.d/sub.conf:1)

*:443 is a NameVirtualHost
default server www.main.000.jp (/etc/httpd/conf.d/01main.conf:6)
port 443 namevhost www.main.000.jp (/etc/httpd/conf.d/01main.conf:6)
port 443 namevhost www.sub.000.jp (/etc/httpd/conf.d/sub.conf:6)

ドメインと設定ファイルを並べて表示してくれるので非常に分かりやすい。

もし、メインサイトが「main.conf」でサブサイトが「aaasub.conf」だったりすると、辞書順は「aaasub.conf」が先頭になり、デフォルトサーバーが「aaasub.conf」となってしまい、IPアドレス直打ちでアクセスされた場合「www.sub.000.jp」が表示されてしまう。

対応策

ファイル名の辞書順なるのでデフォルトサーバーとして設定するメインサイトの設定ファイル名の頭に「01」等、数字をつけておけば必ず辞書順で一番先頭になるので、後からいくつバーチャルホストを追加しても先頭に数字を付けなければ先頭のファイルが入れ替わる心配がなくなる。

CentOS7のhttpd.confにKeepAliveの設定を追加する方法

httpd.confの編集

#vi /etc/httpd/conf/httpd.conf

一番最後に

KeepAlive On

を追記

特に他を指定しない場合は下記のデフォルト値が適応されます。

MaxKeepAliveRequests 100

1回のアクセスで受付を許容するリクエストの最大数:デフォルト値100

KeepAliveTimeout 15

リクエストまでの待ち時間を秒単位で指定:デフォルト値15

「MaxKeepAliveRequests」はコンテンツ内容の量にもよりますが、通常はデフォルト値で問題ないと思います。自分のとあるページをカウントしてみたところの参考値としては「50」でした。
「KeepAliveTimeout」
これはアクセス数が多いサイトではあまり長くしない方がいいようです。「2~5」くらいが妥当のようです。

CentOS7 yum update が遅いときのチェックポイント

「yum update」をしていると、ものすごく遅いサーバーにあたってしまい、トロトロと中々進まず、下手をするとアップデートに失敗したりします。

大方の予想通り、わざわざ海外の遥か彼方のサーバーにアクセスしにいったりしているので、日本のサーバーにアクセスするようにする設定の覚書。

# vi /etc/yum/pluginconf.d/fastestmirror.conf

include_only=.jp ←追記

保存して、終了後、yum updateのキャッシュをクリアして、実行。

# yum clean all
# yum update

日本のサーバーにアクセスしているか?を確認する。

CentOS7で「Let’s Encrypt」を利用しバーチャルドメインで複数ドメインをSSL化

hostコマンドで正引き確認

まず、「Let’s Encrypt」を利用するにはホスト名が正引きできること(ホスト名からIPアドレスを参照可能)が条件となっているので、hostコマンドでホスト名からIPアドレスが引けることを確認します。

※hostコマンドはデフォルトでインストールされていないので、yumコマンドでインストールします。

# yum install bind-utils

インストールが完了したら、hostコマンドを使います。

#host www.hogehoge.com
www.hogehoge.com has address XXX.XXX.XXX.XXX

入力したホスト名からIPアドレスが表示されることを確認します。

ファイアウォールでHTTPSサービス(443)のポート開放

次に「Let’s Encrypt」を利用するには443ポートでWEBサーバーにアクセスできることが条件となっているので、firewallコマンドで443ポート開放の設定をします。

# firewall-cmd --add-service=https --permanent
# firewall-cmd --reload

設定が完了したら、実際にポート開放されているか?を確認します。

# firewall-cmd --list-all

「services:」のところに「https」と表示されていれば開放されています。更に「CMANインターネットサービス」様の「Portチェックテスト【外部からのPort開放確認】」で実際にWEBサーバーの443ポートへアクセスできるか?を確認します。

https://www.cman.jp/network/support/port.html

SSLモジュールのインストール

# yum install mod_ssl

インストールが完了したらhttpdを再起動します。

# systemctl restart httpd

epelレポジトリのインストール

「certbot」をインストールするにはレポジトリの「epel」が必要になります。前準備として「epel」レポジトリをインストールします。

# yum install epel-release

インストールが完了したらyumコマンドで利用可能なレポジトリリストを確認します。

# yum repolist

「epel」が表示されれば利用可能です。

certbotパッケージのインストール

# yum install certbot

python2-certbot-apacheパッケージのインストール

# yum install python2-certbot-apache

certbotパッケージのインストール確認

# yum list installed | grep  certbot

「certbot」「python2-certbot-apache」が表示されればインストールが完了しています。

certbotコマンドで証明書の発行

# certbot certonly --webroot -w /var/www/html/ -d www.hogehoge.com -d hogehoge.com

バーチャルホストで複数のドメインがある場合は、ドメインの数だけコマンドを実行

# certbot certonly --webroot -w /var/www/html/domain01/ -d www.domain01.com -d domain01.com
aving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): hoge@hogemail.co.jp ←メールアドレスを入力
Starting new HTTPS connection (1): acme-v01.api.Let'sEncrypt.org
 
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A ←利用規約に同意するか?に「A(同意)」を入力
 
-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to Encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N ←メーリングリストに加入するか?に「N(いいえ)」を入力

「Congratulations!」と表示されるとサーバーの証明書がサーバー内に保存されます。エラーが出た場合は証明書は発行されないので、再度、ホスト名の正引きの確認、WEBサーバーの80ポート、443ポートへのアクセス等に間違いがないか?を確認します。

サーバー内に保存された証明書ファイルの確認

# cd /etc/letsencrypt/live/www.hogehoge.com ←certbotコマンドで入力したドメインがフォルダ名になっています。

必要な3つのファイル「cert.pem」「chain.pem」「privkey.pem」があることを確認します。

ssl.confファイルの修正

まずは、オリジナルファイルのバックアップ

# cp -p ssl.conf ssl.conf.org

次にssl.confファイルの修正

<VirtualHost _default_:443> ←ここから
 ・
 ・
 ・
</VirtualHost>←ここまでを全て削除

メインのドメインのconfファイル作成

メインのドメインを「ServerName www.hogehoge.com」、「DocumentRoot /var/www/html」として設定します。

<VirtualHost *:80>
 ServerName www.hogehoge.com
 ServerAlias hogehoge.com
 DocumentRoot /var/www/html

 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^hogehoge\.com$
 RewriteRule ^/(.*) http://www.hogehoge.com/$1 [R=301,L]

 RewriteEngine on
 RewriteCond %{HTTPS} off
 RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

 ErrorLog "logs/error_log"
 CustomLog "logs/access_log" combined
</VirtualHost>

<VirtualHost *:443>
 ServerName www.hogehoge.com:443
 DocumentRoot /var/www/html
 ErrorLog "logs/error_log"
 CustomLog "logs/access_log" combined

 SSLCertificateFile /etc/letsencrypt/live/www.hogehoge.com/cert.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/www.hogehoge.com/privkey.pem
 SSLCertificateChainFile /etc/letsencrypt/live/www.hogehoge.com/chain.pem

 SSLProtocol all -SSLv2 -SSLv3
 SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
 SSLHonorCipherOrder on
 Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

バーチャルホストのconfファイル作成

バーチャルホストのドメインを「ServerName www.domain01.com」、「DocumentRoot /var/www/html/domain01」として設定します。

<VirtualHost *:80>
 ServerName www.domain01.com
 ServerAlias domain01.com
 DocumentRoot /var/www/html/domain01

 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^domain01\.com$
 RewriteRule ^/(.*) http://www.domain01.com/$1 [R=301,L]

 RewriteEngine on
 RewriteCond %{HTTPS} off
 RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

 ErrorLog "logs/domain01_error_log"
 CustomLog "logs/domain01_access_log" combined
</VirtualHost>

<VirtualHost *:443>
 ServerName www.domain01.com:443
 DocumentRoot /var/www/html/domain01
 ErrorLog "domain01_logs/error_log"
 CustomLog "domain01_logs/access_log" combined

 SSLCertificateFile /etc/letsencrypt/live/www.domain01.com/cert.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/www.domain01.com/privkey.pem
 SSLCertificateChainFile /etc/letsencrypt/live/www.domain01.com/chain.pem

 SSLProtocol all -SSLv2 -SSLv3
 SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
 SSLHonorCipherOrder on
 Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

confファイルの設定が完了したらhttpdを再起動します。

# systemctl restart httpd

ブラウザで確認

URLにドメインを入力し、chrome等で「保護された通信」と表示されれば正常にHTTPS通信が出来ています。

証明書の自動更新設定

# crontab -e
00 3 * * 1 certbot renew -q --deploy-hook "systemctl restart httpd"
00 5 * * 1 certbot renew -q --deploy-hook "systemctl restart httpd"

毎月1日の3時と5時に証明書を更新し、成功したら、httpdを再起動する