今回はnginxとphp-fpmでletsencryptで取得した証明書のhttpsサーバを構築します。
流れは以下です。
1.nginxのインストール
2.httpのポート開放
3.php-fpmのインストール
4.certbot-autoのインストール
5.証明書取得と設定
6.httpsのポート開放
hostnameはホスト名として読み替え。
1.nginxのインストール
yum install nginx
vi /etc/nginx/conf.d/hostnameでnginxの設定ファイルを追加
-------------------------
server {
server_name hostname;
root /opt/nginx/hostname;
location / {
index index.html index.htm index.php;
}
access_log /var/log/nginx/hostname.access.log;
error_log /var/log/nginx/hostname.error.log;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
--------------------------
2.httpのポート開放
firewall-cmd --permanent --add-service=http
firewall-cmd –reload
ここでnginxを起動しhttpでアクセスしnginxサーバが動いているか確認します。
system start nginx
http://hostname/へブラウザでアクセス
3.php-fpmのインストール
yum install php-fpm
php-fpm実行ユーザをnginxに変更
vi /etc/php-fpm.d/www.conf
userをnginxへ
----------
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
----------
nginxを再起動、php-fpmを起動し、適当なphpファイルを配置しphpが動作していることを確認します。
systemctl restart nginx
systemctl start php-fpm
/usr/share/nginx/html以下がデフォルトのhttpサーバのディレクトリになります。ここにindex.phpなどを配置しブラウザで確認。
4.certbot-autoの取得
CentOS8のepelリポジトリはcertbotが含まれないようなので、wgetやcurlなどで取得し、適当なディレクトリに配置しパーミッションを設定する。
curl -O https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto
5.証明書取得と設定
/usr/local/bin/certbot-auto --nginx
で証明書の取得と設定を行う。
ダイアログに答えて設定していく。
ログを残してこなかったので、ここの内容については英語を翻訳して確認してください。
以下のような内容があったように記憶しています。
letsencryptのユーザ登録のメールアドレス
次に利用規約の同意
electronic Frontier Foundationにemailアドレスを共有するか
どのhttpsサーバをアクティベイトするか
httpからhttpsへリダイレクトするか
6.httpsのポート開放
firewall-cmd --permanent --add-service=https
firewall-cmd –reload
以前にapacheで--webrootオプションで設定し証明書の設定をする場合はapacheのconfファイルを編集していたが、nginxに対して--nginxオプションだと何もせずに設定されるようです。
あとはhttpsでアクセスし動いていることを確認して完了です。
セキュリティなどは必要な設定を追加してください。
また、cronに/usr/local/bin/certbot-auto renewを追加しておくと自動で更新されそうです。【動作未確認】
細かい話をすると、renewは証明書の有効期限の近い証明書だけを更新してくれるようで、毎日2回実行が推奨されているようです。ただし、実行時間が一定の場合はletsencryptのサーバに負荷がかかるのでランダムスリープを入れて時間をばらけさせるのが望ましいようです。
参考にしたページにある以下のコマンドで設定するのが良さそうです。(python3は入っていなければ入れてください。)
echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/local/bin/certbot-auto renew" | sudo tee -a /etc/crontab > /dev/null
またrenewの動作テストとして--dry-runオプションをつけて実行すると確認ができます。
certbot-auto renew --dry-run
参考にしたページ
https://www.tecmint.com/secure-nginx-with-lets-encrypt-on-centos-8/
https://certbot.eff.org/lets-encrypt/centosrhel8-nginx
流れは以下です。
1.nginxのインストール
2.httpのポート開放
3.php-fpmのインストール
4.certbot-autoのインストール
5.証明書取得と設定
6.httpsのポート開放
hostnameはホスト名として読み替え。
1.nginxのインストール
yum install nginx
vi /etc/nginx/conf.d/hostnameでnginxの設定ファイルを追加
-------------------------
server {
server_name hostname;
root /opt/nginx/hostname;
location / {
index index.html index.htm index.php;
}
access_log /var/log/nginx/hostname.access.log;
error_log /var/log/nginx/hostname.error.log;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
--------------------------
2.httpのポート開放
firewall-cmd --permanent --add-service=http
firewall-cmd –reload
ここでnginxを起動しhttpでアクセスしnginxサーバが動いているか確認します。
system start nginx
http://hostname/へブラウザでアクセス
3.php-fpmのインストール
yum install php-fpm
php-fpm実行ユーザをnginxに変更
vi /etc/php-fpm.d/www.conf
userをnginxへ
----------
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
----------
nginxを再起動、php-fpmを起動し、適当なphpファイルを配置しphpが動作していることを確認します。
systemctl restart nginx
systemctl start php-fpm
/usr/share/nginx/html以下がデフォルトのhttpサーバのディレクトリになります。ここにindex.phpなどを配置しブラウザで確認。
4.certbot-autoの取得
CentOS8のepelリポジトリはcertbotが含まれないようなので、wgetやcurlなどで取得し、適当なディレクトリに配置しパーミッションを設定する。
curl -O https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto
5.証明書取得と設定
/usr/local/bin/certbot-auto --nginx
で証明書の取得と設定を行う。
ダイアログに答えて設定していく。
ログを残してこなかったので、ここの内容については英語を翻訳して確認してください。
以下のような内容があったように記憶しています。
letsencryptのユーザ登録のメールアドレス
次に利用規約の同意
electronic Frontier Foundationにemailアドレスを共有するか
どのhttpsサーバをアクティベイトするか
httpからhttpsへリダイレクトするか
6.httpsのポート開放
firewall-cmd --permanent --add-service=https
firewall-cmd –reload
以前にapacheで--webrootオプションで設定し証明書の設定をする場合はapacheのconfファイルを編集していたが、nginxに対して--nginxオプションだと何もせずに設定されるようです。
あとはhttpsでアクセスし動いていることを確認して完了です。
セキュリティなどは必要な設定を追加してください。
また、cronに/usr/local/bin/certbot-auto renewを追加しておくと自動で更新されそうです。【動作未確認】
細かい話をすると、renewは証明書の有効期限の近い証明書だけを更新してくれるようで、毎日2回実行が推奨されているようです。ただし、実行時間が一定の場合はletsencryptのサーバに負荷がかかるのでランダムスリープを入れて時間をばらけさせるのが望ましいようです。
参考にしたページにある以下のコマンドで設定するのが良さそうです。(python3は入っていなければ入れてください。)
echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/local/bin/certbot-auto renew" | sudo tee -a /etc/crontab > /dev/null
またrenewの動作テストとして--dry-runオプションをつけて実行すると確認ができます。
certbot-auto renew --dry-run
参考にしたページ
https://www.tecmint.com/secure-nginx-with-lets-encrypt-on-centos-8/
https://certbot.eff.org/lets-encrypt/centosrhel8-nginx