Доработка Proxy Server

Вынес настройки в конфигурацию, обновил Readme
This commit is contained in:
Falknat
2025-10-02 08:58:22 +07:00
parent 7a87617282
commit 93bed4a458
4 changed files with 138 additions and 77 deletions

View File

@@ -7,85 +7,54 @@ import (
"net/http" "net/http"
"strings" "strings"
"sync" "sync"
"vServer/Backend/config"
tools "vServer/Backend/tools" tools "vServer/Backend/tools"
) )
// ProxyConfig хранит конфигурацию для прокси
type ProxyConfig struct {
ExternalDomain string
LocalAddress string
LocalPort string
UseHTTPS bool
}
var ( var (
proxyConfigs = make(map[int]*ProxyConfig) configMutex sync.RWMutex
configMutex sync.RWMutex
configsLoaded = false
) )
// 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) { func StartHandlerProxy(w http.ResponseWriter, r *http.Request) (valid bool) {
valid = false valid = false
// Инициализируем конфигурации если еще не сделано
if !configsLoaded {
InitProxyConfigs()
}
configMutex.RLock() configMutex.RLock()
defer configMutex.RUnlock() defer configMutex.RUnlock()
// Выбираем конфигурацию (пока используем 1) // Проходим по всем прокси конфигурациям
config := proxyConfigs[1] for _, proxyConfig := range config.ConfigData.Proxy_Service {
if config == nil { // Пропускаем отключенные прокси
return false if !proxyConfig.Enable {
} continue
}
// Проверяем совпадение домена
if r.Host != proxyConfig.ExternalDomain {
continue
}
if r.Host == config.ExternalDomain {
valid = true 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" protocol := "http"
if config.UseHTTPS { if proxyConfig.UseHTTPS {
protocol = "https" 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) proxyReq, err := http.NewRequest(r.Method, proxyURL, r.Body)
if err != nil { if err != nil {
http.Error(w, "Ошибка создания прокси-запроса", http.StatusInternalServerError) http.Error(w, "Ошибка создания прокси-запроса", http.StatusInternalServerError)
return return valid
} }
// Копируем ВСЕ заголовки без изменений (кроме технических) // Копируем ВСЕ заголовки без изменений (кроме технических)
@@ -116,7 +85,7 @@ func StartHandlerProxy(w http.ResponseWriter, r *http.Request) (valid bool) {
} }
// Для HTTPS соединений настраиваем TLS (если понадобится) // Для HTTPS соединений настраиваем TLS (если понадобится)
if config.UseHTTPS { if proxyConfig.UseHTTPS {
client.Transport = &http.Transport{ client.Transport = &http.Transport{
TLSClientConfig: &tls.Config{ TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, // Простая настройка для внутренних соединений InsecureSkipVerify: true, // Простая настройка для внутренних соединений
@@ -126,8 +95,8 @@ func StartHandlerProxy(w http.ResponseWriter, r *http.Request) (valid bool) {
resp, err := client.Do(proxyReq) resp, err := client.Do(proxyReq)
if err != nil { if err != nil {
http.Error(w, "Ошибка прокси-запроса", http.StatusBadGateway) http.Error(w, "Ошибка прокси-запроса", http.StatusBadGateway)
tools.Logs_file(1, "PROXY", "Ошибка прокси-запроса: "+err.Error(), "logs_proxy.log", true) tools.Logs_file(1, "PROXY", "Ошибка прокси-запроса: "+err.Error(), "logs_proxy.log", false)
return return valid
} }
defer resp.Body.Close() defer resp.Body.Close()
@@ -147,8 +116,7 @@ func StartHandlerProxy(w http.ResponseWriter, r *http.Request) (valid bool) {
} }
return valid return valid
} else {
return valid
} }
return valid
} }

View File

@@ -9,8 +9,9 @@ import (
var ConfigPath = "WebServer/config.json" var ConfigPath = "WebServer/config.json"
var ConfigData struct { var ConfigData struct {
Site_www []Site_www `json:"Site_www"` Site_www []Site_www `json:"Site_www"`
Soft_Settings Soft_Settings `json:"Soft_Settings"` Soft_Settings Soft_Settings `json:"Soft_Settings"`
Proxy_Service []Proxy_Service `json:"Proxy_Service"`
} }
type Site_www struct { type Site_www struct {
@@ -31,6 +32,14 @@ type Soft_Settings struct {
Admin_host string `json:"admin_host"` 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() { func LoadConfig() {
data, err := os.ReadFile(ConfigPath) data, err := os.ReadFile(ConfigPath)

102
README.md
View File

@@ -78,7 +78,17 @@ go build -o MyApp.exe
"host": "127.0.0.1", "host": "127.0.0.1",
"alias": ["localhost"], "alias": ["localhost"],
"status": "active", "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": { "Soft_Settings": {
@@ -91,30 +101,94 @@ go build -o MyApp.exe
**Основные параметры:** **Основные параметры:**
- `Site_www` - настройки веб-сайтов - `Site_www` - настройки веб-сайтов
- `Proxy_Service` - конфигурация прокси-сервисов
- `Soft_Settings` - порты и хосты сервисов (MySQL, PHP, админка) - `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/`: Все логи сохраняются в `WebServer/tools/logs/`:
- 🌐 `logs_http.log` - HTTP запросы - 🌐 `logs_http.log` - HTTP запросы (включая прокси P-HTTP)
- 🔒 `logs_https.log` - HTTPS запросы - 🔒 `logs_https.log` - HTTPS запросы (включая прокси P-HTTPS)
- 🔄 `logs_proxy.log` - Ошибки прокси-сервера
- 🗄️ `logs_mysql.log` - MySQL операции - 🗄️ `logs_mysql.log` - MySQL операции
- 🐘 `logs_php.log` - PHP ошибки - 🐘 `logs_php.log` - PHP ошибки
- ⚙️ `logs_config.log` - Конфигурация - ⚙️ `logs_config.log` - Конфигурация
- 🔒 `logs_vaccess.log` - Контроль доступа - 🔒 `logs_vaccess.log` - Контроль доступа
## 📝 Сертификаты ## 🔐 SSL Сертификаты
Как установить сертификат ? ### Установка сертификата
1. Открыть каталог WebServer 1. Откройте каталог `WebServer/`
2. Создать папку Cert 2. Создайте папку `cert/` (если её нет)
3. Создать вашу папку с основным доменом или IP для которого нужен сертификат 3. Создайте папку с именем вашего домена или IP-адреса
4. Туда положить сертификаты с определёнными именами 4. Поместите в неё файлы сертификатов с **точными** именами:
```
certificate.ctr certificate.crt
private.key private.key
ca_bundle.crt ca_bundle.crt
```
5. Сертификат будет автоматически загружен при запуске сервера
5. Сертификат будет успешно загружен. ### 📁 Структура сертификатов
```
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-сертификатов:** достаточно одного сертификата в папке основного домена для всех поддоменов! 🌟

View File

@@ -10,6 +10,16 @@
} }
], ],
"Proxy_Service": [
{
"Enable": false,
"ExternalDomain": "git.example.ru",
"LocalAddress": "127.0.0.1",
"LocalPort": "3333",
"UseHTTPS": false
}
],
"Soft_Settings": { "Soft_Settings": {
"mysql_host": "192.168.1.6", "mysql_host": "192.168.1.6",
"mysql_port": 3306, "mysql_port": 3306,