Доработка Proxy Server
Вынес настройки в конфигурацию, обновил Readme
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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
102
README.md
@@ -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-сертификатов:** достаточно одного сертификата в папке основного домена для всех поддоменов! 🌟
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user