Здравствуйте.
Я не программист, а так программирую для себя так что прошу это учитывать.
Я попытаюсь максимально подробно описать свою проблему и принимаемые мной шаги для её решения.
На данный момент я не могу настроить 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 и ни чего не помогло.
Подскажите пожалуйста мне как мне решить мою проблему!
Заранее благодарен за ответ.