VagrantでWordPressを構築する

はじめに

こんにちは!なや(@NayaTaiyo)と申します!メンタリングを受ける中でTechBullの課題は、まずサーバの構築から始まります。今回はVagrantを利用してWordPressを構築したので、学んだことの振り返りとして構築手順書を書いてみました。


自己紹介

2000年生まれで、今年エンジニア歴2年目の駆け出しのインフラエンジニアとなります。SES企業に従事しており、主にlinuxやセキュリティ製品を扱うお仕事をしています。今後、自分の技術領域の拡大やインフラ設計・構築の案件に関われるエンジニアになりたいという思いからTechBullのコミュニティへ参画させていただきました。


WordPressとは

だれでも簡単にブログやWebサイトの作成ができる「コンテンツマネジメントシステム(CMS)」の一つです。さらにオープンソースソフトウェア(OSS)でもありソースコードを無償で公開しています。誰でも自由に改変や再配布ができるソフトウェアとなります。WordPressはクライアントからのリクエストを受けるWebサーバ、動的な処理を担うアプリケーションサーバ、データを保存するデータベースサーバの三階層の設計となります。

Vagrantとは

VagrantはHashiCorp社が開発しているVirtualBoxやVMWare、 Microsoft Azureなどをコードで操作してくれるプロビジョニングツールとなります。Vagrant を利用して構築される仮想マシン自体はVirtualBoxやVMWare の仮想マシンと変わりはありません。 Vagrant のメリットは今まで手動で行っていたOSの設定などをコードで簡単に開発環境が構築できるようになります。また、Vagrant はプラグインがあり、仮想マシンの起動~停止の基本操作だけではなく、様々な操作や拡張性が高いのも特徴の一つです。Linuxやサーバを始めて勉強するのであればVagrantから始めると良いと思います。


環境構築手順

  • ホストOS : Windows 11
    • Vagrant 2.4.1
    • VirtualBox 7.0.14
      • Amazon Linux 2 202404.23.0版
  • サービス
    • Web Server:Nginx
    • Application:PHP8.3
    • Database:Mysql8.0
  • Vagrantfile

  • ユーザの作成
  • 仮想マシンへのSSH接続

  • user「menta」でnopasswd設定をする(パスワード無しでコマンドを使用できる設定)

  • ssh鍵認証の設定

※ホストマシン(本手順だとWindows環境)に戻る

以下のように出力されるのでEnterを押下

【説明】

  • Enter file in which to save the key (/c/Users/PC_User/.ssh/id_rsa): :

ファイル名/ファイルパスを指定することができ、指定したファイル名でSSH鍵が作成される(ファイル名のみの場合はカレントディレクトリに作成される)

Enter passphrase (empty for no passphrase): :作成する鍵を使用した際のパスワード設定
※Enterのみを押下して進むと設定なしの状態で進む

[説明]

  • Host {ホスト名}
    • リモートマシンの(仮想マシン)のホスト名
  • Hostname {ipアドレス}
    • リモートマシンの(仮想マシン)のipアドレス
  • User {ユーザ名}
    • SSH接続時、Hostを使用してログインする際のユーザ名
  • Port 22
    • SSHのポート番号
  • IdentityFile {ファイルパス}
    • 「ssh-keygen -t rsa」で作成した秘密鍵のファイルパス
  • リモートマシンのssh鍵設定と公開鍵配置

出力結果をメモにコピペしておく(後手順で使用するため)

ホストの公開鍵を ~/.ssh/known_hosts に登録するかを聞かれるので yes
pwを聞かれるのでvagrantを入力 ※vagrantユーザの初期パスがvagrantであるため

以下の設定を修正(以下の設定のものはそのままで良い)

[説明]

  • PubkeyAuthentication yes/no
    • 公開鍵認証有/無
  • PermitRootLogin yes/no
    • rootユーザでのSSHログイン有/無
  • AuthorizedKeysFile {ファイルパス}
    • 公開鍵ファイルのファイルパス
  • PasswordAuthentication yes/no
    • パスワード認証有/無

メモにコピペしたid_rsa.pubの出力結果を貼りつけ

  • 引っかかりポイント

当時の筆者はssh接続時に指定したユーザのhomeディレクトリ配下にある「authorized_keys」ファイルを参照するのではなく、Vagrantユーザのhomeディレクトリ配下にある「authorized_keys」ファイルが全ユーザで共通の設定だと勘違いして鍵認証が許可されなかった経験があります。その他にも「authorized_keys」ファイルをちゃんと読み込めるようにアクセス権限のチェックも必要。

  • ホストマシン(本手順だとWindows環境)に戻りssh ホスト名で接続確認


Nginxのインストールと設定

  • Nginxとは

Nginxは高性能かつ軽量なWebサーバであり、同時に複数の処理を高速で実行できるというメリットがあります。Nginxは多くのリクエストを同時に並列処理することを前提としたアーキテクチャーになっているため、サーバーダウンのリスクを減らした運用が期待できます。また、並列処理ができるということは、必要となるサーバーの数を減らせるということでもあります。1台のサーバーで多くの処理を担うことができるため、サーバー導入や運用にかかるコストを削減できるというメリットもあります。

一方で、Webサーバーとして広く使用されているもう一つの選択肢にApacheがあります。Apacheは歴史が長く、豊富な機能とモジュールを持っており、柔軟な設定ができる点が大きな強みです。また、モジュールベースの設計により、必要な機能を追加・カスタマイズしやすいという利点があります。Apacheは特に動的コンテンツの処理やCGI、PHPなどを使った処理で強みを発揮し、リクエストごとにプロセスやスレッドを生成して処理を行う「プロセスベース」のモデルを採用しています。

  • NginxとApacheの比較

    • アーキテクチャ:

      • Nginxは非同期イベント駆動型、Apacheはプロセス/スレッドベース

    • パフォーマンス:

      • Nginxは大量の同時接続に強く、リソース消費が少ない。Apacheは動的コンテンツの処理で強みを持つが、多数の同時接続ではパフォーマンスが低下する場合がある。

    • 柔軟性:

      • Apacheはモジュールが豊富で、柔軟なカスタマイズが可能。Nginxは静的コンテンツやリバースプロキシに強く、軽量な環境に適している。

    • 使い分け:

      • 静的コンテンツの配信や、スケーラブルなウェブアプリケーション向けにはNginxが適しており、動的なコンテンツやカスタムモジュールを多く使用するサイトではApacheが有利になることがある。

  • Nginxのインストール

  • Nginxの設定

[説明]

  • user {user名}
    • Nginxを実行するユーザーを指定(デフォルトはnginx)
  • worker_processes {auto/数値};
    • ワーカープロセス数の指定。autoだと動的に数値を指定してくれる(autoを推奨)
  • error_log {ファイルパス}
    • 指定したファイルパスにエラーログを保存
  • pid /run/nginx.pid;
    • Nginxを起動した際のプロセスidが格納される。(基本は設定を変更しなくてよい)
  • worker_connections {数値}
    • 1つのワーカープロセスが同時に処理できる最大接続数
  • log_format custom_log
    • カスタムログ形式を定義。custom_logという名前のログフォーマットを作成し、リクエストや応答に関する詳細な情報をログに記録します。
  • $time_iso8601
    • リクエスト時のタイムスタンプをISO8601形式で記録します。
  • $server_addr
  • $host
    • リクエストされたホスト名を記録します。
  • $request_method
    • HTTPリクエストのメソッド(GET、POSTなど)を記録します。
  • $request_length
    • リクエストのサイズを記録します。
  • $request_uri
    • リクエストされたURIを記録します。
  • $query_string
    • クエリパラメータを記録します。
  • $status
    • HTTPステータスコード(200、404など)を記録します。
  • $body_bytes_sent
    • 応答で送信されたバイト数を記録します。
  • $http_referer
    • リクエストのRefererヘッダ(アクセス元のリンク)を記録します。
  • $http_user_agent
    • ユーザーエージェント(ブラウザやクライアントの情報)を記録します。
  • $http_x_forwarded_for
    • クライアントのIPアドレスを記録します。特にプロキシ経由の場合に使用されます。
  • $request_time
    • リクエスト処理にかかった時間を記録します。
  • $upstream_response_time
    • 上流サーバーからの応答時間を記録します。(リバースプロキシの場合など)リバースプロキシは、バックエンドサーバーにクライアントからのリクエストを転送し、レスポンスをクライアントへ返す処理のこと
  • gzip on
    • Gzip圧縮を有効にする設定です。これにより、Nginxがクライアントに送信するコンテンツを圧縮し、帯域幅を削減。
  • gzip_types {MIMEタイプ}
    • Gzip圧縮するMIMEタイプを指定します。
  • gzip_min_length {数値}
    • Gzip圧縮を適用するコンテンツの最小サイズを設定しています。(バイト単位)
  • gzip_comp_level {1~9}
    • Gzip圧縮の圧縮レベルを指定します。(6を推奨)
  • include {/etc/nginx/conf.d/*.confファイル}
    • バーチャルホストの設定ファイルの呼び出し。バーチャルホストは、1台のサーバーで複数のドメインやウェブサイトをホストできる仕組みを指します。
  • ドキュメントルートとindex.htmlの作成

今回はindex.htmlに「test」と記載。ここで記載したものが後にブラウザ上に表示される。アクセス権に指定する所有者については「Nginxの設定」のuserディレクティブで設定したuser名を指定。以下、Nginxの設定より抜粋。

  • 引っかかりポイント

index.htmlの所有者の設定は現在ログインしているユーザ(whoamiコマンドで表示されるユーザ)ではなく「Nginxの設定」で指定したuser名を設定することで権限まわりのエラーが発生しづらくなります。Nginxがクライアントからのリクエストを受け付け、設定ファイルに記載されているuserディレクティブのuser(デフォルトはnginx)で後続の処理を行うため。

  • バーチャルホストの設定

ディレクトリが存在しない場合は作成

  • listen {80/443}
    • ssl/tlsの設定ありの場合は443でも可能。基本は80でよい
  • server_name {ホスト名/ipアドレス}
    • この設定を適用するホスト名/ipアドレスを指定
  • root {ディレクトリパスを指定}
    • ドキュメントルートの指定。server_nameに対してのリクエストをドキュメントルート配下から探索
  • index {ファイル名}
    • クライアントが特定のファイル名を指定せず、単にディレクトリにアクセスしたときに、Nginxがどのファイルを探して返すべきかを定義
  • access_log {ファイルパス} custom_log;
    • カスタムログの保存。末尾にnginx.confで指定したログフォーマット名を付与することでログフォーマットの適用
    • ログフォーマット名なしの場合は、デフォルトのアクセスログを保存
  • error_log {ファイルパス};
    • エラーログの保存
  • location / { try_files $uri $uri/ =404;
  • /にマッチするリクエスト(すべてのリクエスト)に対して、リクエストされたURIに対応するファイルを探し、もし存在しなければ、同名のディレクトリを探します。どちらも存在しなければ、404エラーを返す。
  • location ~ \.php$
    • phpで終わるリクエスト(PHPファイル)に対して、このlocationブロックの設定を適用します。
  • include fastcgi_params
    • PHPリクエストをFastCGIで処理する際に必要なFastCGIパラメータを定義したファイルを読み込みます。通常は、nginxのインストール時に提供されるfastcgi_paramsファイルを使用します
  • fastcgi_pass unix:{ファイルパス}
    • Unixドメインソケットを使う際の、ソケットファイルの指定。
  • fastcgi_index {ファイル名}
    • ディレクトリ内に{ファイル名}があれば、それをデフォルトで処理するように指定します。
  • fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name
    • Nginxがドキュメントルート内のリクエストされたPHPファイルを探索し、PHP-FPMに正しいファイルパスを伝える設定

  • 動作確認

ホストマシン(本手順ではWindows環境)にてhostsファイルの設定を行いブラウザからアクセス確認を行う。

メモ帳を管理者権限で開く→ファイル→開く→右下のプルダウンを「テキスト文書」から「すべてのファイル」に変更→C:\Windows\System32\drivers\etc\hostsを開く

http://dev.menta.meでブラウザからアクセスして、index.htmlの内容が表示されているのを確認


PHPのインストールと設定

  • PHPとは

PHPはWebページを生成することができるサーバーサイドの動的型付け言語です。MySQLなどのデータベースとの連携が容易なことなどから、WordPressを含めたWebアプリケーションの開発(Laravel.CakePHPなど)にもよく使われる有名なスクリプト言語でもあります。

  • リポジトリの有効化

  • PHPインストール

  • php-fpmの設定

  • user = {user名}
    • PHP-FPM プロセスがどのユーザー権限で実行されるかを指定します。(基本はnginx.confのuserディレクティブで指定したuser名)
  • group = {group名}
    • PHP-FPM プロセスがどのグループ権限で実行されるかを指定します。(アクセス権管理がしやすいためnginxの指定でよいと思います。)
  • listen = {ファイル名}
    • UNIX ドメインソケットファイルを指定する場合があります。このソケットを介して Web サーバー(Nginxなど)と PHP-FPMが通信します。
  • UNIX
    • ドメインソケットファイルはローカル内でtcp/udpなどのネットワーク層のプロトコルを使用しないで高速な通信を行う。
  • listen.owner = {user名}
    • listen で指定されたソケットファイルの所有者を指定します。
  • listen.group = {group名}
    • listen で指定されたソケットファイルのグループを指定します。
  • listen.mode = {パーミッション} :
    • ソケットファイルのアクセス権限を設定します。

MySQLのインストールと設定

  • MySQLとは

MySQLとは、世界でもっとも利用されている「データベース」です。MySQLの特徴の一つにトランザクション機能があります。トランザクションとは、データの一貫性を保つために、一連の処理が完了するまでデータを変更しないようにできる機能のことです。途中でトラブルがあった場合は、一連の処理をすべて破棄しデータに相違が出ないようにできます。これは、金融機関でのお金のやりとりなど、データに相違があると困る場合に役立つ機能です。MySQLでは、このトランザクションをサポートする機能が多くあるので、完全にデータの一貫性を保つことが可能なのです。

  • MySQLサーバのインストール

  • character-set-server={文字セット}
    • MySQLサーバーで使用するデフォルトの文字セットを設定します。
  • collation-server={コレーション(比較順序)}
    • 文字セットの比較順序(コレーション)を設定します。
  • datadir={ディレクトリパス} :
    • MySQLのデータベースファイルが保存されるディレクトリを指定します。
  • socket={ファイルパス} :
    • MySQLサーバーがクライアントと通信するために使用するUnixソケットファイルを指定します。
  • log-error={ファイルパス}
    • MySQLサーバーがエラーログを記録するファイルを指定します。
  • pid-file={ファイルパス}
    • MySQLサーバーが実行される際のプロセスID(PID)を保存するファイルを指定します。

  • データベースの設定


WordPressのダウンロードと設定

  • wp-config.phpの修正

[説明]

  • define( ‘DB_NAME’, {‘データベース名’} )
    • WordPress が使用するデータベースの名前です。
  • define( ‘DB_USER’, {‘user名’ })
    • DB_USER: データベースに接続する際に使用されるユーザー名です。
  • define( ‘DB_PASSWORD’, {‘パスワード’} )
    • データベースユーザー menta に対応するパスワードです。
  • define( ‘DB_HOST’, {‘host名’} );
    • DB_HOST: データベースサーバーのホスト名です。
  • define( ‘DB_CHARSET’, {‘文字セット’} )
    • データベースで使用する文字セットです。
  • define( ‘DB_COLLATE’, ” )
    • データベースでの文字列比較ルール(照合順序)を設定します。通常は空のまま(”)にしておくのが一般的で、 DB_CHARSETに依存して自動的に適切な値が使われます。
  • 各サービス再起動

http://dev.menta.meにアクセス。

初回のsetupを進めていきインストール後再度ログインして以下のようにダッシュボードが出れば完了となります!


まとめ

WordPressはWebサイトやブログなどを簡単に作成・管理できる代表的なCMSであり、世界中で利用されているため需要が高いといえます!!また、Linux、アプリケーション、Webサーバ、データベースを一貫して学ぶことも可能なので、自分のスキルアップや市場価値を上げたい方はこの機会に一度VagrantやWordPressについて学んでみてはいかがでしょうか。

長いブログとなりましたが、見ていただきありがとうございました!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール