運用自動化ツール

【RHEL系Linux】Apache+Let's Encrypt 自動構築スクリプト|バーチャルホスト対応・完全自動化ツール

開発用途のApache構成に毎回手間を感じていませんか?

このスクリプトは、RHEL系LinuxにおけるApache(httpd)のインストールから設定変更、プロセスチューニング、バーチャルホストの設定までを一括で自動化します。

特に、複数プロジェクトをホストする前提でバーチャルホストの雛形も用意されており、再実行しても冪等性を保ちつつ、構築作業のブレをなくします。

この一連の処理により、Webサーバーの標準構築を高速・安定化し、構築担当者のミスを排除する環境を実現できます。

今後、Web開発プロジェクトのスケーラビリティを見越した設計にも対応可能です。

自動化運用ツール

🟡 自動化運用ツール
📌 面倒な作業を一括効率化!シェルスクリプトで実現する運用自動化術
├─ 基本共通
| ├─【Shellの基礎知識】簡単なログ出力ロジックを作ってみました。
| ├─【Shellの基礎知識】シェルスクリプトの作成を時短!テンプレートで効率化する方法
| ├─【Shellの基礎知識】共通関数定義クラスの完全ガイド!設計から実践まで徹底解説
├─ 開発環境構築
| ├─【RHEL系Linux】開発サーバー初期設定スクリプトの完全自動化
| ├─【RHEL系Linux】Apache+Let's Encrypt 自動構築スクリプト|バーチャルホスト対応
| ├─【RHEL系Linux】Tomcatを自動インストール・設定するスクリプトの作成と活用法
| └─【RHEL系Linux】PostgreSQLを自動インストールするシェルスクリプトの使い方
└─ 運用・保守
  ├─【RHEL系Linux】任意サービスを簡単制御!汎用サービススクリプトの活用術
  ├─【RHEL系Linux】ファイルやログを自動圧縮する汎用スクリプトの実装と活用法
  ├─【RHEL系Linux】リソース(CPU・MEM)監視スクリプトで使用率・異常を検知する仕組み
  ├─【RHEL系Linux】中間ファイル連携を完全制御するファイル転送スクリプト
  ├─【RHEL系Linux】信頼性を重視した完了保証型ディレクトリ転送スクリプトの設計と実装
  ├─【RHEL系Linux】ディスク使用率を自動監視するシェルスクリプトの実装
  └─【RHEL系Linux】サーバーの障害検知と自動通知|systemdログ監視の実装例

スクリプトの役割と想定ユースケース

ApacheとLet's EncryptによるHTTPS環境を、完全に自動化されたシェルスクリプトで構築します。このスクリプトは、インフラ構築作業の手間を削減し、SSL証明書に関する典型的なエラーを回避する仕組みを持っています。RHEL系Linux(AlmaLinuxやRocky Linuxなど)を対象に設計されており、サーバーの初期セットアップからSSL通信の有効化までを一貫して処理します。構成は実行順に明確に分かれており、汎用性と再現性の両立を重視しています。

ApacheとLet's Encryptの構築を一括で自動化

ApacheのインストールからSSL証明書の取得、HTTPSリダイレクトの設定までを、1回のスクリプト実行で完了できる構成です。スクリプトは以下の2つに分かれており、それぞれが役割を持って動作します。

スクリプト名主な処理内容
init_rhel_devhost.shfirewalldやSELinuxの初期設定、ロケール・タイムゾーンの適用、必要パッケージの導入
install_apache_host.shApacheとmod_sslの導入、confの編集、Let's Encryptによる証明書取得、VirtualHost設定

sh install_apache_host.sh -d www.example.com -e your@email.com

firewalldでのポート開放(22, 80, 443, 5000-5003)や、httpd.confへのServerName挿入、mod_sslの導入も全て内包しており、スクリプトを追う必要はありません。

証明書取得とSSL設定のエラーを防ぐ仕組み

Let's Encryptのcertbotを用いた証明書取得は、VirtualHostが存在しない場合やApache構文エラーがある場合に失敗します。この問題を回避するため、スクリプトでは以下のような処理を実装しています。

  • 証明書取得前に一時的なVirtualHost(*:80)をhttpd.confに自動挿入
  • Apache再起動と構文チェック(httpd -t)を行い、問題がなければcertbotを実行
  • 取得完了後はVirtualHostを自動削除し、元のconf構造に復元

これにより、以下のようなcertbotエラーを根本から排除しています。

PluginError: Unable to find a virtual host listening on port 80

さらに、証明書が正しく取得されたかをファイルサイズで検証し、空のままリンクだけが生成された状態も除外します。

[ ! -s /etc/letsencrypt/live/${DOMAIN}/fullchain.pem ]

また、Let's Encryptには「同一FQDNに対して7日間で5回まで」というレート制限があります。これに引っかかった場合でも、ログに出力される時間をもとに次回取得可能時刻を読み取り、運用者に的確な対応判断ができるよう配慮されています。

このように、certbotが失敗する典型的なケースを事前に吸収する構造により、実行する側はスクリプトの内部ロジックを把握していなくても問題なくHTTPS環境を構築できます。

スクリプト全体の構造と設計の工夫

本構築ツールは、ApacheおよびLet's Encryptの導入を完全自動化することを目的に設計されています。そのために、スクリプトは「初期環境の整備」と「Webサーバー構築」に明確に役割分担された2部構成になっています。さらに、証明書取得時のトラブルを回避するため、VirtualHostの一時追加と復元処理も組み込まれており、再現性と安全性の両立が実現されています。

init_rhel_devhost.shが担う初期環境の整備

このスクリプトは、RHEL系Linux(例:AlmaLinux)における開発サーバーの初期環境を、自動で最適化する役割を担います。初期状態のRHEL系OSでは、SELinuxやfirewalldなどの制約により通信制限が多く、手作業での調整が煩雑になりがちです。本スクリプトは、以下の処理をすべて自動で行います。

  • SELinuxの無効化と反映設定
  • ロケール(ja_JP.UTF-8)とタイムゾーン(Asia/Tokyo)の設定
  • firewalldの起動とポート開放(22, 80, 443, 5000-5003)※個人開発で利用する前提
  • chronydの起動とNTP同期の確認
  • sysctlやulimitのパラメータ最適化

さらに、cron定期ジョブスケジュールも /etc/cron.d に自動配置され、今後の保守・運用を見据えた土台構築が完了します。

sh init_rhel_devhost.sh

この1行を実行するだけで、開発用途に必要なRHEL系サーバーの初期構成が完成します。

RHEL系Linux環境の初期セットアップも自動化したい方は、以下の記事も参考にしてください。SELinux無効化からfirewalld設定、パッケージ導入までを一括で処理するスクリプトを紹介しています。

▶︎【RHEL系Linux】開発サーバー初期設定スクリプトの完全自動化

install_apache_host.shによるWeb構築の自動化

このスクリプトは、ApacheとLet's Encryptの連携によるHTTPSサーバー構築を自動化する役割を担います。httpdやmod_sslの導入に加え、不要なconfファイルの無効化、MPMのeventモード化、ファイルディスクリプタ制限の拡張など、現場で必要とされる最適化が盛り込まれています。 処理の主な構成は以下のとおりです。

処理内容対象設定
Apacheインストールhttpd, mod_ssl
conf設定ServerName, VirtualHost, MPM
不要confの空ファイル化welcome.conf, userdir.conf, autoindex.conf
起動設定systemctl enable + daemon-reload

このスクリプトの中で自動的にcertbotを実行し、取得した証明書をそのままhttpd.confに反映することで、ApacheのHTTPS化が完了します。

sh install_apache_host.sh -d www.example.com -e your@email.com

また、証明書の自動更新にも対応しており、certbot-renew.timerが有効化されるため、更新忘れによる障害も防げます。

certbot対応のためのVirtualHost一時追加処理

certbotはApacheモードで実行する場合、conf内に `*:80` のVirtualHostが存在していることを前提に動作します。しかし、構築の初期段階ではまだ `*:443` のVirtualHostすら存在しないため、証明書取得時に以下のようなエラーが発生する可能性があります。

Unable to find a virtual host listening on port 80

この問題を根本的に回避するため、install_apache_host.shでは一時的に以下のVirtualHostをhttpd.confへ自動追加します。

# === BEGIN TEMP VHOST FOR CERTBOT ===
<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /var/www/html
</VirtualHost>
# === END TEMP VHOST FOR CERTBOT ===

証明書取得後にはこのブロックを sed により確実に削除し、構文エラーを残さないようにしています。また、削除後はhttpdを再起動し、構成を明確に1本化することでconfの肥大化を防止しています。これは商用サーバーでもそのまま運用可能な設計となっており、構築後の保守性も高く保たれます。

自動構築スクリプトによる各種設定内容

ApacheとSSL証明書の導入においては、単なるパッケージのインストールだけでなく、設定ファイルの編集や構文チェック、各種サービスとの連携など多くの調整が必要です。本スクリプトは、そうした作業をすべて網羅し、自動的に整備される構成になっています。ここでは、各種設定処理の具体的な中身について整理します。

Apacheインストールとconfの動的編集

Apache(httpd)とmod_sslをインストールしたうえで、httpd.confの内容を実行時に動的に編集しています。特にServerNameの有効化、MPMモードの変更、open file limitの上限設定など、開発・運用で必須となる設定はすべて組み込まれています。

以下がスクリプト実行時に自動で行われる主な処理です。

設定項目処理内容
ServerNamelocalhost:80 を httpd.conf に挿入
MPM設定prefork, worker のうち worker を有効化
limits.confLimitNOFILE=65535 を systemd 設定に追加
conf.d の整備welcome.conf, userdir.conf, autoindex.conf を空ファイル化

また、プロセスの再起動や自動起動設定も反映されるため、再起動後も設定が維持されます。

systemctl daemon-reload
systemctl enable httpd

SSL証明書の存在チェックとconf反映処理

Let's Encryptの証明書はcertbotにより取得されますが、certbot実行後に証明書ファイルが確実に存在しているかどうかをスクリプト内でチェックしています。空リンクや途中失敗による未発行のままconfが有効化されることを防ぐため、証明書ファイルが存在かつ非空であることを条件に処理を継続します。

[ ! -s /etc/letsencrypt/live/${DOMAIN}/fullchain.pem ]

証明書が正しく取得された場合は、自動的にhttpd.confへ以下のVirtualHostブロックが挿入されます。

<VirtualHost *:443>
    ServerName ${DOMAIN}
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/${DOMAIN}/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/${DOMAIN}/privkey.pem
</VirtualHost>

このように、証明書ファイルの有無と正当性を条件としてconf反映を行うことで、Apache起動時の構文エラーを防ぎ、安定したHTTPS構成を確保します。

firewalldポート設定と安全性の担保

firewalldの設定では、初期セットアップ時に22, 80, 443, 5000〜5003までのポートを一括で開放します。ただし、再構築スクリプト(install_apache_host.sh)でも明示的にポート設定を行うため、途中でfirewalldが初期化された場合でもHTTPSポートが閉じられる心配はありません。 スクリプトでは以下のように、ポートの開放状態を確認したうえで必要に応じて追加しています。

if ! firewall-cmd --list-ports | grep -q '443/tcp'; then
    firewall-cmd --permanent --add-port=443/tcp
    changed=1
fi

必要なポートをすべて追加したあと、1回だけ firewall-cmd --reload を実行することで、設定の上書きによる削除や競合を防ぎます。 このように、スクリプトはセキュリティ設定にも配慮されており、最小限のポート開放で安全な通信環境を整えます。

※本スクリプトはAlmaLinux環境で実際に検証を行った上で構築されていますが、AlmaLinuxやRocky LinuxはOSSのため、バージョンアップに伴いApache関連の設定ファイル構造や記述フォーマットが変更される可能性があります。その場合、sed等による設定項目の自動置換処理が正常に動作しないことがあります。スクリプトのご利用前には対象サーバーのApacheバージョンと設定ファイルの構造をご確認ください。anently と Location: https://~ のレスポンスが得られれば、構築成功と判断できます。

利用手順と再現可能な運用方法

このスクリプトは、再現性の高いApache+SSL構成を一括で自動化しますが、その前提としていくつかの重要な値が環境依存であり、適切な設定と引数指定が必要です。スクリプトは高い汎用性を備えていますが、何も考えずに実行すると目的と異なる構成が出来上がる恐れもあります。実行前に必ず以下の内容を確認し、自身の環境に合わせて調整してください。

前提となる実行環境

Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • <<各種実行スクリプト>>.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • logger.shrc(共通ログ出力ファイル)
      • utils.shrc(共通関数定義ファイル)
    • etc(設定ファイル等の格納領域)
      • infraMessage.conf(メッセージ定義ファイル)
    • log(スクリプト実行ログの格納領域)
      • スクリプト名.log 
    • tmp(テンポラリ領域)
    • rep(レポート出力領域)

Apacheサーバー自動構築スクリプト

本セクションでは、Apache + Let's Encrypt の導入を完全自動化する install_apache_host.sh スクリプトの内部構成とその処理内容について解説します。証明書の取得からVirtualHost設定の反映、firewalldのポート開放まで、すべての工程が1本のスクリプトに統合されており、環境構築における人的ミスや設定漏れを極限まで排除できるよう設計されています。

以降に、実際のスクリプト全文を掲載します。必要に応じて自環境に合わせたパラメータ修正を行ってください。

環境ごとに変更すべき項目と引数の指定

スクリプトではドメイン名とメールアドレスを外部引数で指定する仕様になっています。これはLet's Encryptの証明書取得に必要なため、必ず適切な値を与える必要があります。

sh install_apache_host.sh -d www.example.com -e user@example.com

スクリプトを実行する際は、少なくとも -d(ドメイン名)および -e(メールアドレス)の2つの引数を指定する必要があります。これらの値が省略された場合、スクリプトは処理を開始せず終了します。

また、ホスト名やポート開放処理など一部の情報はスクリプト内部で自動的に取得・判定されるよう設計されています。そのため、基本的には引数さえ正しく指定すれば、環境ごとの個別修正を行わずにそのまま実行可能です。 

種別項目処理内容変更の必要性
引数指定DOMAINSSL証明書対象のFQDNを明示必須
引数指定EMAILLet's Encrypt登録メールアドレス必須
自動取得hostname`hostname -s` により自動取得不要
条件付き処理ポート80,443firewalldに未登録なら開放通常は不要

解放ポートは init_rhel_devhost.sh 内で firewall-cmd によって設定されています。特に5000番台のポートは開発用途に応じて変更すべきケースもあるため、事前に明確にしておく必要があります。

構築スクリプトの削除モードについて

ApacheやLet's Encrypt関連の構成を完全に削除したい場合は、`install_apache_host.sh` に `-m erase` オプションをつけることで、削除専用の処理が実行されます。

sh install_apache_host.sh -m erase

このモードでは以下の操作が行われます。

  • httpd, mod_ssl, certbot のアンインストール
  • /etc/httpd ディレクトリと systemd 関連設定の削除
  • Let's Encrypt の証明書・ログ・キャッシュの完全削除
  • Apache の conf.d に残る VirtualHost 設定ファイルの削除
  • certbot-renew.timer の無効化と削除

再構築したい場合や構成に問題が生じた場合は、一度 erase モードで全削除を行ってから再構築することでクリーンな状態を維持できます。

実行パターンに応じた使い分け

このスクリプトは、初回の導入、構成のやり直し、完全削除のみという3つの使い分けができるように設計されています。用途に応じて、以下の実行パターンを選択してください。

目的実行コマンド引数説明
初回導入-d www.example.com -e user@example.com構築のみを実行します。事前にApacheが入っていないことが前提です。
再導入(削除→構築)-d www.example.com -e user@example.com -m eraseApacheおよびLet's Encrypt関連の構成をすべて削除したあと、直ちに再構築を行います。
完全削除のみ-m erase_only構築は行わず、Apacheと証明書、conf、systemd設定をすべて削除します。

再導入は構成をクリーンに戻したうえで安全に再構築したい場合に便利です。一方で、confファイルを残したい、または構成の復元を伴わない単純削除が目的であれば -m erase_only による実行が適しています。

et's Encryptのスクリプト再実行時の注意点

同じ構成を何度も繰り返し適用したい場合でも、Let's Encryptの仕様により証明書の発行には回数制限(Rate Limit)が存在します。

スクリプトはそのまま再実行できますが、証明書が取得できない場合には `certbot` のログを確認し、レート制限の対象時間を見極める必要があります。 また、スクリプトはconfを追記・上書きする形式ではなく、既存の httpd.conf を前提に一時的なVirtualHostを挿入→削除する構成です。

そのため、独自に編集したconfがある場合は上書きされないように注意してください。必要に応じてバックアップを取り、構成の整合性を維持してください。

本サイトにて記載のすべてのスクリプト利用により発生した利用者の損害全てに対し、いかなる責任をも負わないものとし、損害賠償をする一切の義務はないものとします。また、この記事は、実際の案件対応を通じて得た知見をもとに筆者が作成したものであり、全コードと解説は著者本人による設計・検証結果に基づいています。

よく読まれている記事

1

「シェル」と「シェルスクリプト」という言葉を聞いたことがありますか?どちらもLinuxやMacのターミナルで使われるものですが、それぞれの役割や使い方には違いがあります。 本記事では、「シェル」と「シ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-運用自動化ツール