Цель этого материала показать как можно пробросить запрос с 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!