跳到主要內容

升級Ubuntu22.04(Apache / PHP ) Ondřej Surý 的 PPA套件方法

當初使用 Ondřej Surý 的 PPA套件安裝(Apache / PHP )就是為了解決惱人的資安通報,果然網站上線沒多久通報就來了,這次主要有兩項要升級(Apache要高於2.4.64 / PHP要高於8.3.23),剛好來試看看傳說中的 PPA套件升級到底有多容易,以下是升級完整步驟紀錄

先備份檔案以防萬一(後續比對用)重要

sudo mkdir -p /root/apache_backup_$(date +%Y%m%d)


sudo cp /etc/php/8.3/apache2/php.ini /root/apache_backup_$(date +%Y%m%d)/

sudo cp /etc/apache2/sites-available/default-ssl.conf /root/apache_backup_$(date +%Y%m%d)/

sudo cp /etc/apache2/mods-available/ssl.conf /root/apache_backup_$(date +%Y%m%d)/

sudo cp /etc/apache2/apache2.conf /root/apache_backup_$(date +%Y%m%d)/

sudo cp /etc/apache2/conf-available/security.conf /root/apache_backup_$(date +%Y%m%d)/

sudo cp /etc/apache2/ports.conf /root/apache_backup_$(date +%Y%m%d)/


這樣所有重要設定就會備份到 /root/apache_backup_20251020/,如果升級後有任何異常,你只要:

sudo cp /root/apache_backup_20251020/* /etc/apache2/...

sudo systemctl reload apache2

就能一鍵復原(紅字為今天日期)

再來升級Apache

1、更新套件列表:
 sudo apt update

2、升級 Apachesudo apt install --only-upgrade apache2

備註:
如果發生Progress: [ 82%] [###############################################...........]
跳出選項

Configuration file '/etc/apache2/mods-available/ssl.conf'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** ssl.conf (Y/I/N/O/D/Z) [default=N] ?

選N保留原設定即可,ssl.conf才不會被被蓋掉!!

完成以上步驟繼續後面的流程

3、檢查版本是否更新成功: 

apache2 -v 

如果返回 Server version: Apache/2.4.64 

或更高就沒問題

4、 檢查設定合併情況(diff):(或可省略跳過)

sudo diff /root/apache_backup_20251020/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf

更新後的ssl.conf會被重置,找到檔案打開

sudo nano /etc/apache2/sites-available/000-default-le-ssl.conf (示例)

<VirtualHost *:443>

略...................

SSLCertificateChainFile /etc/letsencrypt/live/您的網站網址/chain.pem //補一個chain.pem

</VirtualHost>

5、重新啟動 Apache:sudo systemctl restart apache2

到這裡就完成Apache 升級工作,原本的設定檔像是ssl也都沒被覆蓋,真的很方便

再來升級PHP

1、更新套件清單 + 升級 PHP

sudo apt update

sudo apt install --only-upgrade php8.3 php8.3-cli php8.3-common \ libapache2-mod-php8.3 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

sudo apt install libapache2-mod-php8.3 php8.3-sqlite3

說明:

--only-upgrade php8.3:避免裝上其他版本(例如 8.4)

一次列出常用模組,確保升級後版本一致

如果你有安裝其他 extension(例如 imagick、redis 等),記得也一併加上。


2、重新載入 Apache(或 FPM)

讓 Apache 重新載入 libapache2-mod-php8.3.so

如果你是 mod_php:

sudo systemctl restart apache2

如果是 PHP-FPM:

sudo systemctl restart php8.3-fpm

說明:讓 Apache 重新載入 libapache2-mod-php8.3.so

清空舊版本 PHP 的快取、Opcache、模組記憶體

確保整個網站從這一刻起用的都是 最新 PHP

3、驗證版本是否升級成功

輸入指令:php -v

應該會顯示:

PHP 8.3.26 (cli) (built: Sep 25 2025 ...)

只要比原先版本大就是更新成功

PHP版本升級注意事項(實戰心得)

在使用 PPA 進行 PHP 套件升級時,即使指定使用 --only-upgrade php8.3,仍有可能因套件相依關係而被強制升級至最新版本(例如 PHP 8.4)。

但可用以下方法切換回 PHP 8.3新版,處理方式如下:

先查 php8.3是否還在:

dpkg -l | grep php8.3

如果還在直接切:

sudo update-alternatives --set php /usr/bin/php8.3

接者輸入

sudo a2dismod php8.4

sudo a2enmod php8.3

sudo systemctl restart apache2

最後再輸入php -v檢查PHP版本,如無意外因該會回到PHP8.3最新版


4、重新啟動 Apache

sudo systemctl restart apache2

5、php.ini資料回填

由於升級PHP後,php.ini強制都會被初始化,為了使之前的設定能恢復套用,建立一個執行腳本自動由新舊版php.ini比對後回填設定功能

先建立腳本

sudo nano /root/compare_phpini.sh

貼入以下內容:

#!/bin/bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import shutil
import datetime
import sys
old = Path("/root/apache_backup_20260526/php.ini") 
#備份資料(紅字為您實際備份檔目錄)
new = Path("/etc/php/8.3/apache2/php.ini") 
#當前資料
#這裡是比對項目來源,可依實際情況擴充
keys = [
"memory_limit",
"upload_max_filesize",
"post_max_size",
"max_execution_time",
"max_input_time",
"max_input_vars",
"max_file_uploads",
"date.timezone",
"display_errors",
"log_errors",
"error_reporting",
"session.save_path",
"file_uploads",
"allow_url_fopen",
"curl.cainfo",
"upload_tmp_dir",
]
#如來源資料不一致或無數據,填入預設數值(可擴充)

FORCE_VALUES = {
"curl.cainfo": "/usr/local/share/ca-certificates/cacert.pem",
"upload_max_filesize": "2000M",
"post_max_size": "2000M",
"max_execution_time": "600",
"memory_limit": "4G",
"max_input_time": "600",
"max_file_uploads": "500",
"upload_tmp_dir": "/var/www/html/uploads/php_tmp",
}

if not old.exists():
print(f"Old php.ini not found: {old}", file=sys.stderr)
sys.exit(1)
if not new.exists():
print(f"New php.ini not found: {new}", file=sys.stderr)
sys.exit(1)
backup = new.with_suffix(".ini.before_neil_restore_" + datetime.datetime.now().strftime("%Y%m%d%H%M%S"))
shutil.copy2(new, backup)
def read_values(path):
values = {}
for line in path.read_text(errors="ignore").splitlines():
raw = line.strip()
if not raw or raw.startswith(";"):
continue
if "=" not in raw:
continue
key = raw.split("=", 1)[0].strip()
if key in keys:
values[key] = line
return values
old_values = read_values(old)
for key, value in FORCE_VALUES.items():
old_values[key] = f"{key} = {value}"
lines = new.read_text(errors="ignore").splitlines()
done = set()
out = []
for line in lines:
raw = line.strip()
key = None
if "=" in raw:
check = raw.lstrip(";").split("=", 1)[0].strip()
if check in old_values:
key = check
if key:
if key not in done:
out.append(old_values[key])
done.add(key)
else:
out.append(line)
else:
out.append(line)
for key in keys:
if key in old_values and key not in done:
out.append("")
out.append("; Restored from old php.ini by Neil restore script")
out.append(old_values[key])
new.write_text("\n".join(out) + "\n")
print("Backup:", backup)
print("Restored keys:")
for key in keys:
if key in old_values:
print(" -", key, "=>", old_values[key])
PY

Ctrl + O儲存 / 按 Enter(確認檔名)/ Ctrl + X離開
執行權限:
sudo chmod 755 /root/compare_phpini.sh
執行:
sudo /root/compare_phpini.sh
完成後刪除伺服器端腳本:
sudo rm /root/compare_phpini.sh
執行後檢查:
sudo apache2ctl configtest
sudo systemctl restart apache2
sudo systemctl status apache2

確認 Apache PHP 設定值:

php -i | grep "Loaded Configuration File"
php -i | grep -E "curl.cainfo|upload_max_filesize|post_max_size|max_execution_time|memory_limit|max_input_time|max_file_uploads|upload_tmp_dir"

注意:
CLI 的 php -i 不一定等於 Apache 模式設定。

最準方式是暫時放 phpinfo() 檢查 Loaded Configuration File,看完立刻刪除,避免再次被弱掃抓到 info.php / phpinfo.php。

看到 (END)按q離開 less / pager 返回 root shell

這樣就完成(Apache / PHP )升級工作,不用半小時,非常順利,這個 Ondřej Surý 的 PPA套件真的是非常非常的讚,大推!!

以上工作心得分享,有需要的朋友可參考看看

工作心得撰寫:徐嘉裕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   ...

XAMPP自行下載PHP官方PHP8.3升級方法

目前這方法只適用於Windows安裝的Xampp,可以下PHP官網的PHP8.3包進行升級,如果是LINUX安裝的LAMPP此方法不適用,可直接跳過! 因為本地端的開發環境需要更高的PHP版本來測試模組,而XAMPP官網釋出的PHP版本只有到PHP8.2,無法滿足需求,只好自己動手DIY升級了,其實方法也很簡單,說明如下: 1、先關閉Xampp Panel的Apache跟Mysql 2、前往PHP官網,下載PHP8.3包(VS16 x64 Thread Safe) 下載連結: https://windows.php.net/download#php-8.3-ts-vs16-x64 3、吧下載回來的php包放解壓縮放到php資料夾裡面(建立一個php資料夾),然後吧Xampp根目錄中的php檔案更名,例如改為php_8.1,再吧剛剛下載建立的php資料夾放到Xampp根目錄中c:\xampp\php 4、進入php根目錄,找到php.ini-development,複製一份後改為php.ini,用文字編輯器打開進入 5、先搜尋;extension_dir,在下面加上extension_dir = "\xampp\php\ext" 6、再搜尋;extension=curl,會有下面這一排啟用套件設定 將以下套件的;註解拿掉 extension=curl extension=fileinfo extension=gd extension=gettext extension=mbstring extension=exif      extension=mysqli extension=openssl extension=pdo_mysql extension=pdo_sqlite extension=zip 7、最後需要吧 C:\xampp\php裡面的 libssh2.dll 複製後貼到C:\xampp\apache\bin 覆蓋舊檔 再到資料夾C:\xampp\php中輸入搜尋 libcrypto-*.dll 和 libssl-*.dll 找到兩支檔,複製後貼到C:\xampp\apache\bin 覆蓋舊檔 找到php.ini中的curl.cainfo,吧註解拿掉改為 curl.cainfo = "C:\xampp\php\ext...

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

為了應對越來越頻繁的資安通報,解決方案就是用PPA各別安裝Apache / PHP / MySQL/  phpMyAdmin套件,這樣如果遇到資安通報可立即升級修補漏洞,確保系統安全,晚上也好睡覺,以下是分拆安裝(Apache / PHP / MySQL/  phpMyAdmin)的安裝方法步驟說明: 備註說明: 如果是學校雲主機未啟用 IPv6,建議於先停用 IPv6,不然安裝流程會卡死 【Ubuntu 永久停用 IPv6(全系統 IPv4 優先)】 建立設定檔 sudo tee /etc/sysctl.d/99-disable-ipv6.conf <<EOF net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 EOF 套用設定 sudo sysctl -p /etc/sysctl.d/99-disable-ipv6.conf 驗證 cat /proc/sys/net/ipv6/conf/all/disable_ipv6 如果回  1 ,表示 IPv6 已完全關閉。 這樣就能吧 IPv6關閉避免影響套件下載與安裝流程 步驟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 備註: 如發生add-apt-repository timeout 110無法安裝PPA,請參考這篇解決方案! ※安裝 Apache 2.4.XX最新版(包含 OpenSSL) sudo apt install -y apache2 apache2-utils ssl-cert openssl ※確認 Apache 版本及是否安裝 apache2 -v 應該會顯示: S...