在ECS執行個體上通過包管理器構建LNMP環境,支援 Alibaba Cloud Linux、CentOS 及 Ubuntu 多系統。採用手動部署方式,解決鏡像環境難以定製設定檔的痛點,滿足 WordPress、Magento 等動態網站對底層環境完全控制與安全強化的生產需求。
方案架構
|
實施步驟
為保證流暢體驗,建議ECS執行個體記憶體不低於2 GiB。
一、準備工作
配置公網IP與安全性群組以確保執行個體可被外部存取,並更新系統組件以修複潛在安全性漏洞。
配置公網訪問。
確保ECS執行個體已指派公網IP或已綁定Elastic IP Address(EIP),以允許公網訪問。具體操作,請參見開通公網。
添加安全性群組允許存取規則。
在ECS執行個體關聯的安全性群組中添加入方向規則,允許存取 TCP 協議的 80 連接埠(用於HTTP訪問)。具體操作,請參見添加安全性群組規則。
更新系統及軟體包。
Alibaba Cloud Linux 3 / CentOS 8
登入ECS執行個體。
訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。
進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示登入,進入終端頁面。
將系統已有的軟體包列表和軟體更新到最新版本。
sudo dnf update -y
Alibaba Cloud Linux 2 / CentOS 7
登入ECS執行個體。
訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。
進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示登入,進入終端頁面。
更新系統及軟體包至最新版本。
sudo yum update -y
Ubuntu
登入ECS執行個體。
訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。
進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示登入,進入終端頁面。
更新系統及軟體包至最新版本。
sudo apt update -y && sudo apt upgrade -y
二、安裝並配置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 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 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 --debian 報錯 sudo apt install -y nginx啟動並設定開機自啟。
enable --now參數會同時完成啟動服務和設定開機自啟兩個操作。sudo systemctl enable --now nginx驗證Nginx服務。
執行curl http://127.0.0.1,如果終端輸出了Nginx的歡迎頁面HTML代碼,說明安裝成功。
三、安裝並加固MySQL
安裝並啟動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-serverAlibaba 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-serverUbuntu
# Ubuntu預設源中包含MySQL,直接安裝即可 # Ubuntu 20.04及以上版本預設安裝 MySQL 8.0 # Ubuntu 18.04及以下版本預設安裝 MySQL 5.x。 sudo apt install -y mysql-server啟動並設定開機自啟。
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now mysqldUbuntu
sudo systemctl enable --now mysql設定安全強化。
MySQL預設配置存在安全風險(如允許匿名登入、允許root遠程登入),需運行其內建的安全強化指令碼。
擷取初始root密碼。
僅適用於Alibaba Cloud Linux/CentOS(Ubuntu預設使用免密登入),擷取的密碼用於後續步驟重設密碼。
# 從日誌中提取並顯示臨時密碼 sudo grep 'temporary password' /var/log/mysqld.log運行加固指令碼。
執行命令
sudo mysql_secure_installation,並根據提示完成以下建議配置:重設root帳號密碼:使用上一步擷取的臨時密碼登入並設定新密碼。
建議設定一個包含大小寫字母、數字和特殊符號,且長度不低於12位的強密碼。
移除匿名使用者:輸入Y。
禁止root遠程登入:輸入Y。
刪除測試庫:輸入 Y。
重載許可權表:輸入 Y。
四、安裝並配置PHP
安裝PHP、PHP-FPM(用於處理Web請求)以及串連MySQL的向外延展群組件。
添加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-mysqlndAlibaba 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-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-mysql啟動並設定PHP-FPM開機自啟。
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now php-fpmUbuntu
sudo systemctl enable --now php8.2-fpm
五、配置Nginx支援PHP解析
預設情況下,Nginx 僅能處理靜態網頁(如 HTML、圖片)。為支援動態網站(如WordPress),需配置Nginx將.php檔案的請求轉寄至PHP-FPM進行處理。否則,訪問PHP頁面時會出現檔案被直接下載或無法顯示的問題。
備份Nginx設定檔。
sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak擷取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"配置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檢查設定檔。
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
六、驗證LNMP環境
建立測試檔案,驗證Nginx能否解析PHP,以及PHP能否串連到MySQL資料庫,以確保LNMP各組件協同工作正常。
驗證Nginx解析。
建立測試檔案:產生一個包含
phpinfo()函數的檔案,用於輸出當前PHP環境的詳細配置。echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.php瀏覽器驗證:訪問
http://<ECS公網IP>/phpinfo.php。成功標誌:頁面正常渲染並展示PHP環境配置資訊。
失敗標誌:顯示 "File not found" 或直接下載了檔案。
清理測試檔案:驗證成功後,必須刪除該檔案。
phpinfo頁麵包含敏感資訊,暴露於公網會帶來安全風險。
驗證PHP與MySQL的連通性。
建立一個PHP指令碼,用於測試PHP能否通過mysqlnd擴充串連到資料庫。
建立資料庫和使用者。
使用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;建立資料庫連接測試檔案。
將下面命令中的<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。當頁面顯示資料庫連接成功!表示測試通過。
清理測試檔案:該指令碼內包含明文的資料庫帳號密碼,測試通過後必須立即刪除,防止憑據泄露。
常見問題
瀏覽器訪問逾時或顯示“無法訪問此網站”
這通常是網路連接問題。請按以下順序排查:
安全性群組:檢查ECS執行個體的安全性群組入方向規則是否已允許存取80連接埠。
防火牆:檢查作業系統內部的防火牆(如
firewalld或ufw)是否關閉或已允許存取80連接埠。Nginx服務:執行
sudo systemctl status nginx檢查Nginx服務是否正在運行。如果未運行,查看日誌sudo journalctl -xeu nginx尋找錯誤原因。連接埠佔用:檢查80連接埠是否被其他程式佔用。詳細排查方法,請參見能ping通ECS執行個體但連接埠不通的排查方法。
瀏覽器顯示“502 Bad Gateway”
此錯誤表示Nginx無法與PHP-FPM正常通訊。
PHP-FPM服務:執行
sudo systemctl status php-fpm(或php8.2-fpm)檢查服務是否運行。Socket路徑:核對Nginx設定檔中
fastcgi_pass指令的unix:後面的路徑,是否與PHP-FPM設定檔中的listen路徑完全一致。SELinux/AppArmor:在CentOS/Alibaba Cloud Linux上,可能是SELinux策略阻止了Nginx與PHP-FPM的通訊。嘗試執行
sestatus查看狀態,並檢查/var/log/audit/audit.log中的拒絕日誌。Socket許可權:檢查Socket檔案的許可權,確保Nginx的運行使用者有權讀寫該檔案。
如何允許MySQL遠端存取?
預設配置下,MySQL禁止遠程登入。如需開啟,建議建立專用的遠端使用者,而不是直接開放root使用者的遠端存取許可權。具體操作,請參見添加遠端存取MySQL使用者。