LNMP是目前主流的網站伺服器架構之一,適合運行大型和高並發的網站應用程式,例如電子商務網站、社交網路、內容管理系統等。LNMP分別代表Linux、Nginx、MySQL和PHP。本文介紹如何在Alibaba Cloud Linux 3/2、CentOS 7/8作業系統的ECS執行個體上搭建LNMP環境。
部署環境的執行個體要求
手動部署LNMP環境時,已有或建立的ECS執行個體必須滿足以下條件:
執行個體規格的記憶體建議不小於4 GiB。
執行個體已指派公網IP地址或綁定Elastic IP Address(EIP),具體操作,請參見為ECS執行個體開通公網。
作業系統必須為Alibaba Cloud Linux 3/2、CentOS 7/8,建議使用Alibaba Cloud Linux 3。
執行個體安全性群組的入方向規則已允許存取22、80、443連接埠。具體操作,請參見添加安全性群組規則。
重要基於伺服器資料安全考慮,本文僅說明部署與測試LNMP環境所必須允許存取的連接埠,您可以根據實際需求,允許存取其他應用所需的連接埠號碼。例如,遠端連線MySQL資料庫時,需要允許存取MySQL預設佔用的3306連接埠。
Alibaba Cloud Linux 2、CentOS 7/8已完全停止維護(EOL),因此,如果您選擇建立ECS執行個體以部署LNMP,建議使用Alibaba Cloud Linux 3鏡像來建立ECS執行個體並部署LNMP。
操作步驟
Alibaba Cloud Linux 3/2、CentOS 7.x
本文的樣本步驟中,使用的軟體版本資訊如下所述。當您使用不同的軟體版本時,需要根據實際情況自行調整命令和參數配置。
Nginx版本:Nginx 1.20.1
MySQL版本:MySQL 8.0.39
PHP版本:PHP 8.0.30
步驟一:關閉防火牆和SELinux
為避免因使用管理員權限不當造成不可預期的風險,建議您使用普通使用者操作。如果普通使用者沒有sudo許可權,具體操作,請參見如何為普通使用者添加sudo許可權。
遠端連線需要部署LNMP環境的ECS執行個體。
具體操作,請參見ECS遠端連線方式概述。
關閉防火牆。
運行以下命令,查看當前防火牆的狀態。
sudo systemctl status firewalld
關閉防火牆。
臨時關閉防火牆:
sudo systemctl stop firewalld
說明臨時關閉防火牆後,如果Linux執行個體重啟,則防火牆將會自動開啟。
永久關閉防火牆:
關閉防火牆。
sudo systemctl stop firewalld
執行個體開機時,禁止啟動防火牆服務。
sudo systemctl disable firewalld
說明如果您想重新開啟防火牆,請參見firewalld官網資訊。
關閉SELinux。
運行以下命令,查看SELinux的目前狀態。
sudo getenforce
如果SELinux狀態參數是
Disabled
,則SELinux為關閉狀態,請執行步驟二:安裝Nginx。如果SELinux狀態參數是
Enforcing
,則SELinux為開啟狀態,請執行步驟3.b。
關閉SELinux。
SELinux關閉的方式分為臨時關閉和永久關閉,請您根據自身業務需求進行選擇。具體操作,請參見開啟或關閉SELinux。
步驟二:安裝Nginx
本文只提供一個版本的Nginx作為樣本,如果您需要安裝其他版本的Nginx,請參見常見問題。
運行以下命令,安裝Nginx。
sudo yum -y install nginx
運行以下命令,查看Nginx版本。
nginx -v
返回結果類似如下所示,表示Nginx安裝成功。
nginx version: nginx/1.20.1
步驟三:安裝並配置MySQL
安裝MySQL
當ECS執行個體作業系統為Alibaba Cloud Linux 3,需安裝MySQL依賴包。
sudo yum install compat-openssl10
運行以下命令,更新YUM源。
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
運行以下命令,安裝MySQL。
sudo yum -y install mysql-community-server
運行以下命令,查看MySQL版本號碼。
mysql -V
返回結果如下所示,表示MySQL安裝成功。
mysql Ver 8.0.36 for Linux on x86_64 (MySQL Community Server - GPL)
運行以下命令,啟動MySQL。
sudo systemctl start mysqld
依次運行以下命令,設定開機啟動MySQL。
sudo systemctl enable mysqld sudo systemctl daemon-reload
配置MySQL
運行以下命令,查看
/var/log/mysqld.log
檔案,擷取並記錄root使用者的初始密碼。sudo grep 'temporary password' /var/log/mysqld.log
命令列返回結果如下,其中
ARQTRy3+****
為MySQL的初始密碼。在下一步重設root使用者密碼時,會使用該初始密碼。2021-11-10T07:01:26.595215Z 1 [Note] A temporary password is generated for root@localhost: ARQTRy3+****
運行以下命令,配置MySQL的安全性。
sudo mysql_secure_installation
輸入MySQL的初始密碼。
說明在輸入密碼時,系統為了最大限度地保證資料安全,命令列將不做任何回顯。您只需要輸入正確的密碼資訊,然後按Enter鍵即可。
Securing the MySQL server deployment. Enter password for user root: #輸入上一步擷取的root使用者初始密碼
設定MySQL的新密碼。
The existing password for the user account root has expired. Please set a new password. New password: #輸入新密碼。長度為8至30個字元,必須同時包含大小寫英文字母、數字和特殊符號。特殊符號包含()` ~!@#$%^&*-+=|{}[]:;‘<>,.?/ Re-enter new password: #確認新密碼。 The 'validate_password' plugin is installed on the server. The subsequent steps will run with the existing configuration of the plugin. Using existing password for root. Estimated strength of the password: 100 #返回結果包含您設定的密碼強度。 Change the password for root ? (Press y|Y for Yes, any other key for No) :Y #您需要輸入Y以確認使用新密碼。 #新密碼設定完成後,需要再次驗證新密碼。 New password:#再次輸入新密碼。 Re-enter new password:#再次確認新密碼。 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,再次確認使用新密碼。
輸入Y刪除匿名使用者。
Remove anonymous users? (Press y|Y for Yes, any other key for No) :Y Success.
輸入Y禁止使用root使用者遠程登入MySQL。
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :Y Success.
輸入Y刪除test庫以及使用者對test庫的存取權限。
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :Y - Dropping test database... Success. - Removing privileges on test database... Success.
輸入Y重新載入授權表。
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :Y Success. All done!
更多資訊,請參見MySQL文檔。
步驟四:安裝並配置PHP
安裝PHP
安裝PHP。
Alibaba Cloud Linux 3
運行以下命令,更新YUM源。
sudo rpm -Uvh https://mirrors.aliyun.com/remi/enterprise/remi-release-8.rpm --nodeps
運行以下命令,啟用
php:remi-8.0
模組流。sudo yum module enable -y php:remi-8.0
運行以下命令,安裝PHP。
sudo yum install -y php php-cli php-fpm php-common php-mysqlnd php-gd php-mbstring php-xml
Alibaba Cloud Linux 2
運行以下命令,更新YUM源。
sudo rpm -Uvh https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm
運行以下命令,修改
yum-plugin-releasever-adapter
外掛程式配置以支援remi
源適配Alibaba Cloud Linux 2。sudo echo ", remi-php54.repo, remi-php71.repo, remi-php73.repo, remi-php80.repo, remi-php82.repo, remi.repo, epel.repo, remi-modular.repo, remi-php70.repo, remi-php72.repo, remi-php74.repo, remi-php81.repo, remi-php83.repo, remi-safe.repo" >> /etc/yum/pluginconf.d/releasever-adapter.conf
運行以下命令,啟用PHP 8.0倉庫。
sudo sed -i '1,10s/enabled=0/enabled=1/' /etc/yum.repos.d/remi-php80.repo
運行以下命令,安裝PHP。
sudo yum install -y php php-cli php-fpm php-common php-mysqlnd php-gd php-mbstring
CentOS 7.x
更新YUM源。
運行以下命令,安裝EPEL源和Remi倉庫。
sudo yum install -y epel-release sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
運行以下命令,啟用PHP 8.0倉庫。
sudo yum install -y yum-utils sudo yum-config-manager --enable remi-php80
運行以下命令,安裝PHP。
sudo yum install -y php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json
運行以下命令,查看PHP版本。
php -v
返回結果如下所示,表示安裝成功。
PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.30, Copyright (c) Zend Technologies
修改Nginx設定檔以支援PHP
運行以下命令,備份Nginx設定檔。
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
修改Nginx設定檔,添加Nginx對PHP的支援。
重要若不添加此配置資訊,後續您使用瀏覽器訪問PHP頁面時,頁面將無法顯示。
運行以下命令,開啟Nginx設定檔。
sudo vim /etc/nginx/nginx.conf
按
i
進入編輯模式。在
server
大括弧內,修改或添加下列配置資訊。除下面提及的需要添加或修改的配置資訊外,其他配置保持預設值即可。
添加或修改
location /
配置資訊。location / { index index.php index.html index.htm; }
添加或修改
location ~ .php$
配置資訊。#添加下列資訊,配置Nginx通過fastcgi方式處理您的PHP請求。 location ~ .php$ { root /usr/share/nginx/html; #將/usr/share/nginx/html替換為您的網站根目錄,本文使用/usr/share/nginx/html作為網站根目錄。 fastcgi_pass 127.0.0.1:9000; #Nginx通過原生9000連接埠將PHP請求轉寄給PHP-FPM進行處理。 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; #Nginx調用fastcgi介面處理PHP請求。 }
添加或修改配置資訊後,檔案內容如下圖所示:
按
Esc
鍵,輸入:wq
,按Enter
鍵關閉並儲存設定檔。
運行以下命令,啟動Nginx服務。
sudo systemctl start nginx
運行以下命令,設定Nginx服務開機自啟動。
sudo systemctl enable nginx
配置PHP
建立並編輯
phpinfo.php
檔案,用於展示PHP資訊。運行以下命令,建立
phpinfo.php
檔案。sudo vim <網站根目錄>/phpinfo.php
<網站根目錄>是您在
nginx.conf
設定檔中location ~ .php$
大括弧內,配置的root
參數值,如下圖所示。本文配置的網站根目錄為/usr/share/nginx/html
,因此需要運行以下命令建立phpinfo.php
檔案:sudo vim /usr/share/nginx/html/phpinfo.php
按
i
進入編輯模式。輸入下列內容,函數
phpinfo()
會展示PHP的所有配置資訊。<?php echo phpinfo(); ?>
按
Esc
鍵後,輸入:wq
並斷行符號,儲存關閉設定檔。
運行以下命令,啟動PHP-FPM。
sudo systemctl start php-fpm
運行以下命令,設定PHP-FPM開機自啟動。
sudo systemctl enable php-fpm
步驟五:測試訪問LNMP配置資訊頁面
在本地Windows主機或其他具有公網訪問能力的Windows主機中,開啟瀏覽器。
在瀏覽器的地址欄輸入
http://<ECS執行個體公網IP地址>/phpinfo.php
進行訪問。訪問結果如下圖所示,表示LNMP環境部署成功。
CentOS 8.x
本文的樣本步驟中,使用的軟體版本資訊如下所述。當您使用不同的軟體版本時,需要根據實際情況自行調整命令和參數配置。
Nginx版本:Nginx 1.20.1
MySQL版本:MySQL 8.0.26
PHP版本:PHP 7.4.19
步驟一:關閉防火牆和SELinux
為避免因使用管理員權限不當造成不可預期的風險,建議您使用普通使用者操作。如果普通使用者沒有sudo許可權,具體操作,請參見如何為普通使用者添加sudo許可權。
遠端連線需要部署LNMP環境的ECS執行個體。
具體操作,請參見ECS遠端連線方式概述。
關閉防火牆。
運行以下命令,查看當前防火牆的狀態。
systemctl status firewalld
關閉防火牆。
臨時關閉防火牆:
sudo systemctl stop firewalld
說明臨時關閉防火牆後,如果Linux執行個體重啟,則防火牆將會自動開啟。
永久關閉防火牆:
關閉防火牆。
sudo systemctl stop firewalld
執行個體開機時,禁止啟動防火牆服務。
sudo systemctl disable firewalld
說明如果您想重新開啟防火牆,請參見firewalld官網資訊。
關閉SELinux。
運行以下命令,查看SELinux的目前狀態。
getenforce
如果SELinux狀態參數是
Disabled
,則SELinux為關閉狀態,請執行步驟二:安裝Nginx。如果SELinux狀態參數是
Enforcing
,則SELinux為開啟狀態,請執行步驟3.b。
關閉SELinux。
SELinux關閉的方式分為臨時關閉和永久關閉,請您根據自身業務需求進行選擇。具體操作,請參見開啟或關閉SELinux。
步驟二:安裝Nginx
請確保您的執行個體具有訪問公網的能力。
切換CentOS 8源地址。
CentOS 8作業系統版本結束了生命週期(EOL),按照社區規則,CentOS 8的源地址http://mirror.centos.org/centos/8/內容已移除,您在阿里雲上繼續使用預設配置的CentOS 8的源會發生報錯。如果您需要使用CentOS 8系統中的一些安裝包,則需要手動切換源地址。具體操作,請參見CentOS 8 EOL如何切換源?。
運行以下命令安裝Nginx。
本教程將選用Nginx 1.20.1版本。
說明您可以訪問Nginx官方安裝包擷取適用於CentOS 8系統的多版本的Nginx安裝包。
sudo dnf -y install https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.20.1-1.el8.ngx.x86_64.rpm
運行以下命令,查看Nginx版本。
nginx -v
查看版本結果如下所示。
nginx version: nginx/1.20.1
步驟三:安裝MySQL
運行以下命令,安裝MySQL。
sudo dnf -y install @mysql
運行以下命令,查看MySQL版本。
mysql -V
查看版本結果如下所示。
mysql Ver 8.0.26 for Linux on x86_64 (Source distribution)
步驟四:安裝PHP
運行以下命令,添加並更新epel源。
sudo dnf -y install epel-release sudo dnf -y update epel-release
運行以下命令,刪除緩衝的無用軟體包並更新軟體源。
sudo dnf clean all sudo dnf makecache
啟用
php:7.4
模組。說明本樣本使用
php:7.4
版本。如果您需要使用PHP 8.0
或PHP 8.2
版本,需要使用CentOS Stream作業系統。sudo dnf module enable php:7.4
運行以下命令,安裝PHP相應的模組。
sudo dnf -y install php php-curl php-dom php-exif php-fileinfo php-fpm php-gd php-hash php-json php-mbstring php-mysqli php-openssl php-pcre php-xml libsodium
運行以下命令查看PHP版本。
php -v
查看版本結果如下所示。
PHP 7.4.19 (cli) (built: May 4 2021 11:06:37) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.19, Copyright (c), by Zend Technologies
步驟五:配置Nginx
運行以下命令,查看並記錄Nginx設定檔的預設路徑。
cat /etc/nginx/nginx.conf
在
http
大括弧內,查看include
配置項。即設定檔的預設路徑。在設定檔的預設路徑下,備份預設設定檔。
cd /etc/nginx/conf.d sudo cp default.conf default.conf.bak
修改預設設定檔。
運行以下命令開啟預設設定檔。
sudo vim default.conf
按
i
進入編輯模式。在
location
大括弧內,修改以下內容。location / { #將該路徑替換為您的網站根目錄。 root /usr/share/nginx/html; #添加預設首頁資訊index.php。 index index.html index.htm index.php; }
去掉被注釋的
location ~ \.php$
大括弧內容前的#
,並修改大括弧的內容。修改完成如下所示。
location ~ \.php$ { #將該路徑替換為您的網站根目錄。 root /usr/share/nginx/html; #Nginx通過unix通訊端與PHP-FPM建立聯絡,該配置與/etc/php-fpm.d/www.conf檔案內的listen配置一致。 fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; #將/scripts$fastcgi_script_name修改為$document_root$fastcgi_script_name。 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #Nginx調用fastcgi介面處理PHP請求。 include fastcgi_params; }
說明Nginx與PHP-FPM處理序間通訊方式有兩種。
TCP Socket:該方式能夠通過網路,可用於跨伺服器通訊的情境。
UNIX Domain Socket:該方式不能通過網路,只能用於同一伺服器中通訊的情境。
按下
Esc
鍵,並輸入:wq
儲存退出檔案。
運行以下命令,啟動Nginx服務。
sudo systemctl start nginx
運行以下命令,設定Nginx服務開機自啟動。
sudo systemctl enable nginx
步驟六:配置MySQL
運行以下命令啟動MySQL,並設定為開機自啟動。
sudo systemctl enable --now mysqld
運行以下命令,查看MySQL是否已啟動。
sudo systemctl status mysqld
查看返回結果中
Active: active (running)
表示已啟動。運行以下命令,執行MySQL安全性操作並設定密碼。
sudo mysql_secure_installation
命令運行後,根據命令列提示執行如下操作。
輸入Y並斷行符號開始相關配置。
選擇密碼驗證策略強度,輸入2並斷行符號。
策略0表示低,1表示中,2表示高。建議您選擇高強度的密碼驗證策略。
設定MySQL的新密碼並確認。
本樣本設定密碼
PASSword123!
。輸入Y並斷行符號繼續使用提供的密碼。
輸入Y並斷行符號移除匿名使用者。
設定是否允許遠端連線MySQL。
不需要遠端連線時,輸入Y並斷行符號。
需要遠端連線時,輸入N或其他任意非Y的按鍵,並斷行符號。
輸入Y並斷行符號刪除
test
庫以及對test
庫的存取權限。輸入Y並斷行符號重新載入授權表。
步驟七:配置PHP
修改PHP設定檔。
運行以下命令,開啟設定檔。
sudo vim /etc/php-fpm.d/www.conf
按
i
進入編輯模式。找到
user = apache
和group = apache
,將apache
修改為nginx
。按下
Esc
鍵,並輸入:wq
儲存退出檔案。
建立並編輯
phpinfo.php
檔案,用於展示PHP資訊。運行以下命令,建立
phpinfo.php
檔案。sudo vim <網站根目錄>/phpinfo.php
<網站根目錄>是您在
nginx.conf
設定檔中location ~ .php$
大括弧內,配置的root
參數值,如下圖所示。本文配置的網站根目錄為/usr/share/nginx/html
,因此需要運行以下命令建立phpinfo.php
檔案:sudo vim /usr/share/nginx/html/phpinfo.php
按
i
進入編輯模式。輸入下列內容,函數
phpinfo()
會展示PHP的所有配置資訊。<?php echo phpinfo(); ?>
按
Esc
鍵後,輸入:wq
並斷行符號,儲存關閉設定檔。
運行以下命令,啟動
PHP-FPM
。sudo systemctl start php-fpm
運行以下命令,設定
PHP-FPM
開機自啟動。sudo systemctl enable php-fpm
步驟八:測試訪問LNMP平台
在本地物理機上開啟瀏覽器。
在地址欄輸入
http://<ECS執行個體公網IP地址>/phpinfo.php
。返回結果如下圖所示,表示LNMP環境部署成功。
後續步驟
測試訪問LNMP配置資訊頁面後,建議您運行以下命令將phpinfo.php
檔案刪除,消除資料泄露風險。
sudo rm -rf <網站根目錄>/phpinfo.php
其中,<網站根目錄>需要替換為您在nginx.conf
中配置的網站根目錄。
本文配置的網站根目錄為/usr/share/nginx/html
,因此需要運行以下命令:
sudo rm -rf /usr/share/nginx/html/phpinfo.php
常見問題
問題一:如何使用其他版本的Nginx伺服器?
使用瀏覽器訪問Nginx開源社區擷取對應的Nginx版本的下載連結。
請根據您的個人需求,選擇對應的Nginx版本。本章節以Nginx 1.22.1為例。
遠端連線需要部署LNMP環境的ECS執行個體。
具體操作,請參見使用VNC登入執行個體。
運行以下命令,安裝Nginx相關依賴。
sudo yum install -y gcc-c++ sudo yum install -y pcre pcre-devel sudo yum install -y zlib zlib-devel sudo yum install -y openssl openssl-devel
運行
wget
命令下載Nginx 1.22.1。您可以通過Nginx開源社區直接擷取對應版本的安裝包URL,然後通過
wget URL
的方式將Nginx安裝包下載至ECS執行個體。例如,Nginx 1.22.1的下載命令如下:sudo wget http://nginx.org/download/nginx-1.22.1.tar.gz
運行以下命令,解壓Nginx 1.22.1安裝包,然後進入Nginx所在的檔案夾。
sudo tar zxvf nginx-1.22.1.tar.gz cd nginx-1.22.1
依次運行以下命令,編譯源碼。
sudo ./configure \ --user=nobody \ --group=nobody \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_realip_module \ --with-http_sub_module \ --with-http_ssl_module
sudo make && make install
運行以下命令,進入Nginx的
sbin
目錄,然後啟動Nginx。cd /usr/local/nginx/sbin/ sudo ./nginx
在本地主機中,使用瀏覽器訪問
ECS執行個體公網IP
。出現如下圖所示的頁面,表示Nginx已成功安裝並啟動。
問題二:如何為普通使用者添加sudo許可權?
使用
root
使用者遠端連線Linux伺服器。具體操作,請參見使用VNC登入執行個體。
運行以下命令,建立一個普通使用者
test
並設定密碼。useradd test passwd test
運行以下命令,為
/etc/sudoers
檔案賦予許可權。chmod 750 /etc/sudoers
運行以下命令,編輯
/etc/sudoers
檔案。vim /etc/sudoers
按
i
鍵進入編輯模式並添加以下配置:test ALL=(ALL) NOPASSWD: ALL
輸入:wq,儲存並退出檔案。
運行以下命令,切換到
test
使用者。su - test
運行以下命令,測試
sudo
許可權。sudo cat /etc/redhat-release
如果回顯資訊類似如下所示,表示
sudo
許可權已經添加成功。[test@iZbp1dqulfhozse3jbp**** ~]$ sudo cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)