Webhu server kuvandudza muGolang - kubva nyore kusvika kune yakaoma

Webhu server kuvandudza muGolang - kubva nyore kusvika kune yakaoma

Makore mashanu apfuura ndakatanga gadzira Gophish, izvi zvakapa mukana wokudzidza chiGolang. Ndakaona kuti Go mutauro une simba, unotsigirwa nemaraibhurari akawanda. Enda inoshanda zvakasiyana-siyana: kunyanya, inogona kushandiswa kugadzira server-side application pasina matambudziko.

Ichi chinyorwa chiri pamusoro pekunyora sevha muGo. Ngatitangei nezvinhu zvakapfava senge "Mhoro nyika!" uye tipedze nechishandiso chine zvinotevera kugona:

-Kushandisa Let's Encrypt yeHTTPS.
-Kushanda se API router.
- Kushanda nepakati.
-Kugadziriswa kwema static mafaera.
- Kudzima chaiko.

Skillbox inokurudzira: Nzira inoshanda "Python developer kubva pakutanga".

Tinoyeuchidza: kune vese vaverengi veHabr - a 10 ruble mutengo paunenge uchinyoresa mune chero Skillbox kosi uchishandisa iyo Habr promo kodhi.

Mhoro, nyika!

Iwe unogona kugadzira sevha yewebhu muGo nekukurumidza. Heino muenzaniso wekushandisa chibatiso chinodzosera iyo "Mhoro, nyika!" yakavimbiswa pamusoro.

package main
 
import (
"fmt"
"net/http"
)
 
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
http.ListenAndServe(":80", nil)
}

Mushure meizvi, kana iwe uchimhanyisa application uye wovhura peji localhost, ipapo unobva wangoona chinyorwa chinoti “Mhoro, nyika!” (kana zvese zvichishanda nemazvo, hongu).

Tichashandisa mubatiri kakawanda gare gare, asi chekutanga ngatinzwisise kuti zvese zvinoshanda sei.

mambure/http

Muenzaniso wakashandisa package net/http, ndicho chishandiso chekutanga muGo chekugadzira ese maseva uye HTTP vatengi. Kuti tinzwisise kodhi, ngatinzwisise zvinorehwa nezvinhu zvitatu zvakakosha: http.Handler, http.ServeMux uye http.Server.

HTTP vanobata

Kana tagamuchira chikumbiro, mubati anochiongorora uye oburitsa mhinduro. MaHandlers muGo anoitwa sezvinotevera:

type Handler interface {
        ServeHTTP(ResponseWriter, *Request)
}

Muenzaniso wekutanga unoshandisa http.HandleFunc mubatsiri basa. Inoputira rimwe basa, iro rinotora http.ResponseWriter uye http.Request kupinda ServeHTTP.

Mune mamwe mazwi, vanobata muGolang vanounzwa mune imwechete interface, iyo inopa yakawanda sarudzo kune programmer. Saka, semuenzaniso, middleware inoshandiswa uchishandisa mubati, uko ServeHTTP inotanga kuita chimwe chinhu uye yobva yadaidza iyo ServeHTTP nzira yeumwe mubati.

Sezvataurwa pamusoro apa, vabati vanongogadzira mhinduro kune zvikumbiro. Asi ndeupi mugadziri anofanirwa kushandiswa pane imwe nguva nenguva?

Kumbira Routing

Kuita sarudzo chaiyo, shandisa HTTP multiplexer. Mumaraibhurari akati wandei inonzi muxer kana router, asi zvese zvakafanana. Basa remultiplexer nderokuongorora nzira yekukumbira uye sarudza mubati akakodzera.

Kana iwe uchida rutsigiro rwekuomarara nzira, saka zviri nani kushandisa yechitatu-bato raibhurari. Dzimwe dzepamusoro-soro - gorira/mux и go-chi/chi, maraibhurari aya anoita kuti zvikwanise kuita zvepakati kugadzirisa pasina matambudziko. Nerubatsiro rwavo, unogona kugadzirisa wildcard routing uye kuita akati wandei mamwe mabasa. Kubatsira kwavo kuenderana neyakajairwa HTTP vanobata. Nekuda kweizvozvo, iwe unogona kunyora nyore kodhi iyo inogona kugadziridzwa mune ramangwana.

Kushanda nemafuremu akaoma mumamiriro akajairwa kunoda zvigadziriso zvisina mwero, uye izvi zvinoomesa zvakanyanya kushandiswa kwevabatiri vekutanga. Kugadzira huwandu hukuru hwezvishandiso, musanganiswa weraibhurari yakasarudzika uye iri nyore router ichave yakakwana.

Query Processing

Pamusoro pezvo, isu tinoda chikamu chinozo "teerera" kune chinouya chinongedzo uye kuendesa zvikumbiro zvese kune mubati akakodzera. http.Server inogona kubata basa iri nyore.

Izvi zvinotevera zvinoratidza kuti sevha inobata mabasa ese ane chekuita nekubatanidza kugadzirisa. Izvi, semuenzaniso, zvinoshanda uchishandisa TLS protocol. Kuti uite iyo http.ListenAndServer call, yakajairwa HTTP server inoshandiswa.

Zvino ngatitarisei mimwe mienzaniso yakaoma kunzwisisa.

Kuwedzera Let's Encrypt

Nekumisikidza, yedu application inomhanya pamusoro peHTTP protocol, asi inokurudzirwa kushandisa HTTPS protocol. Izvi zvinogona kuitwa pasina matambudziko muGo. Kana iwe wakagamuchira chitupa uye kiyi yakavanzika, saka zvakakwana kunyoresa ListenAndServeTLS nechitupa chakakodzera uye mafaera akakosha.

http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

Unogona kugara uchiita zvirinani.

Regai Tinyora inopa zvitupa zvemahara zvine otomatiki kuvandudzwa. Kuti ushandise sevhisi, unoda pasuru autocert.

Nzira iri nyore yekuigadzirisa ndeye kushandisa autocert.NewListener nzira yakasanganiswa ne http.Serve. Iyo nzira inobvumidza iwe kuwana uye kugadzirisa TLS zvitupa nepo HTTP server ichiita zvikumbiro:

http.Serve(autocert.NewListener("example.com"), nil)

Kana tikavhura mubrowser Example.com, tichagamuchira mhinduro yeHTTPS "Mhoro, nyika!"

Kana iwe uchida mamwe akadzama gadziriso, saka iwe unofanirwa kushandisa iyo autocert.Manager maneja. Tobva tagadzira yedu ye http.Server muenzaniso (kusvika parizvino taishandisa nekusingaperi) uye towedzera maneja kune TLSConfig server:

m := &autocert.Manager{
Cache:      autocert.DirCache("golang-autocert"),
Prompt:     autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.org", "www.example.org"),
}
server := &http.Server{
    Addr:      ":443",
    TLSConfig: m.TLSConfig(),
}
server.ListenAndServeTLS("", "")

Iyi inzira iri nyore yekushandisa yakazara HTTPS rutsigiro neotomatiki chitupa kuvandudzwa.

Kuwedzera tsika nzira

Iyo default router inosanganisirwa muraibhurari yakajairwa yakanaka, asi yakakosha. Mazhinji maapplication anoda kuomesesa nzira, kusanganisira nested uye wildcard nzira, kana maitiro ekuseta nzira mapatani uye paramita.

Muchiitiko ichi, zvakakodzera kushandisa mapakeji gorira/mux и go-chi/chi. Tichadzidza nzira yekushanda neyekupedzisira - muenzaniso unoratidzwa pasi apa.

Yakapihwa iyo faira api/v1/api.go ine nzira dzeAPI yedu:

/ HelloResponse is the JSON representation for a customized message
type HelloResponse struct {
Message string `json:"message"`
}
 
// HelloName returns a personalized JSON message
func HelloName(w http.ResponseWriter, r *http.Request) {
name := chi.URLParam(r, "name")
response := HelloResponse{
Message: fmt.Sprintf("Hello %s!", name),
}
jsonResponse(w, response, http.StatusOK)
}
 
// NewRouter returns an HTTP handler that implements the routes for the API
func NewRouter() http.Handler {
r := chi.NewRouter()
r.Get("/{name}", HelloName)
return r
}

Isu tinoseta iyo api/vq prefix yenzira mune huru faira.

Isu tinogona kuzoisa izvi kune yedu hombe router pasi peapi/v1/ prefix kumashure mukushandisa kwedu kukuru:

// NewRouter returns a new HTTP handler that implements the main server routes
func NewRouter() http.Handler {
router := chi.NewRouter()
    router.Mount("/api/v1/", v1.NewRouter())
    return router
}
http.Serve(autocert.NewListener("example.com"), NewRouter())

Go kusununguka kwekushanda nenzira dzakaoma kunoita kuti zvikwanise kurerutsa kurongeka nekugadzirisa kweakakura, akaomarara maapplication.

Kushanda ne middleware

Staging inosanganisira kuputira imwe HTTP inobata neimwe, zvichiita kuti zvikwanise kukurumidza kuita chokwadi, kumanikidza, kutema matanda, uye akati wandei mamwe mabasa.

Semuenzaniso, ngatitarisei iyo http.Handler interface; tichaishandisa kunyora mubato unotendesa vashandisi vesevhisi.

func RequireAuthentication(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !isAuthenticated(r) {
            http.Redirect(w, r, "/login", http.StatusTemporaryRedirect)
            return
        }
        // Assuming authentication passed, run the original handler
        next.ServeHTTP(w, r)
    })
}

Kune wechitatu bato ma routers, akadai se chi, anotendera iwe kuti uwedzere iyo yepakati mashandiro.

Kushanda nema static mafaera

Iyo Go yakajairika raibhurari inosanganisira kugona kushanda neyakagadzika zvemukati, zvinosanganisira mifananidzo, JavaScript uye CSS mafaera. Vanogona kuwanikwa kuburikidza ne http.FileServer basa. Inodzosa mubatsiri anoshandira mafaera kubva kune yakatarwa dhairekitori.

func NewRouter() http.Handler {
    router := chi.NewRouter()
    r.Get("/{name}", HelloName)
 
// Настройка раздачи статических файлов
staticPath, _ := filepath.Abs("../../static/")
fs := http.FileServer(http.Dir(staticPath))
    router.Handle("/*", fs)
    
    return r

Izvo zvakakodzera kuyeuka kuti http.Dir inoratidza zviri mukati medhairekitori kana isina iyo main index.html faira. Muchiitiko ichi, kudzivirira dhairekitori kubva pakukanganiswa, iwe unofanirwa kushandisa iyo package unindexed.

Kudzima chaiko

Enda zvakare ine chinhu chinonzi nyasha kuvharika kweHTTP server. Izvi zvinogona kuitwa uchishandisa Shutdown() nzira. Sevha inotangwa mune goroutine, uye ipapo chiteshi chinoteererwa kuti igamuchire inovhiringidza chiratidzo. Pangosvika chiratidzo, sevha inodzima, asi kwete pakarepo, asi mushure memasekondi mashoma.

handler := server.NewRouter()
srv := &http.Server{
    Handler: handler,
}
 
go func() {
srv.Serve(autocert.NewListener(domains...))
}()
 
// Wait for an interrupt
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
 
// Attempt a graceful shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(ctx)

Semhedziso

Go imutauro une simba une raibhurari yepasi rose. Yayo yekusarudzika masimba akafara kwazvo, uye anogona kukwidziridzwa uchishandisa interfaces - izvi zvinokutendera iwe kugadzira akavimbika echokwadi maseva eHTTP.

Skillbox inokurudzira:

Source: www.habr.com

Voeg