Конфигурации [Nginx][Go]


Введение

На этот раз я попробую загрузить конфигурационные данные моего Go-проекта и добавить больше свойств в nginx.conf.

  • Xubuntu + Nginx + Go(+ Pion/WebRTC) + Node.js

Примеры

  • webappsample — GitHub

Загрузка конфигурационных данных в проекты Go

В прошлый раз я изменил URL моего проекта Go для доступа через Nginx.
Одна проблема заключается в том, что этот URL не одинаков во всех средах.

Поэтому я хочу получить URL из внешних конфигурационных данных.

Загрузка файлов

Я могу сохранить данные конфигурации как файл конфигурации в «$HOME/.config»(«%APPDATA%» для Windows).
Но поскольку в этот раз я хотел просто загрузить постоянные тексты из внешнего файла, я решил поместить его в каталог моего проекта.

appsettings.json

{
    "url": "https://192.168.XX.YYY:443/webrtc"
}
Войти в полноэкранный режим Выйти из полноэкранного режима

appsettings.go

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type AppSettings struct {
    URL string `json:"url"`
}

func LoadAppSettings() (setting AppSettings, err error) {
    result := &AppSettings{}
    cur, _ := os.Getwd()
    file, err := os.Open(fmt.Sprintf("%s/appsettings.json", cur))
    if err != nil {
        return *result, err
    }
    fileInfo, err := file.Stat()
    if err != nil {
        return *result, err
    }
    // Read the config file
    fileData := make([]byte, fileInfo.Size())
    _, err = file.Read(fileData)
    if err != nil {
        return *result, err
    }
    err = json.Unmarshal(fileData, &result)
    return *result, err
}
Войти в полноэкранный режим Выход из полноэкранного режима

main.go

...

func main() {
    settings, _ := LoadAppSettings()
    target := getStrippingTargetPrefix(settings.URL)

    hub := *newSSEHub()
    go hub.run()

    if len(target) > 0 {
        http.Handle(fmt.Sprintf("/%s/css/", target), http.StripPrefix(fmt.Sprintf("/%s", target), http.FileServer(http.Dir("templates"))))
        http.Handle(fmt.Sprintf("/%s/js/", target), http.StripPrefix(fmt.Sprintf("/%s", target), http.FileServer(http.Dir("templates"))))

        http.HandleFunc(fmt.Sprintf("/%s/sse/message", target), func(w http.ResponseWriter, r *http.Request) {
            sendSSEMessage(w, r, &hub)
        })
        http.HandleFunc(fmt.Sprintf("/%s/sse/", target), func(w http.ResponseWriter, r *http.Request) {
            registerSSEClient(w, r, &hub)
        })
    } else {
        http.Handle("/css/", http.FileServer(http.Dir("templates")))
        http.Handle("/js/", http.FileServer(http.Dir("templates")))

        http.HandleFunc("/sse/message", func(w http.ResponseWriter, r *http.Request) {
            sendSSEMessage(w, r, &hub)
        })
        http.HandleFunc("/sse/", func(w http.ResponseWriter, r *http.Request) {
            registerSSEClient(w, r, &hub)
        })
    }
    http.Handle("/", &templateHandler{filename: "index.html", serverUrl: settings.URL})
    log.Fatal(http.ListenAndServe("localhost:8080", nil))
}
func getStrippingTargetPrefix(url string) string {
    sURL := strings.Split(url, "/")
    if len(sURL) <= 3 {
        return ""
    }
    for i := len(sURL) - 1; i >= 3; i-- {
        if sURL[i] != "" {
            return sURL[i]
        }
    }
    return ""
}
Войти в полноэкранный режим Выход из полноэкранного режима
  • Как получить длину файла в Go? — StackOverflow

Загрузка переменных окружения

appsettings.go

package main

import (
    "os"
)

type AppSettings struct {
    URL string `json:"url"`
}

func LoadAppSettings() (setting AppSettings, err error) {
    result := &AppSettings{}
    result.URL = os.Getenv("WEBRTCAPP_URL")
    if len(result.URL) <= 0 {
        result.URL = "http://localhost:8080"
    }
    return *result, err
}
Вход в полноэкранный режим Выход из полноэкранного режима

Добавление дополнительных конфигураций Nginx

Таймаут

В прошлый раз я добавил некоторые свойства в nginx.conf для использования SSE и обратного прокси.
Я заметил, что приложение устанавливает SSE-соединение, но автоматически отключается через одну минуту.

Поэтому я добавил свойство, чтобы избежать таймаута.

И я разделил конфигурации для моего Go проекта в «/etc/nginx/conf.d/webrtcapp.conf».

webrtcapp.conf

server {
    listen 443 ssl;
    server_name 192.168.XX.YYY;
    proxy_buffering off;
    proxy_cache off;
    proxy_set_header Connection '';
    proxy_http_version 1.1;
    chunked_transfer_encoding off;
    # The connection times out after 24 hours.
    proxy_read_timeout 24h;

    ssl_certificate /home/example/local_cert.pem;
    ssl_certificate_key /home/example/local_key.pem;
    location /webrtc {

        proxy_pass http://localhost:8080;
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

CORS

Я могу добавить CORS-заголовки в проект Go, как я уже пробовал.

  • [Go][Windows] Попробуйте WebView2 и CORS.

Но я также могу сделать это с помощью Nginx.

webrtcapp.conf

map $http_origin $cors {
    'http://localhost:8080' $http_origin;
    'https://192.168.XX.YYY:443' $http_origin;
}
map $request_method $cors_method {
  OPTIONS 11;
  GET  1;
  POST 1; 
  default 0;
}

server {
...
    location /webrtc {
        if ($cors_method ~ '1') {
            add_header 'Access-Control-Allow-Origin' $cors;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
            add_header 'Access-Control-Allow-Headers' '*';
        }
        if ($cors_method = '11') {
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain; charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
        }
        proxy_pass http://localhost:8080;
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Основная функциональность — Nginx
  • Модуль ngx_http_proxy_module — Nginx
  • Модуль ngx_http_core_module — Nginx
  • Поваренная книга NGINX, 2-е издание
  • Nginxで複数Originを許可するCORS設定例
  • Как разрешить доступ через CORS к нескольким доменам в nginx — StackOverflow

Оцените статью
devanswers.ru
Добавить комментарий