跳到主要內容

Ubuntu22.04分拆安裝(Apache / PHP / MySQL/ phpMyAdmin)的方法

為了應對越來越頻繁的資安通報,解決方案就是用PPA各別安裝Apache / PHP / MySQL/  phpMyAdmin套件,這樣如果遇到資安通報可立即升級修補漏洞,確保系統安全,晚上也好睡覺,以下是分拆安裝(Apache / PHP / MySQL/  phpMyAdmin)的安裝方法步驟說明:

步驟1. 安裝Apache/PHP

為了取得Apache官網最新版本及PHP最新版本,這裡使用 Ondřej Surý 的 PPA套件

※輸入以下指令下載PPA套件

sudo apt update

sudo apt install -y software-properties-common

sudo add-apt-repository -y ppa:ondrej/apache2 

sudo add-apt-repository -y ppa:ondrej/php


※安裝 Apache 2.4.63(包含 OpenSSL)

sudo apt install -y apache2 apache2-utils ssl-cert openssl


※確認 Apache 版本及是否安裝

apache2 -v

應該會顯示:

Server version: Apache/2.4.63 (Ubuntu)

Server built:   (日期資訊)


※啟動並設定開機自動啟動 Apache

sudo systemctl enable apache2

sudo systemctl start apache2


接下來安裝PHP套件及設定

※安裝 PHP 8.3 及所需的擴充功能

sudo apt install -y php8.3 libapache2-mod-php8.3 php8.3-cli php8.3-common \
php8.3-curl php8.3-gd php8.3-mbstring php8.3-mysql php8.3-sqlite3 \
php8.3-xml php8.3-zip php8.3-intl php8.3-bcmath php8.3-imagick

※確認 PHP 版本

php -v

如果返回
PHP 8.3.x (cli) (built: ...) Copyright (c) The PHP Group
表示有正確安裝PPA提供的PHP8.3套件,
反之若回
PHP 8.1.x (cli) (built: ...) Copyright (c) The PHP Group
表示未正確啟用PPA的PHP套件,而是使用Ubuntu22.04內建的PHP

※解決方案-清除暫存重新安裝
※強制刷新套件列表
sudo apt update && sudo apt upgrade

※然後檢查 PHP 8.3 是否可用:
apt-cache policy php8.3

※如果仍然只顯示 PHP 8.1,請手動清理快取:
sudo apt clean
sudo apt update

※然後再試一次:
apt-cache search php8.3

※再次確認 PHP 8.3 版本

php -v

如果返回

PHP 8.3.17 (cli) (built: Feb 15 2025 09:09:01) (NTS)

Copyright (c) The PHP Group

Zend Engine v4.3.17, Copyright (c) Zend Technologies

with Zend OPcache v8.3.17, Copyright (c), by Zend Technologies

這樣就有安裝PPA提供的PHP8.3了,不是Ubuntu內建的PHP

備註: 檢查常用模組是否啟用,若未啟用則手動啟用,如模組功能有用到imagick套件,檢查imagick是否有啟用!

sudo phpenmod curl mbstring mysqli pdo pdo_mysql exif gd gettext fileinfo openssl

重啟範例:
sudo apt install --reinstall php8.3-模組名稱
sudo phpenmod 模組名稱
sudo systemctl restart apache2

# 重啟 Apache

sudo systemctl restart apache2

※最後是在 Ubuntu 22.04 上啟用 PHP cURL 並配置 curl.cainfo,讓cURL函數能正成常運作

1. 更新套件清單、安裝基礎元件(curl、憑證庫)

sudo apt update

sudo apt install -y curl libcurl4-openssl-dev ca-certificates


2. 安裝 PHP + Apache 專用 cURL 模組(針對 PHP 8.3)

sudo apt install -y php8.3-curl


3.啟用 PHP curl 模組(Apache 會用這個版本)

sudo phpenmod curl


4. 下載最新憑證庫 cacert.pem 並放入指定資料夾

sudo wget https://curl.se/ca/cacert.pem -O /usr/local/share/ca-certificates/cacert.pem


5.修改 php.ini 配置,位置應該在/etc/php/8.3/apache2/php.ini,或是可透過phpinfo();查詢php.ini路徑,用筆記本打開編輯,找到curl.cainfo,取消前面的#註解,加上cacert.pem路徑

curl.cainfo = "/usr/local/share/ca-certificates/cacert.pem"

⚠️ 注意

  • 請務必移除前面的分號(;),否則設定不會生效

  • 確保是編輯 Apache 使用的 php.ini(不是 /cli/


6.更新系統的 CA 證書讓系統能識別新添加的證書檔案:

sudo update-ca-certificates

執行後若看到:0 added, 0 removed 也沒關係,因為我們用的是 curl 自訂路徑,不影響。

7.重啟 Apache

sudo systemctl restart apache2

8.驗證是否成功(最關鍵!)

建立一個 phpinfo.php 放在網站根目錄,內容如下:

<?php phpinfo(); ?>

在瀏覽器開啟 http://yourdomain/phpinfo.php,確認:

出現 cURL support => enabled

出現 curl.cainfo => /usr/local/share/ca-certificates/cacert.pem

最後還需要修改php.ini的upload_max_filesize及post_max_size與其他參數,不然原生的預設值只有2MB,現在隨便一張圖都幾百MB了,要改大一點才不會上傳失敗

先去http://yourdomain/phpinfo.php搜尋php.ini,找到目錄位置,用筆記本打開

將以下值參全部修改

upload_max_filesize = 2000M
post_max_size = 2000M
max_execution_time = 600
memory_limit = 4G
max_input_time = 600
max_file_uploads = 500


如果還想要更穩定的PHP上傳環境~不要跟系統共用/tmp資料夾,可以指定upload_tmp_dir路徑,方法如下

1. 建立專屬的暫存資料夾
sudo mkdir -p /var/www/html/uploads/php_tmp
sudo chmod 777 /var/www/html/uploads/php_tmp

2. 修改 PHP 設定 php.ini,路徑因該在
/etc/php/8.3/apache2/php.ini

搜尋 ;upload_tmp_dir修改為upload_tmp_dir = /var/www/html/uploads/php_tmp

儲存後,重啟Apache

sudo systemctl restart apache2

然後瀏覽器打開,搜尋 upload_tmp_dir,應該會看到:
upload_tmp_dir  /var/www/html/uploads/php_tmp  /var/www/html/uploads/php_tmp

這樣就算有超大圖檔都不會爆掉



以上流程到這裡為止Apache 及PHP的安裝就都全部完成了,可以在WWW根目錄中置入phpinfo.php,編輯內容貼上

<?php
phpinfo();
?> 

儲存後於網址輸入https://www.Your_website.com/phpinfo.php 
就能觀看Apach資訊及啟用中的PHP套件




這樣整個伺服器建置進度就有50%了,接下來要安裝MySQL/  phpMyAdmin,由於PPA未提供相關套件,所以我們使用Ubuntu22.04內建的MySQL /  phpMyAdmin套件

步驟2.安裝MYSQL

※設置 MySQL-啟用 MySQL 並設置密碼

sudo apt update
sudo apt install mysql-server

※啟動 MySQL 服務 如果 MySQL 已經安裝,但未啟動,可以使用以下命令啟動:
sudo systemctl start mysql


※為了確保 MySQL 會在系統啟動時自動啟動,執行以下指令:
sudo systemctl enable mysql


※設定 MySQL root 密碼 接下來,我們需要設置 root 用戶的密碼。執行:
sudo mysql_secure_installation

會要求您輸入 root 密碼及安全設置,鍵盤Enter到底即可


步驟3.安裝和啟用 phpMyAdmin

※執行以下命令來安裝 phpMyAdmin:
sudo apt install phpmyadmin

在安裝過程中,系統會提示選擇 Web 伺服器。請選擇 apache2,並按 Enter 確認。

配置 phpMyAdmin 與 MySQL 整合 在安裝過程中,會提示是否配置 phpMyAdmin 與 MySQL 整合。選擇 "Yes" 並設置一個 phpMyAdmin 的密碼。

※啟用 PHP 與 phpMyAdmin 相關擴展 安裝 phpMyAdmin 後,啟用 Apache 模組並重新啟動服務:
sudo phpenmod mbstring
sudo systemctl restart apache2

※設定 Apache 訪問phpMyAdmin 權限
sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

※重啟 Apache 使更改生效
sudo systemctl restart apache2


※完成以上步驟了,就可以測試訪問 phpMyAdmin,路徑如下

https://www.Your_website.com/phpmyadmin

如果phpMyAdmin沒有跑起來,可能原因是mysqli及mbstring套件沒安裝或沒跑起來,重新安裝即可顯示登入頁面

sudo apt install --reinstall php8.3-mysqli
sudo phpenmod mysqli
sudo systemctl restart apache2

sudo apt install --reinstall php8.3-mbstring
sudo phpenmod mbstring
sudo systemctl restart apache2


如果套件都正常運作,會顯示phpmyadmin登入畫面


如無意外,輸入密碼因該也是登不進去,需要另外設定用戶的認證方法及密碼

※輸入以下指令先登入mysql

sudo mysql -u root -p  

※會看到auth_socket屬性

SELECT user,plugin,host FROM mysql.user WHERE user = 'root';  

※改成你要登入phpmyadmin root 的密碼 (修改your pass)

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your pass'; 


FLUSH PRIVILEGES;
exit;

說明:使用 ALTER USER 修改 MySQL root 用戶的認證方法,將 auth_socket 改為 mysql_native_password,這樣可以使用密碼登入而非通過 socket 登入。
刷新權限 (FLUSH PRIVILEGES;) 以確保更改生效。

之後再輸入roor及密碼就能登入phpmyadmin,要建資料表新增編及刪除都可以操作


到這裡為止就完成分拆安裝(Apache / PHP / MySQL/  phpMyAdmin)的工作,伺服器未來在更新維護上也更便利,雖然工作流程繁瑣,但至少不用煩惱~惱人的資安通報問題,以上工作心得分享,有需要的朋友參考看看!!

備註:如需要申請 Let's Encrypt的 SSL 與安裝可參考下篇文章說明

工作心得撰寫:徐嘉裕 Neil hsu

留言

這個網誌中的熱門文章

好用的windows備份檔案dos指令XCOPY-教學撰寫:徐嘉裕Neil hsu

要快速的備份某個硬碟全部資料到備份硬碟中,雖然是可以用windows內建的備份與還原,但如果重灌windows可會有key不同而無法還原的問題,還要改一堆設定煩死了,直接用dos指令XCOPY來做檔案的複製就很快了,資料也不會丟失,好朋友可以參考看看!! 首先開啟windows所有程式->附屬應用程式->開啟命令提示字元! 然後輸入以下指令 XCOPY C:\xxx   F:\xxx /s 藍字的 C:\xxx  為複製檔案來源位置例如要複製整個C槽就輸入 C:\ 綠色的   F:\xxx 為複製目的位置,例如要放到F槽的備份資料夾,就輸入  F:\ 備份 紅字的 S 為複製類型參數,可以自行修改為以下的參數設定: ================================================================= /A    只複製設定成保存屬性的檔案,不要改變屬性的設定。 /M    只複製設定成保存屬性的檔案,並清除保存屬性。 /D:m-d-y  複製指定日期當天或之後變更的檔案。如果沒給日期,只複製那些來源檔案日期比目的檔案日期為新的檔案。 /EXCLUDE:file1[+file2][+file3]...         指定檔案清單字串。每個字串應在不同行。如果有字串對應到要進行複製的檔案絕         對路徑的任何部分,這個檔案會被排除複製。例如,指定字串         \obj\ 或 .obj 的話,會排除所有在 obj 目錄下副檔名是.obj 的檔案複製。 /P    在建立每個目的檔案時顯示提示。 /S    複製每個目錄及其包含的子目錄,不複製空目錄。 /E    複製每個目錄及其包含的子目錄,也複製空目錄。/S 與 /E相同,能夠用來修改 /T。 /V   ...

jQuery取得下拉選單selected中數值與內容的方法

假設選單狀態為: <select id='selectname '> <option value='v1' data-id="d1">選單A</option> <option value='v2' data-id="d2">選單B</option> <option value='v3' data-id="d3">選單C</option> </select> 以jQuery取得選單數值與內容方法如下: 1、取得下拉選單 value 數值的方法 $selectname=$('#selectname').val(); alert($selectname); //顯示選單中 selected 狀態的value數值v1 or  v2  or  v3。 2、取得下拉選單中 data-id 數值的方法 $data-id= $(this).find(':selected').attr('data-id'); alert($data-id); //顯示選單中 selected 狀態的data-id數值d1 or  d2 or  d3。 3、取得下拉選單中 文字 的方法 $selecttext=$(this).find(':selected').text(); alert($selecttext); //顯示選單中 selected 狀態的文字內容,如選單A or  選單B or 選單C。 教學撰寫:徐嘉裕 Neil hsu

PhpSpreadsheet電子表格PHP匯出excel排版範例->Xoops-教學撰寫:徐嘉裕Neil hsu

在開發模組時如果要吧資料表內容匯出excel,最常用的套件因該就是PHPExcel,但是官網已經說明PHPExcel套件因升級不易只能支援到php5.6, 該物件已於2017年正式棄用,並於2019年永久歸檔 ,換句話說PHPExcel套件對於日後新版的excel格式均不支援,為保持程式在最新狀態只好棄用PHPExcel改使用PhpSpreadsheet電子表格套件,該套件也是能匯出excel,還能匯出LibreOffice Calc,感覺還不錯! 唯一比較麻煩的是使用PhpSpreadsheet要先佈署composer,如果沒佈署composer是沒辦法使用的,還好官方有釋出已經設定好的phpoffice套件可以直接引入使用,省了很多麻煩,使用PhpSpreadsheet方法如下: 1、先下載PhpSpreadsheet套件,我已經幫大家吧phpoffice一起打包上傳 https://drive.google.com/file/d/1jw73diWVjbcr1ycY-gtqM2cGfpLp1zS_/view?usp=sharing 下載回來後解壓縮吧phpoffice跟PhpSpreadsheet丟到Xoops模組的class資料夾中,未來如需更新PhpSpreadsheet可到官網下載最新版覆蓋即可 https://github.com/PHPOffice/PhpSpreadsheet 2、然後建立一個excel.php放在模組根目錄中 以下為編排excel表格常用的函數設定 include_once "header.php"; //先引入autoload.php檔 include_once XOOPS_ROOT_PATH.'/modules/ 模組ID /class/phpoffice/vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\IOFactory; $spreadsheet = new Spreadsheet(); //實體化Excel工作表 //設置電子表格元數據的操作: $spreadsheet->getProperties() ->setCreator...