From 6a9fa3321ec50271129d5fd39cc6a9ade1da8635 Mon Sep 17 00:00:00 2001 From: JianMiau Date: Mon, 4 Aug 2025 17:11:47 +0800 Subject: [PATCH] [add] first --- .gitignore | 2 + README.md | 71 ++++++++++++++++++++++++++ favicon.png | Bin 0 -> 11709 bytes index.php | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ servers.php | 82 ++++++++++++++++++++++++++++++ test.php | 6 +++ 6 files changed, 301 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 favicon.png create mode 100644 index.php create mode 100644 servers.php create mode 100644 test.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..22444b2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/*.DS_Store +/conf/conf.d diff --git a/README.md b/README.md new file mode 100644 index 0000000..59360aa --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# NGINX 動態 Server 管理工具 + +此專案提供一個簡易的 PHP 網頁介面,可以動態新增和刪除 NGINX Server 配置,並即時重載 NGINX 配置,方便本地多專案開發環境管理。 + +--- + +## 主要功能 + +- 顯示目前所有 NGINX 動態 Server(以 conf.d/*.conf 設定檔為基礎) +- 新增 Server:指定 Port 與根目錄(根目錄為指定的相對路徑,會自動補上預設絕對路徑前綴) +- 刪除 Server +- 新增、刪除後自動重載 NGINX 配置 +- 預設排除保留端口(如 80、8080)及已被使用的端口 +- 前端輸入檢查,避免重複端口與保留端口使用 + +--- + +## 系統需求 + +- PHP 7.0 以上 +- NGINX 已安裝且可透過命令行重載 +- PHP 有權限讀寫 NGINX conf.d 目錄 +- 適用於 macOS 或 Linux 環境,路徑請自行調整 + +--- + +## 專案結構 + +nginx-manager/ +│ +├── conf/ +│ └── conf.d/ # NGINX 動態 Server 設定檔目錄 +├── index.php # 主頁面,顯示及新增刪除 Server +├── servers.php # 處理新增刪除 Server 請求並重載 NGINX +└── README.md + +--- + +## 使用說明 + +1. 修改 `servers.php` 中的 `$confDir` 及 `$nginxExe` 變數,設定對應的 NGINX 配置目錄與 nginx 可執行檔路徑 + +2. 修改 `index.php` 中 `$basePath` 變數(預設為 `/Users/catantech/Desktop/`,用於拼接使用者輸入的相對路徑) + +3. 將此專案放置於支援 PHP 的 Web 伺服器中(例如內建 PHP server 或 Apache) + +4. 開啟瀏覽器進入 `index.php`,即可看到目前動態 Server,並可新增或刪除 + +5. 新增時,請輸入相對於 `$basePath` 的路徑(例如:`Project/Line_Project_1/Official/out-dev`) + +--- + +## 注意事項 + +- 確保 PHP 執行者有讀寫 NGINX 動態設定檔目錄的權限 + +- 新增 Server 會立即寫入設定檔並重載 NGINX,請確保 NGINX 配置無誤,避免重載失敗 + +- 本專案不包含完整的安全檢查,建議用於本地開發環境 + +--- + +## 授權 + +MIT License + +--- + +## 聯絡 + +如有問題,歡迎聯絡建喵。 diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a496302c754ea9fdf71f3e695b90a0925bbba54f GIT binary patch literal 11709 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 $port, + 'file' => $file, + 'content' => file_get_contents($file) + ]; + } + return $servers; +} + +$servers = listServerFiles(); + +$reservedPorts = [80, 8080]; + +// 合併所有已使用 port 與保留 port +$usedPorts = array_unique(array_merge( + $reservedPorts, + array_map('intval', array_column($servers, 'port')) +)); + +function findRandomAvailablePort($start = 3000, $end = 9000, $usedPorts = []) { + $candidates = range($start, $end); + shuffle($candidates); + foreach ($candidates as $port) { + if (!in_array($port, $usedPorts)) { + return $port; + } + } + return null; +} + +$autoPort = findRandomAvailablePort(3000, 9000, $usedPorts); + +$resultMsg = ''; +if (isset($_SESSION['resultMsg'])) { + $resultMsg = $_SESSION['resultMsg']; + unset($_SESSION['resultMsg']); +} +?> + + + + + NGINX 動態 Server 管理 + + + + + +
+ +
+ + +

📡 現有 Servers

+
+ +
+

➕ 新增 Server

+
+ + + +
+ + +
+ +
+ + + + + diff --git a/servers.php b/servers.php new file mode 100644 index 0000000..3a84b24 --- /dev/null +++ b/servers.php @@ -0,0 +1,82 @@ +&1"; + exec($cmd, $output, $code); + return ['code' => $code, 'output' => $output]; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $port = intval($_POST['port']); + $confFile = "$confDir/{$port}.conf"; + $resultMsg = ''; + + if ($_POST['action'] === 'add') { + $baseDir = '/Users/catantech/Desktop/'; + $relativeRoot = trim($_POST['root']); + + // 防止目錄跳脫 + if (strpos($relativeRoot, '..') !== false) { + $resultMsg = "❌ Root 路徑不能包含 '..' "; + } else { + // 拼接完整路徑 + $fullRoot = rtrim($baseDir, '/') . '/' . ltrim($relativeRoot, '/'); + + $serverBlock = <<'; +echo shell_exec('whoami'); +echo shell_exec('C:\nginx\nginx.exe -t 2>&1'); +echo shell_exec('C:\nginx\nginx.exe -s reload 2>&1'); +echo ''; \ No newline at end of file