Назад в блог

Развертывание веб-приложения Go с использованием Nginx на Ubuntu 22.04

Развертывание веб-приложения Go с использованием Nginx на Ubuntu 22.04

Go — это язык программирования общего назначения с открытым исходным кодом. Он был вдохновлен производительностью Python, предлагая при этом возможности C. Изначально он был разработан компанией Google для решения проблем, с которыми они сталкивались в своей кодовой базе (сложность кода и долгое время компиляции). Как и любой другой современный язык программирования, Go подходит для самых разных целей. Например, его можно использовать для веб-разработки, написания скриптов командной строки, сетевых серверных приложений, фронтенд-разработки и т. д.

В этом руководстве мы проведем вас по шагам развертывания простого веб-приложения на Go на Ubuntu 22.04 LTS. Мы также настроим обратный прокси-сервер Nginx для обработки нагрузки трафика.

Prerequisites

Для выполнения шагов, описанных в этом руководстве, вам понадобятся следующие предварительно настроенные компоненты:

Если сервис должен быть доступен по доменному имени, у вас должно быть FQDN, указывающее на сервер. В этом случае рекомендуется защитить Nginx с помощью SSL. Вы можете узнать больше об обеспечении безопасности Nginx с помощью Let’s Encrypt на Ubuntu из нашего руководства.

Шаг 1 – Создание веб-приложения на Go

Мы создадим простое веб-приложение на Go, которое будет выводить на экран “Hello World” при переходе по домену. Кроме того, приложение будет приветствовать пользователя при переходе по адресу <domain>/greet/<username>.

Начните с создания нового проекта в $GOPATH. Создайте директорию проекта:

Go Web Application Make Dir

Перейдите в созданную директорию:

Go Web Application Change Dir

Затем инициализируйте проект:

Go Web Application Init Project

Затем создайте файл main.go который будет служить корнем нашего приложения Go. В нем будет находиться исходный код нашего веб-приложения:

Откройте проект в VS Code:

Вставьте следующий код в файл main.go:

Go Web Application Main Go

Давайте кратко разберем только что созданную программу на Go:

  • Выражение package main служит точкой входа в наше приложение. Оно также указывает компилятору Go компилировать файл как исполняемый файл, а не как общую библиотеку.
  • Инструкция import импортирует все дополнительные модули, необходимые для работы программы. Здесь мы импортировали пакеты fmt (для вывода текста) и net/http (для веб-серверных приложений).
  • С помощью функции http.HandleFunc, мы определили два маршрута:
    • Первый маршрут / служит родительским маршрутом внутри func main.
    • Второй маршрут /greet/ принимает параметр URL (в данном случае строку). Затем эта строка отображается вместе с приветственным сообщением.
      • URL Path используется для хранения значения после /greet/. Затем значение передается как name параметра URL.
    • Функция http.ListenAndServe запускает веб-сервер. В данном случае она прослушивает порт 9990.

Теперь, когда наша программа готова, скомпилируйте файл в исполняемый файл:

Компилятор Go создаст исполняемый файл с тем же именем, что и файл. Посмотрите на вывод:

Go Web Application ls -lh

Шаг 2 – Настройка юнит-файла systemd для фонового выполнения

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

Создайте отдельный systemd файл goweb.service в директории /lib/systemd/system:

Добавьте следующий фрагмент кода в юнит-файл:

go web service

Здесь,

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

Сохраните файл и закройте редактор. Запустите службу:

go web start

Проверьте, запущена ли служба и работает ли она:

go web status

Как видно из вывода, приложение запущено и работает. Теперь мы готовы использовать Nginx в качестве обратного прокси-сервера.

Шаг 3 – Настройка Nginx в качестве обратного прокси-сервера

Теперь мы создадим блок сервера для Nginx, чтобы он работал как обратный прокси-сервер. Веб-приложение будет доступно в Интернете через обратный прокси-сервер (для дополнительной производительности и безопасности).

Измените текущий активный каталог на sites-available:

cd

Теперь создайте файл с доменным именем, по которому вы хотите открыть доступ к вашему приложению. Для демонстрации мы будем использовать example.com:

 

Введите следующий код в файл блока:

example.com

Здесь мы используем proxy_pass для обслуживания веб-приложения Go на IP-адресе сервера (localhost) на порту 9990.

Чтобы включить блок Nginx, создайте символическую ссылку (также известную как мягкая ссылка) файла в папку sites-enabled:

create sym

Перезагрузите конфигурацию Nginx, чтобы изменения вступили в силу:

reload nginx

Шаг 4 – Проверка

Если всё прошло как ожидалось, то веб-приложение теперь должно быть доступно по адресу localhost:9990 и настроенному нами домену. Откройте URL в веб-браузере:

Hello World

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

Hello Cloud

Приложение успешно возвращает простое приветственное сообщение с именем из параметра, полученного из URL.

Вуаля! Мы успешно развернули веб-приложение на Go на нашем локальном сервере!

Заключительные мысли

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

Приятной работы!

author

Pranay Kapgate

Автор · CloudSigma

Preslav Dobrev — креативный дизайнер в CloudSigma, сосредоточенный на формировании последовательного корпоративного образа с помощью традиционных и инновационных маркетинговых каналов. Он умело сочетает художественное видение со стратегическим маркетингом, создавая убедительные истории бренда.

Комментарии

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