我上個月註冊了 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 鈕即可新增 :
但開啟 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)
# http://tony1966.duckdns.org:8080 (Apache+PHP)
開啟 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/ 下.





沒有留言 :
張貼留言