本番サイト向けに、設定とセキュリティ強化を完全に制御しながら、Elastic Compute Service (ECS) インスタンスに Nginx、MySQL、PHP をインストールします。
ソリューションアーキテクチャ
|
操作手順
少なくとも 2 GiB のメモリを搭載した ECS インスタンスを推奨します。
ステップ 1:インスタンスの準備
パブリックアクセスとセキュリティグループルールを設定し、システムパッケージを更新します。
パブリックアクセスを設定します。
ECS インスタンスにパブリック IP アドレスまたは Elastic IP Address (EIP) があることを確認してください。詳細については、「インスタンスのパブリックアクセスを有効にする」をご参照ください。
セキュリティグループルールを追加します。
ECS インスタンスのセキュリティグループで、ポート 80 での TCP トラフィックを許可するインバウンドルールを追加します。詳細については、「セキュリティグループルールを追加する」をご参照ください。
システムパッケージを更新します。
Alibaba Cloud Linux 3 / CentOS 8
ECS インスタンスにログインします。
ECS コンソール - インスタンスに移動します。上部メニューで、対象のリージョンとリソースグループを選択します。
インスタンスの詳細ページで、接続 をクリックして ワークベンチ を選択します。画面の指示に従ってログインします。
すべてのパッケージを更新します。
sudo dnf update -y
Alibaba Cloud Linux 2 / CentOS 7
ECS インスタンスにログインします。
ECS コンソール - インスタンスに移動します。上部メニューで、対象のリージョンとリソースグループを選択します。
インスタンスの詳細ページで、接続 をクリックして ワークベンチ を選択します。画面の指示に従ってログインします。
すべてのパッケージを更新します。
sudo yum update -y
Ubuntu
ECS インスタンスにログインします。
ECS コンソール - インスタンスに移動します。上部メニューで、対象のリージョンとリソースグループを選択します。
インスタンスの詳細ページで、接続 をクリックして ワークベンチ を選択します。画面の指示に従ってログインします。
すべてのパッケージを更新します。
sudo apt update -y && sudo apt upgrade -y
ステップ 2:Nginx のインストール
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 nginxAlibaba 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 nginxUbuntu
# 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 nginxNginx を起動し、起動時に有効にします。
enable --nowフラグは、サービスを起動し、起動時に有効にします。sudo systemctl enable --now nginxNginx が実行されていることを確認します。
curl http://127.0.0.1を実行します。出力に Nginx のウェルカムページ HTML が含まれている場合、インストールは成功しています。
ステップ 3:MySQL のインストール
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-serverAlibaba 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-serverUbuntu
# デフォルトの Ubuntu リポジトリには MySQL が含まれているため、直接インストールできます。 # Ubuntu 20.04 以降のバージョンでは、デフォルトで MySQL 8.0 がインストールされます。 # Ubuntu 18.04 以前のバージョンでは、デフォルトで MySQL 5.x がインストールされます。 sudo apt install -y mysql-serverMySQL を起動し、起動時に有効にします。
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now mysqldUbuntu
sudo systemctl enable --now mysqlセキュリティ強化を実行します。
デフォルトの MySQL 設定では、匿名ユーザーと root のリモートログインが許可されています。セキュリティスクリプトを実行して、これらの脆弱性を修正します。
root の初期パスワードを取得します。
このステップは、Alibaba Cloud Linux と CentOS にのみ適用されます。Ubuntu では、root ユーザーはデフォルトでソケットベースの認証を使用します。
# ログから一時パスワードを抽出して表示します。 sudo grep 'temporary password' /var/log/mysqld.logセキュリティスクリプトを実行します。
sudo mysql_secure_installationを実行し、プロンプトに従います。root パスワードをリセットします。一時パスワードを使用してログインし、新しいパスワードを設定します。
大文字、小文字、数字、特殊文字を含む、少なくとも 12 文字の強力なパスワードを使用してください。
匿名ユーザーを削除します。Y を入力します。
root のリモートログインを禁止します。Y を入力します。
テストデータベースを削除します。Y を入力します。
権限テーブルを再読み込みします。Y を入力します。
ステップ 4:PHP のインストール
PHP、PHP-FPM、MySQL 拡張機能をインストールします。
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-mysqlndAlibaba 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-mysqlndUbuntu
# 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-mysqlPHP-FPM を起動し、起動時に有効にします。
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now php-fpmUbuntu
sudo systemctl enable --now php8.2-fpm
ステップ 5:PHP を処理するための Nginx の設定
デフォルトでは、Nginx は静的ファイルのみを配信します。.php リクエストを PHP-FPM に転送するように設定します。この設定がないと、PHP ページがダウンロードされるか、エラーが発生します。
デフォルトの Nginx 設定ファイルをバックアップします。
sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bakPHP-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".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設定ファイルをテストします。
sudo nginx -t出力に successful が含まれている場合、設定は正しいです。次のステップに進みます。
出力に failed が含まれている場合、アドレスを正しく置き換えたことを確認するか、バックアップを復元してください。
sudo mv /etc/nginx/conf.d/default.conf.bak /etc/nginx/conf.d/default.conf
新しい設定を適用するために Nginx を再起動します。
sudo systemctl restart nginx
ステップ 6:スタックの検証
Nginx が PHP を処理し、PHP が MySQL に接続することを確認するためのテストファイルを作成します。
Nginx による PHP の処理を検証します。
テストファイルを作成します。
phpinfo()を含むファイルを生成して、PHP 設定を表示します。echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.phpブラウザで確認します。
http://<ECS_PUBLIC_IP>/phpinfo.phpにアクセスします。成功:ページに PHP 環境の詳細が表示されます。
失敗:ページに "File not found" が表示されるか、ブラウザがファイルをダウンロードします。
テストファイルをクリーンアップします。確認後、このファイルを削除してください。
phpinfoページには機密性の高いサーバー情報が含まれています。
PHP から MySQL への接続性を検証します。
mysqlnd 拡張機能を使用してデータベース接続性をテストする PHP スクリプトを作成します。
データベースとユーザーを作成します。
ステップ 3 で設定したrootパスワードを使用して MySQL にログインします。sudo mysql -u root -pmysql>プロンプトで、webappという名前のデータベースとwebuserという名前のユーザーを作成し、そのデータベースに対するすべての権限をユーザーに付与します。CREATE DATABASE webapp; /* <YourPassword> を強力なパスワードに置き換えます。 */ CREATE USER 'webuser'@'localhost' IDENTIFIED BY '<YourPassword>'; GRANT ALL PRIVILEGES ON webapp.* TO 'webuser'@'localhost'; FLUSH PRIVILEGES; EXIT;データベース接続テストファイルを作成します。
<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! が表示された場合、接続は成功です。テストファイルをクリーンアップします。このスクリプトには、データベースの認証情報がプレーンテキストで含まれています。テスト後すぐに削除してください。
よくある質問
ブラウザのタイムアウトまたは「サイトにアクセスできません」
このエラーは通常、ネットワークの問題を示しています。次の順序でトラブルシューティングを行います。
セキュリティグループ:セキュリティグループがポート 80 でのインバウンドトラフィックを許可していることを確認します。
ファイアウォール:OS ファイアウォール (
firewalldやufwなど) がポート 80 でのトラフィックを許可していることを確認します。Nginx サービス:
sudo systemctl status nginxを実行して、Nginx が実行されているかどうかを確認します。実行されていない場合は、sudo journalctl -xeu nginxでログを確認します。ポートの競合:ポート 80 が別のアプリケーションによって占有されているかどうかを確認します。詳細については、「ECS インスタンスのポート接続性の問題のトラブルシューティング」をご参照ください。
ブラウザに「502 Bad Gateway」が表示される
このエラーは、Nginx が PHP-FPM と通信できないことを意味します。
PHP-FPM サービス:
sudo systemctl status php-fpm(Ubuntu ではphp8.2-fpm) を実行して、サービスが実行されているかどうかを確認します。ソケットパス:
fastcgi_passディレクティブのunix:パスが、PHP-FPM 設定のlistenパスと一致していることを確認します。SELinux/AppArmor:CentOS または Alibaba Cloud Linux では、SELinux が Nginx から PHP-FPM への通信をブロックしている可能性があります。
sestatusを実行し、/var/log/audit/audit.logで拒否ログを確認します。ソケットのパーミッション:Nginx ユーザーがソケットファイルへの読み書き権限を持っていることを確認します。
MySQL へのリモートアクセスを有効にする
デフォルトでは、MySQL はリモートログインを禁止しています。有効にするには、root ユーザーの代わりに、専用のリモートアクセスユーザーを作成してください。詳細については、「リモート MySQL アクセス用のユーザーを追加する」をご参照ください。