Как развернуть веб-приложение Go с помощью Nginx в Ubuntu 18.04

_Автор выбрал Tech Education Fund для получения пожертвования в рамках программы Write for DOnations. _

Вступление

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

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

В этом руководстве вы создадите веб-приложение + Hello World на Go и развернете его на сервере Ubuntu 18.04, используя Nginx в качестве обратного прокси-сервера.

Предпосылки

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

  • Один сервер Ubuntu 18.04, настроенный по следующей инструкции initial server для Ubuntu 18.04, включая sudo non -руткит и брандмауэр.

  • Https://www.digitalocean.com/community/tutorial_series/how-to-code-in-go[Go] язык программирования, установленный по следующей ссылке https://www.digitalocean.com/community/tutorials/how-to- install-go-and-set-up-a-local-program-environment-on-ubuntu-18-04 [Как установить Go и настроить локальную среду программирования в Ubuntu 18.04].

  • Nginx, установленный следующим на Ubuntu 18.04]. Не следуйте https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04#step-5-%E2%80%93-setting-up-server- blocks- (рекомендуется) [* Шаг 5 - Настройка блоков сервера *]; вы создадите серверный блок Nginx позже в этом руководстве.

  • Доменное имя указывало на ваш сервер, как описано в Как настроить имя хоста с DigitalOcean. Этот урок будет использовать ++ повсюду. Это необходимо для получения сертификата SSL для вашего веб-сайта, чтобы вы могли безопасно обслуживать свое приложение с шифрованием TLS.

Кроме того, чтобы обеспечить развертывание веб-приложения Go на уровне производства, важно обеспечить безопасность сервера, установив сертификат TLS / SSL. Этот шаг * настоятельно рекомендуется *. Чтобы обезопасить свое веб-приложение Go, следуйте How To Secure Nginx с Let’s Encrypt на Ubuntu 18.04 после * шага 3 * этого руководства, чтобы получить бесплатный сертификат TLS / SSL.

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

На этом шаге вы создадите пример веб-приложения Go, которое отображает + Hello World в` ++ и приветствует пользователя в + / greet / + `. Если вы хотите узнать больше об основах программирования на Go, ознакомьтесь с нашим How To Напиши свою первую программу на Go.

Сначала создайте новый каталог в вашем каталоге https://www.digitalocean.com/community/tutorials/understanding-the-gopath [+ GOPATH +] для хранения исходного файла. Вы можете назвать папку как угодно, но в этом уроке будет использоваться ++:

mkdir $GOPATH/

Следуя структуре файла, предложенной в обязательном учебном пособии https://www.digitalocean.com/community/tutorials/how-to-install-go-and-set-up-a-local-programming-environment-on-ubuntu-18 -04 [Как установить Go и настроить локальную среду программирования в Ubuntu 18.04], это даст вашему каталогу путь + ~ / go / go-web +.

Затем выполните следующую команду, чтобы изменить каталог на вновь созданную папку в вашем + GOPATH +:

cd $GOPATH/go-web

Используйте + nano + или предпочитаемый вами текстовый редактор, чтобы создать файл с именем + main.go +, который будет содержать исходный код вашего веб-приложения:

nano main.go

Чтобы создать функциональность приложения + Hello World +, добавьте следующий код Go во вновь созданный файл + main.go +:

~ / Идти / ехать-веб / main.go

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)
}

Теперь давайте рассмотрим, что будет делать предыдущий фрагмент кода, начиная с первой строки.

Сначала вы написали точку входа в свое приложение:

~ / Идти / ехать-веб / main.go

package main
...

+ Package main + говорит компилятору Go скомпилировать этот файл как исполняемую программу, а не как разделяемую библиотеку.

Далее у вас есть операторы + import +:

~ / Идти / ехать-веб / main.go

...

import (
   "fmt"
   "net/http"
)
...

Этот фрагмент импортирует необходимые модули, необходимые для работы этого кода, которые включают стандартный пакет + fmt + и пакет + net / http + для вашего веб-сервера.

Следующий фрагмент создает ваш первый маршрут в функции + main +, которая является точкой входа любого приложения Go:

~ / Идти / ехать-веб / main.go

...
func main () {
   http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
       fmt.Fprintf(w, "Hello World")
   })
 ...
}
...

Родительский маршрут + / + создается внутри + func main +, который будет возвращать текст + Hello World + при запросе.

Второй маршрут, как показано в следующем фрагменте, принимает параметр URL, в данном случае имя, для отображения в сопровождении приветствия.

~ / Идти / ехать-веб / main.go

...
func main () {
 ...
   http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) {
       name := r.URL.Path[len("/greet/"):]
       fmt.Fprintf(w, "Hello %s\n", name)
   })
...
}
...

При этом используется + URL.Path + в Go, чтобы сохранить значение сразу после + / greet / + и передать его как имя из параметра URL.

Наконец, вы создаете экземпляр своего сервера:

~ / Идти / ехать-веб / main.go

...
func main () {
 ...
 http.ListenAndServe(":9990", nil)
}

Предыдущий фрагмент запускает сервер и предоставляет ваше приложение через порт + 9990 +, используя встроенный сервер Go + + http + `.

Когда вы закончите изучение кода в + main.go +, сохраните файл и выйдите из текстового редактора.

Затем создайте двоичный исполняемый файл вашего приложения, выполнив:

go build main.go

Предыдущая команда скомпилирует + main.go + для создания исполняемого файла с названием + main +.

Вы создали образец веб-приложения Go. Затем вы создадите системный файл systemd, чтобы приложение работало в фоновом режиме, даже если вы не обращаетесь к своему серверу.

Шаг 2 - Создание файла системного блока

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

Сначала создайте новый файл в каталоге + / lib / systemd / system с именем` + goweb.service ie`, используя + nano +, или вы предпочитаете текстовый редактор:

sudo nano /lib/systemd/system/goweb.service

Чтобы установить параметры сервиса, добавьте в файл следующий фрагмент.

/lib/systemd/system/goweb.service

[Unit]
Description=goweb

[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/home//go/go-web/main

[Install]
WantedBy=multi-user.target

Переменная + ExecStart = / home // go / go-web / main + указывает, что точка входа для этого сервиса находится через исполняемый файл + main +, расположенный в + / home // go / go-web + каталог, где ++ - это имя пользователя учетной записи sudo на сервере. + Restart = всегда + гарантирует, что systemd всегда будет пытаться перезапустить программу, если она остановится. На следующей строке + RestartSec = 5s + устанавливает пятисекундное время ожидания между попытками перезапуска. + WantedBy = multi-user.target + указывает, в каком состоянии ваш сервер включит службу.

Сохраните и выйдите из файла.

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

sudo service goweb start

Чтобы подтвердить, работает ли служба, используйте следующую команду:

sudo service goweb status

Вы получите следующий вывод:

Output● goweb.service - goweb
  Loaded: loaded (/lib/systemd/system/goweb.service; disabled; vendor preset: enabled)
  Active: active (running) since Wed 2019-07-17 23:28:57 UTC; 6s ago
Main PID: 1891 (main)
   Tasks: 4 (limit: 1152)
  CGroup: /system.slice/goweb.service
          └─1891 /home//go/go-web/main

Чтобы узнать больше о работе с модульным файлом systemd, взгляните на Understanding единицы Systemd и файлы модулей.

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

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

На этом шаге вы создадите блок сервера Nginx и настроите обратный прокси-сервер Nginx, чтобы выставить свое приложение в Интернете.

Сначала измените ваш рабочий каталог на каталог Nginx + sites-available +:

cd /etc/nginx/sites-available

Создайте новый файл с именем домена, на котором вы хотите выставить свою заявку. Этот урок будет использовать ++:

sudo nano

Добавьте следующие строки в файл, чтобы установить настройки для ++:

/ И т.д. / Nginx / сайты Недоступные / your_domain

server {
   server_name  ;

   location / {
       proxy_pass http://localhost:9990;
   }
}

Этот блок сервера Nginx использует http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass [+ proxy_pass +] для обслуживания веб-приложения Go на IP-адресе вашего сервера, обозначенном как + localhost +, чтобы сделать его запустить на порт + 9990 +. + имя_сервера + указывает имя домена, сопоставленное с вашим IP-адресом, в данном случае ` и `.

Затем создайте символическую ссылку этой конфигурации Nginx в папке + sites-enabled +, выполнив следующую команду:

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

Символьная ссылка - это ярлык файла в другом месте. Вновь созданный ярлык всегда будет ссылаться на исходный файл для корректировки на обновления, когда в него будут внесены изменения. Nginx требует копию конфигурации в обоих каталогах.

Затем перезагрузите ваши конфигурации Nginx, выполнив команду reload:

sudo nginx -s reload

Чтобы убедиться, что ваше развертывание работает, зайдите в браузер + http: // +. Вас встретит текстовая строка * Hello World *.

Теперь вы настроили обратный прокси-сервер Nginx для показа своего приложения на своем доменном имени и защитили свое веб-приложение Go с помощью SSL / TLS. На следующем этапе вы будете тестировать свое приложение через безопасное соединение.

Шаг 4 - Тестирование приложения

На этом этапе вы протестируете свое приложение через безопасное соединение, чтобы убедиться, что все работает.

Откройте предпочитаемый веб-браузер, перейдите по ссылке + https: // +:

изображение: https: //assets.digitalocean.com/articles/66224/Hello_World.png [Экран страницы Hello World]

Вы получите простое сообщение «+ Hello World». Получение этого сообщения при использовании + https: // + в URL-адресе означает, что ваше приложение обслуживается через безопасное соединение.

Затем попробуйте перейти ко второму маршруту + https: /// greet / +, заменив ++ на любое имя, которое должно приветствовать ваше приложение:

изображение: https: //assets.digitalocean.com/articles/66224/Greet.png [Отображение страницы приветствия]

Приложение возвратит простое приветствие вместе с ++, которое основано на параметре, переданном в URL.

Получив эти результаты, вы успешно развернули свое веб-приложение Go.

Заключение

В этом руководстве вы создали простое веб-приложение для Go с использованием его стандартных библиотек, настроили обратный прокси-сервер с помощью Nginx и использовали SSL-сертификат в своем домене для защиты своего приложения. Чтобы узнать больше о Go, посмотрите их official документацию. Кроме того, вы можете посмотреть нашу серию How To Code in Go, чтобы узнать больше о программировании на этом эффективном языке.

Related