全部產品
Search
文件中心

Elastic Compute Service:部署LNMP環境

更新時間:Dec 09, 2025

在ECS執行個體上通過包管理器構建LNMP環境,支援 Alibaba Cloud Linux、CentOS 及 Ubuntu 多系統。採用手動部署方式,解決鏡像環境難以定製設定檔的痛點,滿足 WordPress、Magento 等動態網站對底層環境完全控制與安全強化的生產需求。

方案架構

  1. 使用者的瀏覽器通過公網向ECS執行個體80連接埠發起HTTP請求。

  2. 作為Web伺服器,Nginx負責接收並分發請求。如果是靜態資源(如HTML、CSS、圖片),直接讀取並返回;如果是PHP指令碼請求(如.php檔案),則通過FastCGI協議將其轉寄給PHP-FPM處理。

  3. PHP-FPM(FastCGI Process Manager)接收並執行PHP代碼。如果需要與資料庫互動,會串連到MySQL資料庫。

  4. MySQL負責儲存和管理資料,執行PHP指令碼發來的SQL查詢,並將結果返回給PHP-FPM。

  5. PHP-FPM將執行結果產生HTML內容,返回給Nginx,最終由Nginx發送給使用者的瀏覽器。

實施步驟

為保證流暢體驗,建議ECS執行個體記憶體不低於2 GiB。

一、準備工作

配置公網IP與安全性群組以確保執行個體可被外部存取,並更新系統組件以修複潛在安全性漏洞。

  1. 配置公網訪問。

    確保ECS執行個體已指派公網IP或已綁定Elastic IP Address(EIP),以允許公網訪問。具體操作,請參見開通公網

  2. 添加安全性群組允許存取規則。

    在ECS執行個體關聯的安全性群組中添加入方向規則,允許存取 TCP 協議的 80 連接埠(用於HTTP訪問)。具體操作,請參見添加安全性群組規則

  3. 更新系統及軟體包。

    Alibaba Cloud Linux 3 / CentOS 8

    1. 登入ECS執行個體。

      1. 訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。

      2. 進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示登入,進入終端頁面。

    2. 將系統已有的軟體包列表和軟體更新到最新版本。

      sudo dnf update -y

    Alibaba Cloud Linux 2 / CentOS 7

    1. 登入ECS執行個體。

      1. 訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。

      2. 進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示登入,進入終端頁面。

    2. 更新系統及軟體包至最新版本。

      sudo yum update -y

    Ubuntu

    1. 登入ECS執行個體。

      1. 訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。

      2. 進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示登入,進入終端頁面。

    2. 更新系統及軟體包至最新版本。

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

二、安裝並配置Nginx

  1. 添加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 Linux2 / 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 --debian 報錯
    sudo apt install -y nginx
  2. 啟動並設定開機自啟。

    enable --now參數會同時完成啟動服務和設定開機自啟兩個操作。
    sudo systemctl enable --now nginx
  3. 驗證Nginx服務。
    執行curl http://127.0.0.1,如果終端輸出了Nginx的歡迎頁面HTML代碼,說明安裝成功。

三、安裝並加固MySQL

  1. 安裝並啟動MySQL。

    Alibaba Cloud Linux 3 / CentOS 8

    # Alibaba Cloud Linux 3 需要安裝compat-openssl10以相容舊版OpenSSL
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        if [ "$ID" = "alinux" ] && [ "$VERSION_ID" = "3" ]; then
            sudo yum 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 Linux2 / 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. 啟動並設定開機自啟。

    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預設使用免密登入),擷取的密碼用於後續步驟重設密碼。

      # 從日誌中提取並顯示臨時密碼
      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。

四、安裝並配置PHP

安裝PHP、PHP-FPM(用於處理Web請求)以及串連MySQL的向外延展群組件。

  1. 添加PHP源並安裝。

    Alibaba Cloud Linux 3 / CentOS 8

    # 添加PHP源
    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 Key
    rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
    
    # 安裝工具並啟用模組
    dnf install -y yum-utils
    
    # 安裝 PHP
    dnf install -y php php-fpm php-mysqlnd

    Alibaba Cloud Linux2 / CentOS 7

    # 安裝Remi源
    sudo yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    
    # 安裝yum管理工具並啟用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

五、配置Nginx支援PHP解析

預設情況下,Nginx 僅能處理靜態網頁(如 HTML、圖片)。為支援動態網站(如WordPress),需配置Nginx將.php檔案的請求轉寄至PHP-FPM進行處理。否則,訪問PHP頁面時會出現檔案被直接下載或無法顯示的問題。

  1. 備份Nginx設定檔。

    sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
  2. 擷取PHP服務的通訊地址。

    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. 配置Nginx轉寄規則,將.php請求正確轉寄至PHP服務。

    根據上一步的輸出結果,將下方命令中的 <PHP通訊地址> 替換為實際的通訊地址後執行:

    • 若輸出為檔案路徑(如 /run/php-fpm/www.sock):使用的通訊方式為Unix Socket(僅限本地通訊,效能更好且更安全),PHP通訊地址格式為unix:檔案路徑,例如 unix:/run/php-fpm/www.sock

    • 若輸出為 IP:連接埠(如 127.0.0.1:9000):通訊方式為TCP(支援跨主機通訊,適用於PHP-FPM與Nginx分離部署的情境),可以直接作為PHP通訊地址。

    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通訊地址>;
            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

六、驗證LNMP環境

建立測試檔案,驗證Nginx能否解析PHP,以及PHP能否串連到MySQL資料庫,以確保LNMP各組件協同工作正常。

  1. 驗證Nginx解析。

    1. 建立測試檔案:產生一個包含phpinfo() 函數的檔案,用於輸出當前PHP環境的詳細配置。

      echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.php
    2. 瀏覽器驗證:訪問 http://<ECS公網IP>/phpinfo.php

      • 成功標誌:頁面正常渲染並展示PHP環境配置資訊。

      • 失敗標誌:顯示 "File not found" 或直接下載了檔案。

    3. 清理測試檔案:驗證成功後,必須刪除該檔案phpinfo頁麵包含敏感資訊,暴露於公網會帶來安全風險。

  2. 驗證PHP與MySQL的連通性。

    建立一個PHP指令碼,用於測試PHP能否通過mysqlnd擴充串連到資料庫。

    1. 建立資料庫和使用者。
      使用root賬戶登入MySQL(輸入步驟三中設定的root帳號密碼)。

      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("資料庫連接失敗: " . $conn->connect_error);
      }
      echo "資料庫連接成功!";
      ?>
      EOF
      • 瀏覽器驗證:訪問 http://<ECS公網IP>/test.php。當頁面顯示資料庫連接成功!表示測試通過。

      • 清理測試檔案:該指令碼內包含明文的資料庫帳號密碼,測試通過後必須立即刪除,防止憑據泄露。

常見問題

瀏覽器訪問逾時或顯示“無法訪問此網站”

這通常是網路連接問題。請按以下順序排查:

  1. 安全性群組:檢查ECS執行個體的安全性群組入方向規則是否已允許存取80連接埠。

  2. 防火牆:檢查作業系統內部的防火牆(如firewalldufw)是否關閉或已允許存取80連接埠。

  3. Nginx服務:執行sudo systemctl status nginx檢查Nginx服務是否正在運行。如果未運行,查看日誌sudo journalctl -xeu nginx尋找錯誤原因。

  4. 連接埠佔用:檢查80連接埠是否被其他程式佔用。詳細排查方法,請參見能ping通ECS執行個體但連接埠不通的排查方法

瀏覽器顯示“502 Bad Gateway”

此錯誤表示Nginx無法與PHP-FPM正常通訊。

  1. PHP-FPM服務:執行sudo systemctl status php-fpm(或php8.2-fpm)檢查服務是否運行。

  2. Socket路徑:核對Nginx設定檔中fastcgi_pass指令的unix:後面的路徑,是否與PHP-FPM設定檔中的listen路徑完全一致。

  3. SELinux/AppArmor:在CentOS/Alibaba Cloud Linux上,可能是SELinux策略阻止了Nginx與PHP-FPM的通訊。嘗試執行sestatus查看狀態,並檢查/var/log/audit/audit.log中的拒絕日誌。

  4. Socket許可權:檢查Socket檔案的許可權,確保Nginx的運行使用者有權讀寫該檔案。

如何允許MySQL遠端存取?

預設配置下,MySQL禁止遠程登入。如需開啟,建議建立專用的遠端使用者,而不是直接開放root使用者的遠端存取許可權。具體操作,請參見添加遠端存取MySQL使用者