@sdima75
Любитель

Как правильно настроить nginx для сервера написанного на go?

Здравствуйте.
Я не программист, а так программирую для себя так что прошу это учитывать.
Я попытаюсь максимально подробно описать свою проблему и принимаемые мной шаги для её решения.
На данный момент я не могу настроить nginx для сервера написанного на go который работает с шаблонами.

Операционная система на сервере - Linux Debian 11, разрядность 64.

Простой работающий проект:
Код:
package main

import (
	"fmt"
	"net/http"
)

type msg string

func (m msg) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
	fmt.Fprint(resp, m)
}
func main() {
	msgHandler := msg("Hello from Web Server in Go")
	fmt.Println("Server is listening...")
	http.ListenAndServe("localhost:3002", msgHandler)
}


Дальнейшая настройка:
Создал папку для проекта и указал следующие настройки:
your_domain – полное имя моего домена (имя, точка, доменная зона - типа mysite.ru. Сайт не буду указывать, он без надобности сейчас...)
mkdir /var/www/your_domain/
chmod -R 0755 /var/www/your_domain/  
chown -R www-data:www-data /var/www/your_domain/

Дальше:
В файле nano /lib/systemd/system/your_domain.service

(your_domain – так же является именем исполняемого файла.
Под windows командой GOOS=linux GOARCH=amd64 go build -o ./your_domain данный файл был собран.
Разрядность операционной системы 64 на windows и linux.
На windows код работает нормально.)

Пишем:
[Unit]
Description=your_domain

[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/var/www/your_domain/your_domain 

[Install]
WantedBy=multi-user.target


Запускаем и проверяем службу:
service goweb start
service goweb status

Всё работает (active – зелёным светом).

Настраиваем «Reverse Proxy with Nginx»:
В файле cd /etc/nginx/sites-available

Пишем:
server {
    server_name your_domain www.your_domain;

    location / {
        proxy_pass http://localhost:3002;
    }
}


Создаём ссылки и перезапускаем Nginx:
ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/your_domain
nginx -s reload

Тестируем и всё работает. В браузере указываем наш домен и видим нашу надпись "Hello from Web Server in Go".

Код который не работает:

package main

import (
	"fmt"
	"html/template"
	"net/http"
)

type ViewData struct {
	Title   string
	Message string
}

func main() {

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

		data := ViewData{
			Title:   "My site",
			Message: "start WOW!",
		}
		tmpl, err := template.ParseFiles("templates/index.html")
		if err != nil {
			fmt.Println(err)
		}
		tmpl.Execute(w, data)
	})

	fmt.Println("Server is listening...")
	http.ListenAndServe("localhost:3002", nil)
}


Добавляем папку и выставляем права:
mkdir mkdir /var/www/your_domain/templates
Переносим нашу html страницу index.html с нашего компьютера на сервер.
Обновляем всем права:
chmod -R 0755 /var/www/your_domain/
chown -R www-data:www-data /var/www/your_domain/

Видим:
/var/www#
drwxr-xr-x 2 www-data www-data 4096 Nov 22 13:02 html
drwxr-xr-x 3 www-data www-data 4096 Nov 22 13:47 your_domain

/var/www/your_domain#
-rwxr-xr-x 1 www-data www-data 8522492 Nov 22 13:47 your_domain 
drwxr-xr-x 2 www-data www-data    4096 Nov 22 13:47 templates

/var/www/your_domain/templates#
-rwxr-xr-x 1 www-data www-data 217 Nov 22 13:47 index.html


Останавливаем, запускаем и проверяем службу:
service goweb stop
service goweb start
service goweb status

Всё работает (active – зелёным светом).

Перезагружаем Nginx:
nginx -s reload

Видим:
502 Bad Gateway
nginx/1.18.0

Смотрим на ошибку:
tail -f /var/log/nginx/error.log

Видим:
2022/11/22 13:55:41 [error] 2145#2145: *22 upstream prematurely closed connection while reading response header from upstream, client: (мой ip) , server: (мой домен), request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:3002/", host:  (мой домен)
2022/11/22 13:55:41 [error] 2145#2145: *22 connect() failed (111: Connection refused) while connecting to upstream, client: (мой ip), server:  (мой домен), request: "GET / HTTP/1.1", upstream: "http://[::1]:3002/", host:  (мой домен)


Что делал дальше:

1. В nano /lib/systemd/system/your_domain.service добавил
User=www-data
Group=www-data

Итог: 502 Bad Gateway.

2. Права 775 поставил вместо 755. Всё по стандарту. Система стартует нормально. Итог: 502 Bad Gateway.
[error] 2145#2145: *22 upstream prematurely closed connection while reading response header from upstream, client: (мой ip) , server: (мой домен), request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:3002/", host:  (мой домен)
[error] 2145#2145: *22 connect() failed (111: Connection refused) while connecting to upstream, client: (мой ip), server:  (мой домен), request: "GET / HTTP/1.1", upstream: "http://[::1]:3002/", host:  (мой домен)


3. Дальше менял различные настройки. Добавлял:
В /etc/nginx/sites-available/your_domain изменил на
server {
    listen 80;
    server_name your_domain www.your_domain ;

    client_max_body_size 256m;
    access_log  /var/log/nginx-site-acc;
    error_log /var/log/nginx-site-err;
    log_not_found off;

    location ^~ / {
        proxy_pass http://localhost:3002;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffer_size 16k;
        proxy_buffers 32 16k;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
    }

    location ^~ /files {
        alias /var/www/your_domain/;
    }
}

Итог: 502 Bad Gateway…

Были и различные варианты этого файла где было чуть меньше настроек, но не помогло.
Например:
server {
   listen 80;
   listen [::]:80;

   server_name    golanghelloworld.hackersandslackers.app;

   location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass https://127.0.0.1:3002;
    }

    location ~ /.well-known {
        allow all;
    }

}

Так же пробовал другие варианты которые были предложены в интернете.

4. Создавал пользователя и в его home была размещена папка с исполняемым файлом и html. Это не помогло. Добавлял пользователя в группу www-data и www-data в группу пользователя, но это не помогло.

5. В /etc/nginx/sites-available/your_domain
send_timeout 800;
   proxy_send_timeout 800;
   proxy_connect_timeout 800;  
   proxy_read_timeout 800;

Указывал только цифры (800), а так же с буквой s (800s)
Итог: 502 Bad Gateway…

6. Пробовал так же другие операционные системы — Debian 10, Ubuntu 18, 20, 22 но не помогло. (Повторюсь, я не программист и я даже так пытался решить проблему :-) )

Важно: всегда после внесения изменений я перезагружал сервис моего домена и проверял его работоспособность. А так же перезагружал nginx.

Парюсь уже больше недели… Весь интернет пересмотрел и многое варианты решения попробовал, но не помогло. Пробовал так же изменения в nginx.conf. Предлагали сделать изменения в / etc / hosts и ни чего не помогло.

Подскажите пожалуйста мне как мне решить мою проблему!
Заранее благодарен за ответ.
  • Вопрос задан
  • 998 просмотров
Решения вопроса 1
jamakasi666
@jamakasi666 Куратор тега Linux
Просто IT'шник.
Могу посоветовать перейти на caddy вместо nginx. Он очень сильно проще и множество вещей включены по умолчанию сразу. Как пример он сам будет получать сертификаты и обновлять их, может и самоподписанный сертификат гонять самже. По умолчанию сразу пробрасываются все хедеры вебсокеты и прочее. В общем оно очень простое и удобное при этом мощное.
Как пример, все с чем вы мучаетесь выше в реалиях caddy выглядит так.
golanghelloworld.hackersandslackers.app {
	reverse_proxy 127.0.0.1:3002
}


Дополнительное могу порекомендовать не использовать имя localhost а использовать напрямую 127.0.0.1.
В коде вообще лучше слушать на всех интерфейсах, т.е. использовать такую запись
http.ListenAndServe(":3002", nil)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы