すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:LNMP スタックのデプロイ

最終更新日:Apr 28, 2026

本番サイト向けに、設定とセキュリティ強化を完全に制御しながら、Elastic Compute Service (ECS) インスタンスに Nginx、MySQL、PHP をインストールします。

ソリューションアーキテクチャ

image
  1. ユーザーのブラウザが ECS インスタンスのポート 80 に HTTP リクエストを送信します。

  2. Nginx がリクエストを受信してルーティングします。HTML、CSS、画像などの静的アセットは直接提供し、PHP リクエスト (.php で終わるファイル) は FastCGI 経由で PHP-FPM に転送します。

  3. PHP-FPM が PHP コードを実行します。コードでデータベースアクセスが必要な場合は、MySQL に接続します。

  4. MySQL が PHP スクリプトからの SQL クエリを実行し、結果を返します。

  5. PHP-FPM が結果から HTML を生成して Nginx に返し、Nginx がレスポンスをブラウザに送信します。

操作手順

少なくとも 2 GiB のメモリを搭載した ECS インスタンスを推奨します。

ステップ 1:インスタンスの準備

パブリックアクセスとセキュリティグループルールを設定し、システムパッケージを更新します。

  1. パブリックアクセスを設定します。

    ECS インスタンスにパブリック IP アドレスまたは Elastic IP Address (EIP) があることを確認してください。詳細については、「インスタンスのパブリックアクセスを有効にする」をご参照ください。

  2. セキュリティグループルールを追加します。

    ECS インスタンスのセキュリティグループで、ポート 80 での TCP トラフィックを許可するインバウンドルールを追加します。詳細については、「セキュリティグループルールを追加する」をご参照ください。

  3. システムパッケージを更新します。

    Alibaba Cloud Linux 3 / CentOS 8

    1. ECS インスタンスにログインします。

      1. ECS コンソール - インスタンスに移動します。上部メニューで、対象のリージョンとリソースグループを選択します。

      2. インスタンスの詳細ページで、接続 をクリックして ワークベンチ を選択します。画面の指示に従ってログインします。

    2. すべてのパッケージを更新します。

      sudo dnf update -y

    Alibaba Cloud Linux 2 / CentOS 7

    1. ECS インスタンスにログインします。

      1. ECS コンソール - インスタンスに移動します。上部メニューで、対象のリージョンとリソースグループを選択します。

      2. インスタンスの詳細ページで、接続 をクリックして ワークベンチ を選択します。画面の指示に従ってログインします。

    2. すべてのパッケージを更新します。

      sudo yum update -y

    Ubuntu

    1. ECS インスタンスにログインします。

      1. ECS コンソール - インスタンスに移動します。上部メニューで、対象のリージョンとリソースグループを選択します。

      2. インスタンスの詳細ページで、接続 をクリックして ワークベンチ を選択します。画面の指示に従ってログインします。

    2. すべてのパッケージを更新します。

      sudo apt update -y && sudo apt upgrade -y

ステップ 2:Nginx のインストール

  1. Nginx リポジトリを追加して Nginx をインストールします。

    Alibaba Cloud Linux 3 / CentOS 8

    # 公式 Nginx リポジトリを追加します。
    sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF'
    [nginx-stable]
    name=nginx stable repo
    baseurl=https://nginx.org/packages/centos/8/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    EOF
    
    # Nginx をインストールします。
    sudo dnf -y install nginx

    Alibaba Cloud Linux 2 / CentOS 7

    # 公式 Nginx リポジトリを追加します。
    sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF'
    [nginx-stable]
    name=nginx stable repo
    baseurl=https://nginx.org/packages/centos/7/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    EOF
    
    # Nginx をインストールします。
    sudo yum -y install nginx

    Ubuntu

    # Nginx の依存関係をインストールします。
    sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
    
    # パッケージの真正性を検証するために、公式 Nginx 署名鍵をインポートします。
    curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
    
    # Nginx 用の APT リポジトリを設定します。
    echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
    
    # Nginx をインストールします。
    sudo apt update
    sudo apt install -y nginx
  2. Nginx を起動し、起動時に有効にします。

    enable --now フラグは、サービスを起動し、起動時に有効にします。
    sudo systemctl enable --now nginx
  3. Nginx が実行されていることを確認します。
    curl http://127.0.0.1 を実行します。出力に Nginx のウェルカムページ HTML が含まれている場合、インストールは成功しています。

ステップ 3:MySQL のインストール

  1. MySQL をインストールします。

    Alibaba Cloud Linux 3 / CentOS 8

    # Alibaba Cloud Linux 3 では、古い OpenSSL バージョンとの互換性のために compat-openssl10 が必要です。
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        if [ "$ID" = "alinux" ] && [ "$VERSION_ID" = "3" ]; then
            sudo dnf install -y compat-openssl10
        fi
    fi
    
    # MySQL 8.4 用の YUM リポジトリを追加します。
    sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el8-1.noarch.rpm
    
    # MySQL サービスをインストールします。
    sudo dnf install -y mysql-server

    Alibaba Cloud Linux 2 / CentOS 7

    # MySQL 8.4 用のリポジトリを追加します。
    sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el7-1.noarch.rpm
    
    # MySQL サービスをインストールします。
    sudo yum install -y mysql-server

    Ubuntu

    # デフォルトの Ubuntu リポジトリには MySQL が含まれているため、直接インストールできます。
    # Ubuntu 20.04 以降のバージョンでは、デフォルトで MySQL 8.0 がインストールされます。
    # Ubuntu 18.04 以前のバージョンでは、デフォルトで MySQL 5.x がインストールされます。
    sudo apt install -y mysql-server
  2. MySQL を起動し、起動時に有効にします。

    Alibaba Cloud Linux / CentOS

    sudo systemctl enable --now mysqld

    Ubuntu

    sudo systemctl enable --now mysql
  3. セキュリティ強化を実行します。

    デフォルトの MySQL 設定では、匿名ユーザーと root のリモートログインが許可されています。セキュリティスクリプトを実行して、これらの脆弱性を修正します。

    1. root の初期パスワードを取得します。

      このステップは、Alibaba Cloud Linux と CentOS にのみ適用されます。Ubuntu では、root ユーザーはデフォルトでソケットベースの認証を使用します。

      # ログから一時パスワードを抽出して表示します。
      sudo grep 'temporary password' /var/log/mysqld.log
    2. セキュリティスクリプトを実行します。

      sudo mysql_secure_installation を実行し、プロンプトに従います。

      1. root パスワードをリセットします。一時パスワードを使用してログインし、新しいパスワードを設定します。

        大文字、小文字、数字、特殊文字を含む、少なくとも 12 文字の強力なパスワードを使用してください。
      2. 匿名ユーザーを削除します。Y を入力します。

      3. root のリモートログインを禁止します。Y を入力します。

      4. テストデータベースを削除します。Y を入力します。

      5. 権限テーブルを再読み込みします。Y を入力します。

ステップ 4:PHP のインストール

PHP、PHP-FPM、MySQL 拡張機能をインストールします。

  1. PHP リポジトリを追加して PHP をインストールします。

    Alibaba Cloud Linux 3 / CentOS 8

    # Remi リポジトリを追加します。
    cat > /etc/yum.repos.d/remi.repo << 'EOF'
    [remi]
    name=Remi\'s RPM Repository for Enterprise Linux 8 - x86_64
    baseurl=https://rpms.remirepo.net/enterprise/8/remi/x86_64/
    enabled=1
    gpgcheck=1
    gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
    
    [remi-safe]
    name=Remi Safe Repository
    baseurl=https://rpms.remirepo.net/enterprise/8/safe/x86_64/
    enabled=1
    gpgcheck=1
    gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
    EOF
    
    # GPG 鍵をインポートします。
    rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
    
    # yum-utils をインストールします。
    dnf install -y yum-utils
    
    # PHP、PHP-FPM、MySQL 拡張機能をインストールします。
    dnf install -y php php-fpm php-mysqlnd

    Alibaba Cloud Linux 2 / CentOS 7

    # Remi リポジトリをインストールします。
    sudo yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    
    # yum-utils をインストールし、PHP 8.2 リポジトリを有効にします。
    sudo yum install -y yum-utils
    sudo yum-config-manager --enable remi-php82
    
    # PHP、PHP-FPM、MySQL 拡張機能をインストールします。
    sudo yum install -y php php-fpm php-mysqlnd

    Ubuntu

    # PPA を管理するためのツールをインストールします。
    sudo apt install -y software-properties-common
    
    # ondrej/php PPA リポジトリを追加します。
    sudo add-apt-repository -y ppa:ondrej/php
    
    # PHP 8.2、PHP-FPM、MySQL 拡張機能をインストールします。
    sudo apt install -y php8.2 php8.2-fpm php8.2-mysql
  2. PHP-FPM を起動し、起動時に有効にします。

    Alibaba Cloud Linux / CentOS

    sudo systemctl enable --now php-fpm

    Ubuntu

    sudo systemctl enable --now php8.2-fpm

ステップ 5:PHP を処理するための Nginx の設定

デフォルトでは、Nginx は静的ファイルのみを配信します。.php リクエストを PHP-FPM に転送するように設定します。この設定がないと、PHP ページがダウンロードされるか、エラーが発生します。

  1. デフォルトの Nginx 設定ファイルをバックアップします。

    sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
  2. PHP-FPM サービスの通信アドレスを取得します。

    Nginx は、このアドレスを使用して PHP リクエストを PHP-FPM に転送します。

    Alibaba Cloud Linux / CentOS

    PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php-fpm.d/www.conf | head -n 1)
    echo "$PHP_FPM_LISTEN"

    Ubuntu

    PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php/8.2/fpm/pool.d/www.conf | head -n 1)
    echo "$PHP_FPM_LISTEN"
  3. .php リクエストを PHP-FPM に転送するように Nginx を設定します。

    <PHP_FPM_ADDRESS> を前のステップで取得した通信アドレスに置き換えて、コマンドを実行します。

    • 出力がファイルパスの場合 (例: /run/php-fpm/www.sock)、サービスは Unix ソケットを使用しています。アドレス形式は unix:FILE_PATH です (例: unix:/run/php-fpm/www.sock)。

    • 出力が IP アドレスとポートの場合 (例: 127.0.0.1:9000)、サービスは TCP ソケットを使用しています。IP アドレスとポートを通信アドレスとして直接使用します。

    sudo tee /etc/nginx/conf.d/default.conf <<-'EOF'
    server {
        listen       80;
        server_name  localhost;
        root /usr/share/nginx/html;
    
        # デフォルトのインデックスファイルを設定します。
        index index.php index.html index.htm;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        # .php リクエストを PHP-FPM に転送します。
        location ~ \.php$ {
            fastcgi_pass   <PHP_FPM_ADDRESS>;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    EOF
  4. 設定ファイルをテストします。

    sudo nginx -t
    • 出力に successful が含まれている場合、設定は正しいです。次のステップに進みます。

    • 出力に failed が含まれている場合、アドレスを正しく置き換えたことを確認するか、バックアップを復元してください。

      sudo mv /etc/nginx/conf.d/default.conf.bak /etc/nginx/conf.d/default.conf
  5. 新しい設定を適用するために Nginx を再起動します。

    sudo systemctl restart nginx

ステップ 6:スタックの検証

Nginx が PHP を処理し、PHP が MySQL に接続することを確認するためのテストファイルを作成します。

  1. Nginx による PHP の処理を検証します。

    1. テストファイルを作成しますphpinfo() を含むファイルを生成して、PHP 設定を表示します。

      echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.php
    2. ブラウザで確認しますhttp://<ECS_PUBLIC_IP>/phpinfo.php にアクセスします。

      • 成功:ページに PHP 環境の詳細が表示されます。

      • 失敗:ページに "File not found" が表示されるか、ブラウザがファイルをダウンロードします。

    3. テストファイルをクリーンアップします。確認後、このファイルを削除してください。phpinfo ページには機密性の高いサーバー情報が含まれています。

  2. PHP から MySQL への接続性を検証します。

    mysqlnd 拡張機能を使用してデータベース接続性をテストする PHP スクリプトを作成します。

    1. データベースとユーザーを作成します。
      ステップ 3 で設定した root パスワードを使用して MySQL にログインします。

      sudo mysql -u root -p

      mysql> プロンプトで、webapp という名前のデータベースと webuser という名前のユーザーを作成し、そのデータベースに対するすべての権限をユーザーに付与します。

      CREATE DATABASE webapp;
      /* <YourPassword> を強力なパスワードに置き換えます。 */
      CREATE USER 'webuser'@'localhost' IDENTIFIED BY '<YourPassword>';
      GRANT ALL PRIVILEGES ON webapp.* TO 'webuser'@'localhost';
      FLUSH PRIVILEGES;
      EXIT;
    2. データベース接続テストファイルを作成します。
      <YourPassword> を前のステップのユーザーパスワードに置き換えて、コマンドを実行します。

      sudo tee /usr/share/nginx/html/test.php <<-'EOF'
      <?php
      $servername = "localhost";
      $username = "webuser";
      $password = "<YourPassword>";
      $dbname = "webapp";
      // 接続を作成します
      $conn = new mysqli($servername, $username, $password, $dbname);
      // 接続を確認します
      if ($conn->connect_error) {
          die("Database connection failed: " . $conn->connect_error);
      }
      echo "Database connection successful!";
      ?>
      EOF
      • ブラウザで確認しますhttp://<ECS_PUBLIC_IP>/test.php にアクセスします。ページに Database connection successful! が表示された場合、接続は成功です。

      • テストファイルをクリーンアップします。このスクリプトには、データベースの認証情報がプレーンテキストで含まれています。テスト後すぐに削除してください。

よくある質問

ブラウザのタイムアウトまたは「サイトにアクセスできません」

このエラーは通常、ネットワークの問題を示しています。次の順序でトラブルシューティングを行います。

  1. セキュリティグループ:セキュリティグループがポート 80 でのインバウンドトラフィックを許可していることを確認します。

  2. ファイアウォール:OS ファイアウォール (firewalldufw など) がポート 80 でのトラフィックを許可していることを確認します。

  3. Nginx サービスsudo systemctl status nginx を実行して、Nginx が実行されているかどうかを確認します。実行されていない場合は、sudo journalctl -xeu nginx でログを確認します。

  4. ポートの競合:ポート 80 が別のアプリケーションによって占有されているかどうかを確認します。詳細については、「ECS インスタンスのポート接続性の問題のトラブルシューティング」をご参照ください。

ブラウザに「502 Bad Gateway」が表示される

このエラーは、Nginx が PHP-FPM と通信できないことを意味します。

  1. PHP-FPM サービスsudo systemctl status php-fpm (Ubuntu では php8.2-fpm) を実行して、サービスが実行されているかどうかを確認します。

  2. ソケットパスfastcgi_pass ディレクティブの unix: パスが、PHP-FPM 設定の listen パスと一致していることを確認します。

  3. SELinux/AppArmor:CentOS または Alibaba Cloud Linux では、SELinux が Nginx から PHP-FPM への通信をブロックしている可能性があります。sestatus を実行し、/var/log/audit/audit.log で拒否ログを確認します。

  4. ソケットのパーミッション:Nginx ユーザーがソケットファイルへの読み書き権限を持っていることを確認します。

MySQL へのリモートアクセスを有効にする

デフォルトでは、MySQL はリモートログインを禁止しています。有効にするには、root ユーザーの代わりに、専用のリモートアクセスユーザーを作成してください。詳細については、「リモート MySQL アクセス用のユーザーを追加する」をご参照ください。