From 93bed4a458c465744d89a0f211f20bbe166c81f7 Mon Sep 17 00:00:00 2001 From: Falknat <> Date: Thu, 2 Oct 2025 08:58:22 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20Proxy=20Server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Вынес настройки в конфигурацию, обновил Readme --- Backend/WebServer/proxy_server.go | 90 +++++++++----------------- Backend/config/config.go | 13 +++- README.md | 102 ++++++++++++++++++++++++++---- WebServer/config.json | 10 +++ 4 files changed, 138 insertions(+), 77 deletions(-) diff --git a/Backend/WebServer/proxy_server.go b/Backend/WebServer/proxy_server.go index af80ee9..18b7dec 100644 --- a/Backend/WebServer/proxy_server.go +++ b/Backend/WebServer/proxy_server.go @@ -7,85 +7,54 @@ import ( "net/http" "strings" "sync" + "vServer/Backend/config" tools "vServer/Backend/tools" ) -// ProxyConfig хранит конфигурацию для прокси -type ProxyConfig struct { - ExternalDomain string - LocalAddress string - LocalPort string - UseHTTPS bool -} - var ( - proxyConfigs = make(map[int]*ProxyConfig) - configMutex sync.RWMutex - configsLoaded = false + configMutex sync.RWMutex ) -// InitProxyConfigs инициализирует конфигурации прокси один раз при старте -func InitProxyConfigs() { - configMutex.Lock() - defer configMutex.Unlock() - - if configsLoaded { - return - } - - // Конфигурация 1 - config1 := &ProxyConfig{ - ExternalDomain: "git.voxsel.ru", - LocalAddress: "127.0.0.1", - LocalPort: "3333", - UseHTTPS: false, // Локальный сервис работает по HTTP - } - proxyConfigs[1] = config1 - - // Конфигурация 2 - config2 := &ProxyConfig{ - ExternalDomain: "localhost", - LocalAddress: "127.0.0.1", - LocalPort: "8000", - UseHTTPS: false, // Локальный сервис работает по HTTP - } - proxyConfigs[2] = config2 - - configsLoaded = true -} - func StartHandlerProxy(w http.ResponseWriter, r *http.Request) (valid bool) { valid = false - // Инициализируем конфигурации если еще не сделано - if !configsLoaded { - InitProxyConfigs() - } - configMutex.RLock() defer configMutex.RUnlock() - // Выбираем конфигурацию (пока используем 1) - config := proxyConfigs[1] - if config == nil { - return false - } + // Проходим по всем прокси конфигурациям + for _, proxyConfig := range config.ConfigData.Proxy_Service { + // Пропускаем отключенные прокси + if !proxyConfig.Enable { + continue + } + + // Проверяем совпадение домена + if r.Host != proxyConfig.ExternalDomain { + continue + } - if r.Host == config.ExternalDomain { valid = true + // Логирование прокси-запроса + https_check := !(r.TLS == nil) + if https_check { + tools.Logs_file(0, "P-HTTPS", "🔍 IP клиента: "+r.RemoteAddr+" Обработка запроса: https://"+r.Host+r.URL.Path+" → "+proxyConfig.LocalAddress+":"+proxyConfig.LocalPort, "logs_https.log", false) + } else { + tools.Logs_file(0, "P-HTTP", "🔍 IP клиента: "+r.RemoteAddr+" Обработка запроса: http://"+r.Host+r.URL.Path+" → "+proxyConfig.LocalAddress+":"+proxyConfig.LocalPort, "logs_http.log", false) + } + // Определяем протокол для локального соединения protocol := "http" - if config.UseHTTPS { + if proxyConfig.UseHTTPS { protocol = "https" } // Проксирование на локальный адрес - proxyURL := protocol + "://" + config.LocalAddress + ":" + config.LocalPort + r.URL.RequestURI() + proxyURL := protocol + "://" + proxyConfig.LocalAddress + ":" + proxyConfig.LocalPort + r.URL.RequestURI() proxyReq, err := http.NewRequest(r.Method, proxyURL, r.Body) if err != nil { http.Error(w, "Ошибка создания прокси-запроса", http.StatusInternalServerError) - return + return valid } // Копируем ВСЕ заголовки без изменений (кроме технических) @@ -116,7 +85,7 @@ func StartHandlerProxy(w http.ResponseWriter, r *http.Request) (valid bool) { } // Для HTTPS соединений настраиваем TLS (если понадобится) - if config.UseHTTPS { + if proxyConfig.UseHTTPS { client.Transport = &http.Transport{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, // Простая настройка для внутренних соединений @@ -126,8 +95,8 @@ func StartHandlerProxy(w http.ResponseWriter, r *http.Request) (valid bool) { resp, err := client.Do(proxyReq) if err != nil { http.Error(w, "Ошибка прокси-запроса", http.StatusBadGateway) - tools.Logs_file(1, "PROXY", "Ошибка прокси-запроса: "+err.Error(), "logs_proxy.log", true) - return + tools.Logs_file(1, "PROXY", "Ошибка прокси-запроса: "+err.Error(), "logs_proxy.log", false) + return valid } defer resp.Body.Close() @@ -147,8 +116,7 @@ func StartHandlerProxy(w http.ResponseWriter, r *http.Request) (valid bool) { } return valid - - } else { - return valid } + + return valid } diff --git a/Backend/config/config.go b/Backend/config/config.go index 63d3ec8..930ccab 100644 --- a/Backend/config/config.go +++ b/Backend/config/config.go @@ -9,8 +9,9 @@ import ( var ConfigPath = "WebServer/config.json" var ConfigData struct { - Site_www []Site_www `json:"Site_www"` - Soft_Settings Soft_Settings `json:"Soft_Settings"` + Site_www []Site_www `json:"Site_www"` + Soft_Settings Soft_Settings `json:"Soft_Settings"` + Proxy_Service []Proxy_Service `json:"Proxy_Service"` } type Site_www struct { @@ -31,6 +32,14 @@ type Soft_Settings struct { Admin_host string `json:"admin_host"` } +type Proxy_Service struct { + Enable bool `json:"Enable"` + ExternalDomain string `json:"ExternalDomain"` + LocalAddress string `json:"LocalAddress"` + LocalPort string `json:"LocalPort"` + UseHTTPS bool `json:"UseHTTPS"` +} + func LoadConfig() { data, err := os.ReadFile(ConfigPath) diff --git a/README.md b/README.md index 8a0c1fc..6728c1b 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,17 @@ go build -o MyApp.exe "host": "127.0.0.1", "alias": ["localhost"], "status": "active", - "root_file": "index.html" + "root_file": "index.html", + "root_file_routing": true + } + ], + "Proxy_Service": [ + { + "Enable": true, + "ExternalDomain": "git.example.ru", + "LocalAddress": "127.0.0.1", + "LocalPort": "3333", + "UseHTTPS": false } ], "Soft_Settings": { @@ -91,30 +101,94 @@ go build -o MyApp.exe **Основные параметры:** - `Site_www` - настройки веб-сайтов +- `Proxy_Service` - конфигурация прокси-сервисов - `Soft_Settings` - порты и хосты сервисов (MySQL, PHP, админка) +### 🔄 Прокси-сервер + +Прокси-сервер позволяет перенаправлять внешние запросы на локальные сервисы. + +**Параметры Proxy_Service:** +- `Enable` - включить/отключить прокси (true/false) +- `ExternalDomain` - внешний домен для перехвата запросов +- `LocalAddress` - локальный адрес сервиса +- `LocalPort` - порт локального сервиса +- `UseHTTPS` - использовать HTTPS для локального подключения (true/false) + +**Пример множественных прокси:** +```json +"Proxy_Service": [ + { + "Enable": true, + "ExternalDomain": "git.example.com", + "LocalAddress": "127.0.0.1", + "LocalPort": "3000", + "UseHTTPS": false + }, + { + "Enable": false, + "ExternalDomain": "api.example.com", + "LocalAddress": "127.0.0.1", + "LocalPort": "8080", + "UseHTTPS": false + } +] +``` + +**Применение изменений:** +- Введите команду `config_reload` в консоли для перезагрузки конфигурации +- Изменения применятся к новым запросам без перезапуска сервера + ## 📝 Логирование Все логи сохраняются в `WebServer/tools/logs/`: -- 🌐 `logs_http.log` - HTTP запросы -- 🔒 `logs_https.log` - HTTPS запросы +- 🌐 `logs_http.log` - HTTP запросы (включая прокси P-HTTP) +- 🔒 `logs_https.log` - HTTPS запросы (включая прокси P-HTTPS) +- 🔄 `logs_proxy.log` - Ошибки прокси-сервера - 🗄️ `logs_mysql.log` - MySQL операции - 🐘 `logs_php.log` - PHP ошибки - ⚙️ `logs_config.log` - Конфигурация - 🔒 `logs_vaccess.log` - Контроль доступа -## 📝 Сертификаты +## 🔐 SSL Сертификаты -Как установить сертификат ? +### Установка сертификата -1. Открыть каталог WebServer -2. Создать папку Cert -3. Создать вашу папку с основным доменом или IP для которого нужен сертификат -4. Туда положить сертификаты с определёнными именами - - certificate.ctr - private.key - ca_bundle.crt +1. Откройте каталог `WebServer/` +2. Создайте папку `cert/` (если её нет) +3. Создайте папку с именем вашего домена или IP-адреса +4. Поместите в неё файлы сертификатов с **точными** именами: + ``` + certificate.crt + private.key + ca_bundle.crt + ``` +5. Сертификат будет автоматически загружен при запуске сервера -5. Сертификат будет успешно загружен. \ No newline at end of file +### 📁 Структура сертификатов + +``` +WebServer/ +└── cert/ + ├── example.com/ # Основной домен + │ ├── certificate.crt + │ ├── private.key + │ └── ca_bundle.crt + │ + └── sub.example.com/ # Поддомен (опционально) + ├── certificate.crt + ├── private.key + └── ca_bundle.crt +``` + +### 🎯 Работа с поддоменами + +**Важно:** Если для поддомена не создана отдельная папка в `cert/`, то автоматически будет использоваться сертификат родительского домена. + +**Примеры:** +- ✅ Запрос к `example.com` → использует сертификат из `cert/example.com/` +- ✅ Запрос к `sub.example.com` (папка существует) → использует `cert/sub.example.com/` +- ✅ Запрос к `sub.example.com` (папка НЕ существует) → использует `cert/example.com/` + +**Это удобно для wildcard-сертификатов:** достаточно одного сертификата в папке основного домена для всех поддоменов! 🌟 \ No newline at end of file diff --git a/WebServer/config.json b/WebServer/config.json index 9c1c5f3..c6790ec 100644 --- a/WebServer/config.json +++ b/WebServer/config.json @@ -10,6 +10,16 @@ } ], + "Proxy_Service": [ + { + "Enable": false, + "ExternalDomain": "git.example.ru", + "LocalAddress": "127.0.0.1", + "LocalPort": "3333", + "UseHTTPS": false + } + ], + "Soft_Settings": { "mysql_host": "192.168.1.6", "mysql_port": 3306,