2025年9月2日 星期二

樹莓派 Pi 3 開啟 8080 埠 (Apache2+PHP 網頁服務)

我上個月註冊了 DuckDNS 帳號, 並且在鄉下老家的樹莓派 Pi 3 主機上設定好 shell 程式自動更新 DuckDNS 上記錄的 IP, 成功地用將 tony1966.duckdns.org 域名綁定到這台樹莓派的網站, 訪問此域名會連線到 Pi 3 上的 Nginx 伺服器 (80 埠), 參考 :


事實上這台 Pi 3 上除了 Ngix 外還運行了 Apache 伺服器, 埠號為 8080 : 

pi@raspberrypi:~ $ sudo netstat -tulnp | grep 8080   
tcp6       0      0 :::8080                 :::*                    LISTEN      736/apache2         

但我訪問 tony1966.duckdns.org:8080 卻無回應, 檢查 Pi 3 所連線的 Edimax 無線基地台管理頁面, 發現我之前只打開 Virtual Server 的 80 埠而已, 難怪網頁請求進不來.




在上方的 Enable Virtual Server 中輸入 Pi 3 的固定 IP 網址開啟 8080 埠, 按 Add 鈕即可新增 :




接著先按左下角的 Save 鈕儲存設定, 然後按 Apply 鈕套用新設定才會生效 : 




但開啟 Virtual server 後仍然無法訪問 8080 埠, 檢查 Apache 設定檔如下 : 

pi@raspberrypi:~ $ cat /etc/apache2/ports.conf   
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 8080

<IfModule ssl_module>
Listen 443
</IfModule>

<IfModule mod_gnutls.c>
Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

詢問 ChatGPT 這設定哪裡有問題, 原來 Listen 8080 在 Debian/Raspberry Pi OS (用的是 Apache2) 只會在 IPv6 上啟動監聽, 完全沒開 IPv4. 只要在這列底下增加 Listen [::]:8080 就會監聽 IPv4 了 :




用 nano 編輯 Apache 設定檔 /etc/apache2/ports.conf 添加監聽 IPv4 後存檔 : 

pi@raspberrypi:~ $ sudo nano /etc/apache2/ports.conf   

Listen 8080
Listen [::]:8080  

存檔後先用下列指令檢驗 Apache 設定檔語法是否正確 : 

pi@raspberrypi:~ $ sudo apache2ctl configtest   
[Tue Sep 02 12:42:23.429881 2025] [alias:warn] [pid 13686] AH00671: The Alias directive in /etc/phpmyadmin/apache.conf at line 3 will probably never match because it overlaps an earlier Alias.
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK  

重啟 Apache 伺服器 :

pi@raspberrypi:~ $ sudo systemctl restart apache2   

再次訪問 tony1966.duckdns.org:8080 就會顯示 PHP 訊息頁面了, 表示 Apache 正常運作 : 




但是用 netstat 去撈監聽的 8080 埠, 會顯示兩個 tcp6, 而非一個 tcp6, 一個 tcp4 :

pi@raspberrypi:~ $ sudo netstat -tulnp | grep 8080  
tcp6       0      0 :::8080                 :::*                    LISTEN      13754/apache2       
tcp6       0      0 :::8080                 :::*                    LISTEN      13754/apache2  

原因是 Linux 核心參數 net.ipv6.bindv6only=0, 一個 IPv6 的 :::8080 socket 同時也會接受 IPv4 (0.0.0.0:8080) 的連線, 但 netstat 一律顯示 tcp6. 

只要用 curl -4 http://127.0.0.1:8080 指令測試, 若有回應網頁就表示 IPv4 正常. 

這樣就可以從外網透過 DuckDNS 域名訪問架在 Pi 3 上面的兩個網站了 :

# http://tony1966.duckdns.org            (Nginx+uWSGI+Python)

開啟 Pi 3 的 8080 埠 web 服務的目的是想將幾年前用 PHP 寫的 stockbot 專案在此網站上重新運行, 作為撰寫新專案的參考. 

PS : 

Virtual Server 是針對特定服務的一種 Port Forwarding, 通常會把外部單一埠對應到內網單一埠, 用來對外網開放內網的某個特定服務(例如 8080 網站, FTP, 遊戲伺服器等), 提供簡單的設定, 方便使用者快速開服務; 而 Port Forwarding 則是比較通用的埠轉發機制, 完全自由設定, 可做多埠/埠範圍轉發, TCP/UDP 都可以. 


2025-09-02 補充 : 

此主機上的 Apache 應該是 2019 年底安裝的, 參考 : 


PHP 網站檔案位置在 /var/www/html/ 下. 

沒有留言 :