_Автор выбрал 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, чтобы узнать больше о программировании на этом эффективном языке.