Пишем Hello World на golang + nginx на фронте

Цель этого материала показать как можно пробросить запрос с nginx в приложение на golang. На форумах программистов заметное количество по архитектуре приложений на golang. Многие спрашивают нужен ли nginx т.к. сервер вроде как и на golang можно сразу написать. Конечно nginx желателен, хотя бы потому что это продукт который отлично выполняет свою задачу. В нём решено уже много проблем с безопасностью и он дас приложению больше гибкости. Итак, поехали!

Обновим репозиторий что бы скачать новую версию.

sudo apt-add-repository ppa:nginx/stable

Если возникла проблема:

apt-add-repository: command not found

Решение

apt-get install software-properties-common

Теперь

sudo apt update
sudo apt upgrade

Ставим nginx

sudo apt install nginx

Добавляем а автозагрузку

sudo systemctl enable nginx

Запуск, остановка nginx производится командами

service nginx start
service nginx stop

Убедится что он запущен можно командой

ps -ax | grep nginx

В ответе будут несколько строчек среди которых должна быть строчка вида:

17967 Ss 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;

Установка Golang

Официальный мануал по установке golang можно прочитать тут https://golang.org/doc/install. Но если с английским напряг или что-то не понятно, ниже моё изложение. Что бы сразу скачать go в нужную папку перейдём в usr/local командой

cd usr/local

Т.к. систему мы обновили только что (update, upgrade) то загружаем файл с компилятором golang. Посмотрите на https://golang.org/project/ какая версия последняя, я качал 1.9

wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz

Разархивируем

tar  -xvf  go1.9.linux-amd64.tar.gz

Теперь надо добавить путь к Go в переменные среды. Откройте файлы etc/profile и etc/bashrc и добавьте в его конец строчку:

export PATH=$PATH:/usr/local/go/bin

В etc/profile нужно добавить путь к папке для проектов, для этого используется переменная GOPATH:

export GOPATH=$HOME/work/

Проверяем

go version

Если всё работает то идём в директорию usr/local/go и создаём файл monkey.go запишем в него такой код:

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

Это веб-сервер в одну строчку + веб-приложение, которое покажет нам фразу Hi there, I love monkeys!

Если вам лень это писать в консоли, то копируете, закидываете на любой удалённый сервер и просто качаете удалённый файл командой

wget http://your_url/monkey.go

Теперь делаем

go build monkey.go

Теперь надо перенаправить все запросы на это приложение. Сделаем это с помощью nginx. Посмотрите главный файл etc/nginx, в нём указано какие конфигурации подключены, в моём случае командой include значилось подключение всех конфигов из папки etc/nginx/modeules-enabled/*.conf но указанная папка с конфигами пустая, поэтому ищем дальше. У меня были строки:

include etc/nginx/conf.d/*.conf;
include etc/nginx/sites-enabled/*;

В папке sites-enabled находился только один конфиг, который назывался default. Открываем его, находим раздел location / { Закомментируем всё что там есть поставив # вначале строки и вписываем в этот блок новую строку:

proxy_pass http://127.0.0.1:8080;

Сохраняем, закрываем, заставляем nginx взять новую конфигурацию командой:

nginx -s reload

Это более правильный вариант скормить новую конфигурацию nginx чем просто перезапуск, потому что веб-сервер сначала сам её протестирует, и если есть какие-то ошибки, то сообщит об этом. В противном случае при жёстком перезапуске nginx просто не стартует и придётся лезть в логи и разбираться что не так.

Что же мы сделали? Все входящие запросы направили с помощью nginx на порт 8080, а программа на golang как раз слушает порт 8080, что видно в строчке:

http.ListenAndServe(":8080", nil)

Теперь заходим на адрес вашего сервера, например http://82.82.82.82/monkey и видим в браузере надпись Hi there, I love monkey!

Linux golang