Kunezindlela ezimbalwa ezingabizi zokusingatha iwebhusayithi emile ekhiqizwe ngomshini wokuphehla ugesi omile njenge-Jekyll, i-Hugo, noma i-Pelican: Yonke le bhulogi ikhiqizwa ngokwezibalo kusetshenziswa i-Jekyll. Nokho, angikwazi ukusebenzisa noma yiziphi izinketho ezingenhla, ngoba, phakathi nokuphila kwale bhulogi, ngishintshe amagama esizinda, ngashintsha izinhlelo ze-URL, futhi ngaqamba kabusha okuthunyelwe, futhi ngifuna gcina ephila wonke ama-URL amadala Kade ngibamba le bhulogi ngisebenzisa i-Apache futhi, muva nje, nginx emshinini owodwa we-virtual, futhi izici zokuqondisa kabusha zanoma iyiphi ingxenye yesofthiwe zisebenza kahle, kodwa bengilungele ukuyisingatha ndawana thize entsha nehlukile. Okuthunyelwe kwangaphambilini kuchaza ukuthi ngiwaqondisa kanjani kabusha ama-URL asuka esizindeni esidala aye esizindeni esisha esebenzisa i-Google App Engine nePython, kodwa manje ngase ngidinga indlela yokunikeza okuqukethwe okumile. **kanye** iqondise kabusha ama-URL asuka esizindeni esifanayo. Yona leyo mfuneko yokuqondisa kabusha isizinda yingakho ngingakwazi ukusebenzisa isici sokuqukethwe esimile kuphela se-Google App Engine's (okuxhunywe ohlwini olungenhla). Nokho, ngingasebenzisa i-Google App Engine ngihlanganise nohlelo lwe-Golang olulula ukuze nginikeze kokubili okuqukethwe okumile **kanye** nokuqondisa kabusha kwesizinda esifanayo. ## Kungani i-Google App Engine? Ngaphambi kokuthi ungene kukho konke okuthunyelwe, mhlawumbe uyazibuza, kungani ubamba ibhulogi ku-Google App Engine? Nazi izizathu zami zokuthi kungani: - Uma ithrafikhi yakho ingena ngaphakathi kwe-App EngineâÃÂÃÂs esigabeni samahhala samahora angu-28 kanye no-1 GB wethrafikhi yokuphuma ngosuku, ukusingatha ibhulogi kumahhala. - Ukuvuselela kabusha kwenziwa ngomyalo owodwa - Ukugawula nokuqapha kuhlanganiswe kusetshenziswa i-Stackdriver - Ukukala phezulu naphansi okuzenzakalelayo okusekelwe emaphethini omgwaqo - Ngokuchofoza okumbalwa, amalogi ewebhu angaphushwa kalula entweni efana ne-BigQuery ukuze agcinwe isikhathi eside kanye nokuhlaziywa kwe-ad hoc - Izitifiketi ze-SSL eziphethwe kusetshenziswa i-LetÃÂÃÂs Encrypt ## Izimfuneko Lokhu okuthunyelwe kuthatha okulandelayo: - Ujwayelene ne-Google Cloud Platform (GCP) futhi usuvele udale Iphrojekthi ye-GCP - Ufake i-Google Cloud SDK - Uyiqinisekisile i- gcloudcommand ngokumelene ne-Akhawunti yakho ye-Google Dala iphrojekthi ye-GCP Uma ungakakhi i-a **Iphrojekthi ye-GCP landela lezi zinyathelo: - Vula isiphequluli sewebhu, bese udala noma ungene ku-Akhawunti ye-Google - Zulazulela ku-GCP Console - Uma lena kuyiphrojekthi yakho yokuqala ye-GCP, uzotshelwa ukuthi udale Iphrojekthi ye-GCP. I-akhawunti ye-Google ngayinye ithola u-$300 esikweletu ongawusebenzisa phakathi nezinyanga ezingu-12 ku-GCP. Kudingeka ukuthi ufake ikhadi lesikweletu ukuze udale Iphrojekthi ye-GCP, kodwa ngeke ikhokhiswe kuze kuphele ikhredithi engu-$300 noma izinyanga ezingu-12 ziphelelwe yisikhathi. - Uma lena kuyiProjekthi ye-GCP entsha, uzodinga ukunika amandla i-Compute Engine API ngokuzulazulela esigabeni se-Compute Engine se-GCP Console bese ulinda ukuqaliswa kuqedwe. Faka i-Google Cloud SDK Uma ungakayifaki i- **I-Google Cloud SDK landela imiyalo lapha Qinisekisa i-gcloud Uma usudale Iphrojekthi ye-GCP futhi wafaka i-Google Cloud SDK, isinyathelo sokugcina ukufakazela ubuqiniso umyalo we-gcloud ku-Akhawunti yakho ye-Google. Vula uhlelo lwakho lokusebenza bese usebenzisa umyalo olandelayo: ukungena ngemvume kwe-gcloud Ikhasi lewebhu lizovuleka esipheqululini sakho sewebhu. Khetha i-Akhawunti yakho ye-Google futhi uyinikeze imvume yokufinyelela ku-GCP. Uma usuqedile, uzogunyazwa futhi ulungele ukuqhubekela phambili ## Dala Uhla lwemibhalo Okulandelayo, dala uhla lwemibhalo kwenye indawo endaweni yakho yokusebenza ukuze ugcine uhlelo lwakho lokusebenza lwe-Google App Engine: mkdir ~/Sites/example.com/app_engine Shintshela kulolo hlu lwemibhalo: cd ~/Sites/example.com/app_engine Okusele kwalokhu okuthunyelwe kuzothatha ngokuthi usebenza ngaphakathi kwalolu hlu lwemibhalo Ukwengeza, dala inkomba ngaphakathi kwe- **app_engine** umkhombandlela obizwa ngokuthi **static mkdir ~/Sites/example.com/app_engine/static Uzophinde uvakashele lolu hlu lwemibhalo ngokuhamba kwesikhathi ## Dala uhlelo lokusebenza.yaml I-Google App Engine ngokuvamile idinga amafayela amabili: **app.yaml** kanye **nefayela lohlelo lokusebenza** elibhalwe nge-Python, Golang, Java, noma PHP - kulesi simo kuzoba i-Golang. **app.yaml** inikeza ukucushwa okudingekayo ukuze usebenzise uhlelo lwakho lokusebenza. Kunamapharamitha amaningi ahlukene angaba khona kokuthi **app.yaml Lawo mapharamitha angase ahluke ngokusekelwe olimini lokuhlela olusetshenzisiwe. Kulokhu okuthunyelwe, i-Golang izosetshenziswa, futhi ungathola wonke amapharamitha e-Golang atholakalayo lapha Dala ifayela **app.yaml** nokuqukethwe okulandelayo: isikhathi sokusebenza: hamba api_version: go1 izibambi: - url:script: _go_app evikelekile: njalo uqondisa kabusha_http_response_code: 301 Qaphela lokho **kuvikelekile: njalo** kusethiwe. Lokhu kusho ukuthi uhlelo lokusebenza lwe-Golang luzohlala lunikezwa nge-HTTPS. Uma umsebenzisi wokugcina ezulazulela kuhlelo lokusebenza lwewebhu nge-HTTP, ngokuzenzakalelayo uzoqondiswa kabusha ku-302 enguqulweni ye-HTTPS. Yingakho **redirect_http_response_code: 301** nayo isethiwe. Ngihlala ngifuna ukuthi uhlelo lokusebenza lwewebhu lunikezwe nge-HTTPS, futhi angifuni izinjini zokusesha ezitolika ukuqondisa kabusha kusuka ku-HTTP kuya ku-HTTPS njengokuqondisa kabusha kwesikhashana; iwukuqondisa kabusha unomphela Uma unezimpahla ezimile, futhi kungenzeka ukuthi unazo, kuwumkhuba ongcono kakhulu ukwazisa Injini Yohlelo Lokusebenza ngalokhu futhi uyivumele inikeze lezo zimpahla endaweni yokugcina into esikhundleni sokusuka kuhlelo lwakho lokusebenza. Ukwenza lokhu kulula futhi kwenziwa ngokusebenzisa i- **app.yaml** ifayela Isibonelo, uma unefayela le-favicon, uhla lwemibhalo lwe-CSS, uhla lwemibhalo lwe-Javascript, kanye nohla lwemibhalo lwezithombe, sebenzisa lokhu okulandelayo **app.yaml** ifayela: isikhathi sokusebenza: hamba api_version: go1 izibambi: - url: /favicon.png$ static_files: static/favicon.png layisha: static/favicon.png - url: /css static_dir: static/css - url: /js static_dir: static/js - i-url: /izithombe static_dir: static/images - url:script: _go_app ivikelekile: njalo iqondisa kabusha_http_response_code: 301 ## Dala main.go Okulandelayo, udinga ifayela lesicelo se-Golang Ukuze ikhodi elandelayo ihlangabezane nezidingo zakho, dala ifayela **main.go kopisha bese unamathisele ikhodi engezansi, bese wenza izinguquko ezilandelayo: - Phakathi domainvariable, shintsha inani ukuze lifane negama lesizinda sakho nephrothokholi elungile ye-HTTP - Phakathi urlsmap, shintsha wonke amapheya enani lokhiye ukuze afane nokuqondisa kabusha okudingayo endaweni. Shintshanisa ukhiye ngamunye ngengxenye yendlela kuphela ( /example-post-1.htmlinstead of httpsexample.com/example-post-1.html) yesizinda samanje qhubeka uphila. Bese ushintsha inani ngalinye ngengxenye yendlela yesizinda samanje se-URL entsha ofuna ukuyiqondisa kabusha. Konke ukuqondisa kabusha kuzoba ukuqondisa kabusha okungu-301. Lokhu kungashintshwa ngokushintsha **301** kukhodi engezansi eya kukhodi yesimo yokuqondisa kabusha ye-HTTP ehlukile njengokuthi **302** ukungenisa okuyinhloko kwephakheji ( "net/http""os""strings") func init() { http.HandleFunc handler) } isibambi se-func(w http.ResponseWriter, r *http.Request) {// Iqiniso (kulungile) uma isicelo indlela ikumephu ye-urls uma inani, ok := urls[r.URL.Path]; kulungile {value = isizinda + senani http.Redirect(w, r, value, 301) } okunye { path := "static/"+ r.URL.Path // Buyisa 403 uma isicelo se-HTTP sisohlwini lwemibhalo olukhona futhi olusebenzayo ayiqukethe ifayela le-index.html uma f, iphutha := os.Stat(indlela); err == nil&& f.IsDir() { index := strings.TrimSuffix(indlela,+ "/index.html"uma _, err := os.Open(index); err != nil {w.WriteHeader (403) w.Writebytehtml> 403 Akuvunyelwe

403 Forbidden

return } } // Return custom 404 page if HTTP request is to a non-existent file if _, err := os.Stat(path); os.IsNotExist(err) { w.WriteHeader(404) http.ServeFile(w, r, "static/404.html") return // Withoutreturn, a "404 page not found" string will be displayed at the bottom of your custom 404 page } http.ServeFile(w, r, path) return } } var domain string = "httpsexample.com" var urls = map[string]string{ "/example-post-1.html": "/post/example-post-1.html", "/example-post-2.html": "/post/example-post-2.html", "/example-post-3.html": "/post/example-post-3.html", } ## Generate the Static Content With **app.yaml** and **main.go** saved, the last piece is to generate your static content and store it in the **static** directory you created earlier How you do this entirely depends on what static site generator you are using If you are using Jekyll, you can configure the **destination** parameter in Jekyll’s _ **config.yml** file to save your static content in any directory on your workstation. So, you could set the **destination** parameter to Sites/example.com/app_engine/static and, every time you run jekyll build, the static content will be saved in that directory ## Deploy to App Engine With **app.yaml **main.go and your static content generated, you are ready to deploy your Google App Engine application Assuming gcloud is already pointed at the Google Cloud Project you want to deploy to, verify with gcloud config list project, run the following command: gcloud app deploy The command will output the appspot URL your application will be deployed to and ask if you want to continue. Typically, the appspot URL is **httpsyour-project-id.appspot.com This is also a useful self-check to make sure you are not deploying your application to the wrong Google Cloud Project. If everything looks okay, type **Y** and **Enter** to deploy your application. Depending on how large your static content is, your application should be deployed within about one minute ## Setup DNS At this point, your application is deployed under URL **httpsyour-project-id.appspot.com Unless your website uses that as its domain name, you will probably want to setup a custom domain that uses your actual current domain name The App Engine section of the Google Cloud Console can be used to do this. Go here and follow the instructions to configure your custom domain Once that is complete and DNS has had time to propagate, you should be able to navigate in your web browser to one of your current domain’s old URLs, for example **httpsexample.com/example-post-1.html and have it redirect to your current domain’s new URLs, for example **httpsexample.com/post/example-post-1.html** ## Pushing Updates To push updates, make the necessary changes in your static site’s source directory, regenerate the static content, and redeploy to Google App Engine by changing into the Sites/example.com/app_engine** directory and running gcloud app deploy ## References - A Surprising Feature of Golang that Colored Me Impressed - How to check if a map contains a key in go? - Disable directory listing with http.FileServer - 3 Ways to Disable http.FileServer Directory Listings - Handling HTTP Request Errors in GO - HTTP and Error management in Go - please add ability to set custom 404 notFoundHandler for http.FileServer