Go — это язык программирования общего назначения с открытым исходным кодом. Он был вдохновлен производительностью Python, предлагая при этом возможности C. Изначально он был разработан компанией Google для решения проблем, с которыми они сталкивались в своей кодовой базе (сложность кода и долгое время компиляции). Как и любой другой современный язык программирования, Go подходит для самых разных целей. Например, его можно использовать для веб-разработки, написания скриптов командной строки, сетевых серверных приложений, фронтенд-разработки и т. д.
В этом руководстве мы проведем вас по шагам развертывания простого веб-приложения на Go на Ubuntu 22.04 LTS. Мы также настроим обратный прокси-сервер Nginx для обработки нагрузки трафика.
Prerequisites
Для выполнения шагов, описанных в этом руководстве, вам понадобятся следующие предварительно настроенные компоненты:
- Правильно настроенная Ubuntu Узнайте больше о настройке собственного сервера Ubuntu на CloudSigma.
- Среда программирования Go с необходимыми переменными окружения ( $GOROOT и $GOPATH). Ознакомьтесь с руководством по настройке среды программирования Go на Ubuntu.
- Nginx для обратного прокси. В этом руководстве подробно описана установка и настройка Nginx на Ubuntu.
- Подходящий текстовый редактор для работы с кодом Go, например, Atom, Sublime Text, Brackets, VS Code, Vim, и т. д. В этом руководстве в качестве текстового редактора мы выберем VS Code.
Если сервис должен быть доступен по доменному имени, у вас должно быть FQDN, указывающее на сервер. В этом случае рекомендуется защитить Nginx с помощью SSL. Вы можете узнать больше об обеспечении безопасности Nginx с помощью Let’s Encrypt на Ubuntu из нашего руководства.
Шаг 1 – Создание веб-приложения на Go
Мы создадим простое веб-приложение на Go, которое будет выводить на экран “Hello World” при переходе по домену. Кроме того, приложение будет приветствовать пользователя при переходе по адресу <domain>/greet/<username>.
Начните с создания нового проекта в $GOPATH. Создайте директорию проекта:
|
1 |
mkdir -pv $GOPATH/go-web |

Перейдите в созданную директорию:
|
1 |
cd $GOPATH/go-web |

Затем инициализируйте проект:
|
1 |
go mod init <package_name> |

Затем создайте файл main.go который будет служить корнем нашего приложения Go. В нем будет находиться исходный код нашего веб-приложения:
|
1 |
touch main.go |
Откройте проект в VS Code:
|
1 |
code . |
Вставьте следующий код в файл main.go:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name:= r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) }) http.ListenAndServe(":9990", nil) } |

Давайте кратко разберем только что созданную программу на Go:
- Выражение package main служит точкой входа в наше приложение. Оно также указывает компилятору Go компилировать файл как исполняемый файл, а не как общую библиотеку.
- Инструкция import импортирует все дополнительные модули, необходимые для работы программы. Здесь мы импортировали пакеты fmt (для вывода текста) и net/http (для веб-серверных приложений).
- С помощью функции
http.HandleFunc, мы определили два маршрута:
- Первый маршрут / служит родительским маршрутом внутри func main.
- Второй маршрут
/greet/ принимает параметр URL (в данном случае строку). Затем эта строка отображается вместе с приветственным сообщением.
- URL Path используется для хранения значения после /greet/. Затем значение передается как name параметра URL.
- Функция http.ListenAndServe запускает веб-сервер. В данном случае она прослушивает порт 9990.
Теперь, когда наша программа готова, скомпилируйте файл в исполняемый файл:
|
1 |
go build main.go |
Компилятор Go создаст исполняемый файл с тем же именем, что и файл. Посмотрите на вывод:
|
1 |
ls -lh |
Шаг 2 – Настройка юнит-файла systemd для фонового выполнения
До этого момента, если текущий пользователь выйдет из системы, веб-приложение Go прекратит работу. Это плохое решение для веб-сервера. Чтобы решить эту проблему, мы создадим юнит-файл systemd, чтобы приложение продолжало работать в фоновом режиме, даже когда пользователь выходит из системы. Это приближает конфигурацию к развертыванию промышленного уровня.
Создайте отдельный systemd файл goweb.service в директории /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Добавьте следующий фрагмент кода в юнит-файл:
|
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/<username>/go/go-web/main [Install] WantedBy=multi-user.target |

Здесь,
- Переменная ExecStart указывает точку входа для службы через основной исполняемый файл, расположенный в каталоге нашего проекта ( $GOPATH/go-web). Обратите внимание, что вместо указания $GOPATH, мы ввели полный путь к исполняемому файлу. Это связано с тем, что переменная $GOPATH видима только пользователю.
- Переменная Restart указывает systemd, что делать в случае остановки программы. Значение always указывает systemd перезапускать программу каждый раз, когда она прекращает работу.
- Переменная RestartSec указывает systemd подождать определенное время перед попыткой перезапуска программы. Здесь значение установлено на 5s (5 секунд).
- Инструкция WantedBy=multi-user.target указывает, в каком состоянии systemd активирует службу.
Сохраните файл и закройте редактор. Запустите службу:
|
1 |
sudo service goweb start |

Проверьте, запущена ли служба и работает ли она:
|
1 |
sudo service goweb status |

Как видно из вывода, приложение запущено и работает. Теперь мы готовы использовать Nginx в качестве обратного прокси-сервера.
Шаг 3 – Настройка Nginx в качестве обратного прокси-сервера
Теперь мы создадим блок сервера для Nginx, чтобы он работал как обратный прокси-сервер. Веб-приложение будет доступно в Интернете через обратный прокси-сервер (для дополнительной производительности и безопасности).
Измените текущий активный каталог на sites-available:
|
1 |
cd /etc/nginx/sites-available |

Теперь создайте файл с доменным именем, по которому вы хотите открыть доступ к вашему приложению. Для демонстрации мы будем использовать example.com:
|
1 |
sudo nano example.com |
Введите следующий код в файл блока:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Здесь мы используем proxy_pass для обслуживания веб-приложения Go на IP-адресе сервера (localhost) на порту 9990.
Чтобы включить блок Nginx, создайте символическую ссылку (также известную как мягкая ссылка) файла в папку sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Перезагрузите конфигурацию Nginx, чтобы изменения вступили в силу:
|
1 |
sudo nginx -s reload |
Шаг 4 – Проверка
Если всё прошло как ожидалось, то веб-приложение теперь должно быть доступно по адресу localhost:9990 и настроенному нами домену. Откройте URL в веб-браузере:
|
1 |
localhost:9990 |

Как и ожидалось, приложение выводит “Hello World” на экран. Это задача основного маршрута. Затем протестируйте второй маршрут, перейдя по следующему URL-адресу:
|
1 |
localhost:9990/greet/<name> |

Приложение успешно возвращает простое приветственное сообщение с именем из параметра, полученного из URL.
Вуаля! Мы успешно развернули веб-приложение на Go на нашем локальном сервере!
Заключительные мысли
В этом руководстве мы продемонстрировали развертывание простого веб-приложения на Go с помощью стандартных библиотек Go. Мы также развернули обратный прокси-сервер с помощью Nginx. Хотя демонстрация проводилась на локальном сервере, для публичного сервера настоятельно рекомендуется внедрить SSL-сертификат для безопасного доступа из Интернета. Для получения дополнительной информации о программировании на Go вы можете ознакомиться с нашим руководством по Сборке и установке программ на Go.
Приятной работы!


Комментарии
Комментариев пока нет. Будьте первым.