前言
“LAMP”堆棧是一組開源軟件,通常安裝在一起以使服務器能夠託管用 PHP 編寫的動態網站和 Web 應用程序。該術語是一個首字母縮寫詞,代錶帶有A pache 網絡服務器的L inux 操作系統。站點數據存儲在MySQL數據庫中,動態內容由P HP處理。
在本指南中,您將在 Ubuntu 22.04 服務器上設置 LAMP 堆棧。
前置作業
請參考文章
第 1 步 — 安裝 Apache 並更新防火牆
Apache Web 服務器是世界上最流行的 Web 服務器之一。它有據可查,擁有活躍的用戶社區,並且在網絡的大部分歷史中都被廣泛使用,這使其成為託管網站的絕佳選擇。
首先更新包管理器緩存。如果這是您第一次sudo
在此會話中使用,系統將提示您提供用戶密碼以確認您具有管理系統包的正確權限apt
:
sudo apt update
然後,使用以下命令安裝 Apache:
sudo apt install apache2
系統將提示您確認 Apache 的安裝。按 確認Y
,然後ENTER
。
安裝完成後,您需要調整防火牆設置以允許 HTTP 流量。Ubuntu 的默認防火牆配置工具稱為 Uncomplicated Firewall (UFW)。它具有您可以利用的不同應用程序配置文件。要列出所有當前可用的 UFW 應用程序配置文件,請執行此命令:
sudo ufw app list
Output
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
以下是每個配置文件的含義:
- Apache:此配置文件僅打開端口
80
(正常、未加密的 Web 流量)。 - Apache Full:此配置文件同時打開端口
80
(正常、未加密的 Web 流量)和端口443
(TLS/SSL 加密流量)。 - Apache Secure:此配置文件僅打開端口
443
(TLS/SSL 加密流量)。
目前,最好只允許 port 上的連接80
,因為這是全新的 Apache 安裝,並且您還沒有配置 TLS/SSL 證書以允許服務器上的 HTTPS 流量。
要僅允許端口上的流量80
,請使用Apache
配置文件:
sudo ufw allow in "Apache"
使用以下命令驗證更改:
sudo ufw status
現在允許端口上的流量80
通過防火牆。
您可以立即進行抽查,以通過在網絡瀏覽器中訪問服務器的公共 IP 地址來驗證一切是否按計劃進行(如果您沒有此信息,請查看下一個標題下的註釋以了解您的公共 IP 地址是什麼):
▲如果您可以查看此頁面,則您的 Web 服務器已正確安裝並且可以通過防火牆訪問。
第 2 步 — 安裝 MySQL
現在您已經啟動並運行了 Web 服務器,您需要安裝數據庫系統以便能夠為您的站點存儲和管理數據。MySQL 是一種在 PHP 環境中使用的流行數據庫管理系統。
同樣,使用apt
獲取和安裝此軟件:
sudo apt install mysql-server
出現提示時,通過輸入確認安裝Y
,然後輸入ENTER
。
安裝完成後,建議您運行 MySQL 預裝的安全腳本。此腳本將刪除一些不安全的默認設置並鎖定對數據庫系統的訪問。
警告mysql_secure_installation
:自 2022 年 7 月起,如果您在沒有進一步配置的情況下運行腳本,將會發生錯誤。原因是此腳本將嘗試為安裝的根MySQL 帳戶設置密碼,但默認情況下在 Ubuntu 安裝上,此帳戶未配置為使用密碼進行連接。在 2022 年 7 月之前,此腳本會在嘗試設置根帳戶密碼並繼續執行其餘提示後靜默失敗。然而,在撰寫本文時,腳本將在您輸入並確認密碼後返回以下錯誤:
這將導致腳本進入遞歸循環,您只能通過關閉終端窗口才能退出。由於該mysql_secure_installation
腳本執行許多其他操作,這些操作有助於確保 MySQL 安裝安全,因此仍然建議您在開始使用 MySQL 管理數據之前運行它。不過,為避免進入此遞歸循環,您需要首先調整MySQL根用戶的身份驗證方式。首先,打開 MySQL 提示符:
sudo mysql
然後運行以下命令將rootALTER USER
用戶的身份驗證方法更改為使用密碼的身份驗證方法。以下示例將身份驗證方法更改為:mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
進行此更改後,退出 MySQL 提示符:
exit
之後,您可以mysql_secure_installation
毫無問題地運行腳本。
通過運行以下命令啟動交互式腳本:
sudo mysql_secure_installation
這將詢問您是否要配置VALIDATE PASSWORD PLUGIN
.
注意:啟用此功能是一種判斷調用。如果啟用,不符合指定條件的密碼將被 MySQL 拒絕並報錯。禁用驗證是安全的,但您應該始終為數據庫憑據使用強而獨特的密碼。
答Y
是,或任何其他繼續而不啟用。
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:
如果您回答“是”,系統會要求您選擇一個密碼驗證級別。請記住,如果您輸入2
最強級別,則在嘗試設置任何不包含數字、大小寫字母和特殊字符的密碼時,您將收到錯誤消息:
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
無論您是否選擇設置VALIDATE PASSWORD PLUGIN
,您的服務器接下來都會要求您選擇並確認 MySQL root用戶的密碼。不要將其與系統根混淆。數據庫根用戶是對數據庫系統具有完全權限的管理用戶。即使 MySQL root 用戶的默認身份驗證方法不涉及使用密碼,即使設置了密碼,您也應該在此處定義一個強密碼作為額外的安全措施。
如果您啟用了密碼驗證,您將看到您剛剛輸入的 root 密碼的密碼強度,並且您的服務器將詢問您是否要繼續使用該密碼。如果您對當前密碼滿意,請Y
在提示符下輸入“yes”:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
對於其餘的問題,請在每次出現提示時Y
按ENTER
鍵。這將刪除一些匿名用戶和測試數據庫,禁用遠程 root 登錄,並加載這些新規則,以便 MySQL 立即尊重您所做的更改。
完成後,通過鍵入以下內容測試您是否能夠登錄到 MySQL 控制台:
sudo mysql
這將作為管理數據庫用戶root連接到 MySQL 服務器,這是通過sudo
運行此命令時的使用推斷的。下面是一個示例輸出:
Output
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
要退出 MySQL 控制台,請鍵入:exit
請注意,您無需提供密碼即可作為root用戶進行連接,即使您在運行mysql_secure_installation
腳本時已經定義了一個密碼。這是因為管理 MySQL 用戶的默認身份驗證方法unix_socket
不是password
. 儘管這看起來像是一個安全問題,但它使數據庫服務器更加安全,因為唯一允許以root MySQL 用戶身份登錄的用戶是具有 sudo 權限的系統用戶,從控制台或通過以相同權限運行的應用程序連接. 實際上,這意味著您將無法使用管理數據庫根用戶從您的 PHP 應用程序進行連接。為root設置密碼MySQL 帳戶作為一種保護措施,以防默認身份驗證方法從更改unix_socket
為password
.
為了提高安全性,最好為每個數據庫設置具有較少擴展權限的專用用戶帳戶,特別是如果您計劃在服務器上託管多個數據庫。
您的 MySQL 服務器現已安裝並受到保護。接下來,您將安裝 PHP,這是 LAMP 堆棧中的最後一個組件。
第 3 步 — 安裝 PHP
您安裝了 Apache 來提供您的內容,並安裝了 MySQL 來存儲和管理您的數據。PHP 是我們設置的組件,它將處理代碼以向最終用戶顯示動態內容。除了該php
包之外,您還需要php-mysql
一個 PHP 模塊,它允許 PHP 與基於 MySQL 的數據庫進行通信。您還需要libapache2-mod-php
啟用 Apache 來處理 PHP 文件。核心 PHP 包將作為依賴項自動安裝。
要安裝這些包,請運行以下命令:
sudo apt install php libapache2-mod-php php-mysql
安裝完成後,運行以下命令以確認您的 PHP 版本:
php -v
此時,您的 LAMP 堆棧已完全運行,但在使用 PHP 腳本測試您的設置之前,最好設置一個適當的Apache 虛擬主機來保存您網站的文件和文件夾。
第 4 步 — 為您的網站創建虛擬主機
使用 Apache Web 服務器時,您可以創建虛擬主機(類似於 Nginx 中的服務器塊)來封裝配置詳細信息並從一台服務器託管多個域。在本指南中,我們將設置一個名為your_domain的域,但您應該將其替換為您自己的域名。
Ubuntu 22.04 上的 Apache 默認啟用了一個虛擬主機,該虛擬主機配置為提供目錄中的文檔/var/www/html
。雖然這適用於單個站點,但如果您託管多個站點,它可能會變得笨拙。如果客戶端請求與任何其他站點不匹配,我們將在內部為your_domain站點/var/www/html
創建一個目錄結構,而不是修改 ,將其保留為要提供的默認目錄。/var/www
/var/www/html
為your_domain創建目錄,如下所示:
sudo mkdir /var/www/your_domain
接下來,使用環境變量分配目錄的所有權$USER
,這將引用您當前的系統用戶:
sudo chown -R $USER:$USER /var/www/your_domain
sites-available
然後,使用您喜歡的命令行編輯器在 Apache 的目錄中打開一個新的配置文件。在這裡,我們將使用nano
:
sudo nano /etc/apache2/sites-available/your_domain.conf
這將創建一個新的空白文件。使用您自己的域名添加以下基本配置:
<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
ServerAdmin webmaster@localhost
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
完成後保存並關閉文件。如果您正在使用nano
,請依次按CTRL+X
、Y
和ENTER
。
使用此VirtualHost
配置,我們告訴 Apache 用作your_domain
Web根目錄。如果您想在沒有域名的情況下測試 Apache,您可以刪除或註釋掉這些選項,並在每個選項行的開頭添加井號 ( )。/var/www/your_domain
ServerName
ServerAlias
#
現在,使用a2ensite
啟用新的虛擬主機:
sudo a2ensite your_domain
您可能想要禁用隨 Apache 安裝的默認網站。如果您不使用自定義域名,這是必需的,因為在這種情況下,Apache 的默認配置將覆蓋您的虛擬主機。要禁用 Apache 的默認網站,請鍵入:
sudo a2dissite 000-default
要確保您的配置文件不包含語法錯誤,請運行以下命令:
sudo apache2ctl configtest
最後,重新加載 Apache 以使這些更改生效:
sudo systemctl reload apache2
您的新網站現在處於活動狀態,但網絡根目錄仍然是空的。在該位置創建一個文件以測試虛擬主機是否按預期工作:/var/www/your_domainindex.html
sudo nano /var/www/your_domain/index.html
<html>
<head>
<title>your_domain website</title>
</head>
<body>
<h1>Hello World!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>
</body>
</html>
保存並關閉文件,然後轉到瀏覽器並訪問服務器的域名或 IP 地址:
在您設置一個文件index.php
來替換它之前,您可以將此文件保留在適當的位置作為您的應用程序的臨時登錄頁面。執行此操作後,請記住index.html
從文檔根目錄中刪除或重命名文件,因為默認情況下它優先於index.php
文件。
DirectoryIndex
關於 Apache 的注意事項
使用 Apache 上的默認DirectoryIndex
設置,名為的文件index.html
將始終優先於index.php
文件。這對於在 PHP 應用程序中設置維護頁面很有用,方法是創建一個index.html
包含給訪問者的信息性消息的臨時文件。因為此頁面將優先於index.php
頁面,所以它將成為應用程序的登錄頁面。維護結束後,將index.html
重命名或從文檔根目錄中刪除,恢復常規應用程序頁面。
如果您想更改此行為,則需要編輯文件並修改文件在指令中列出的/etc/apache2/mods-enabled/dir.conf
順序:index.phpDirectoryIndex
sudo nano /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
保存並關閉文件後,您需要重新加載 Apache 以使更改生效:
sudo systemctl reload apache2
在下一步中,我們將創建一個 PHP 腳本來測試 PHP 是否已在您的服務器上正確安裝和配置。
第 5 步 — 在您的 Web 服務器上測試 PHP 處理
現在您已經有了一個自定義位置來託管您網站的文件和文件夾,創建一個 PHP 測試腳本以確認 Apache 能夠處理和處理對 PHP 文件的請求。
在您的自定義 Web 根文件夾中創建一個名為的新文件info.php
:
sudo nano /var/www/your_domain/info.php
<?php
phpinfo();
完成後,保存並關閉文件。
要測試此腳本,請轉到 Web 瀏覽器並訪問服務器的域名或 IP 地址,然後是腳本名稱,在本例中為info.php
:
http://server_domain_or_IP/info.php
以下是默認 PHP 網頁的示例:
此頁面從 PHP 的角度提供有關您的服務器的信息。它對於調試和確保正確應用您的設置很有用。
如果您在瀏覽器中看到此頁面,那麼您的 PHP 安裝工作正常。
通過該頁面檢查有關您的 PHP 服務器的相關信息後,最好刪除您創建的文件,因為它包含有關您的 PHP 環境和 Ubuntu 服務器的敏感信息。rm
這樣做:
sudo rm /var/www/your_domain/info.php
如果以後需要再次訪問信息,您可以隨時重新創建此頁面。
第 6 步 — 從 PHP 測試數據庫連接(可選)
結論
在本指南中,您已經構建了一個靈活的基礎來為訪問者提供 PHP 網站和應用程序,使用 Apache 作為 Web 服務器並使用 MySQL 作為數據庫系統。
作為緊接著的下一步,您應該通過 HTTPS 為它們提供服務,以確保與您的 Web 服務器的連接是安全的。為了實現這一點,您可以使用Let’s Encrypt使用免費的 TLS/SSL 證書來保護您的站點。