Jekyll, Hugo veya Pelican gibi bir statik site oluşturucuyla oluşturulan statik bir web sitesini barındırmanın birkaç ucuz yolu vardır: Bu blogun tamamı statik olarak Jekyll kullanılarak oluşturulmuştur. Ancak, yukarıdaki seçeneklerden hiçbirini kullanamıyorum, çünkü bu blogun ömrü boyunca alan adlarını, URL şemalarını değiştirdim ve gönderileri yeniden adlandırdım ve bunu yapmak istiyorum. tüm eski URL'leri canlı tut Bu blogu Apache ve son zamanlarda nginx kullanarak tek bir sanal makinede barındırıyorum ve her iki yazılımın da yeniden yönlendirme özellikleri gayet iyi çalışıyor, ancak onu yeni ve farklı bir yerde barındırmaya hazırdım Önceki bir gönderi, Google App Engine ve Python kullanarak URL'leri eski bir alandan yeni bir alana nasıl yönlendirdiğimi açıklıyor, ancak şimdi statik içerik sunmak için bir yola ihtiyacım vardı **ve** URL'leri aynı etki alanından yönlendirir. Aynı alan yeniden yönlendirme gereksinimi, Google App Engine'in yalnızca statik içerik özelliğini (yukarıdaki listede bağlantısı verilmiştir) basitçe kullanamamamın nedenidir. Ancak, Google App Engine'i basit bir Golang uygulamasıyla birlikte kullanarak hem statik içeriğe** hem de** aynı etki alanı yönlendirmelerine hizmet verebilirim ## Neden Google App Engine? Yazının geri kalanına geçmeden önce, belki de neden Google App Engine'de bir blog barındırıyorsunuz? İşte nedenlerim: - Trafiğiniz, App Engine'in 28 örnek saatlik ücretsiz katmanına ve günlük 1 GB çıkış trafiğine uyuyorsa, blogu barındırmak neredeyse ücretsizdir - Güncellemeleri zorlamak tek bir komutla yapılır - Günlük kaydı ve izleme, Stackdriver kullanılarak entegre edilmiştir - Trafik modellerine göre otomatik yukarı ve aşağı ölçeklendirme - Birkaç tıklama ile web günlükleri, uzun süreli depolama ve ad hoc analiz için kolayca BigQuery gibi bir şeye aktarılabilir - LetâÃÂÃÂs Encrypt kullanılarak yönetilen SSL sertifikaları ## Önkoşullar Bu gönderi aşağıdakileri varsayar: - Google Cloud Platform'a (GCP) aşinasınız ve zaten bir GCP Projesi oluşturdunuz - Google Cloud SDK'yı yüklediniz - Şunun kimliğini doğruladınız: Google Hesabınıza karşı gcloudcommand Bir GCP Projesi Oluşturun Henüz oluşturmadıysanız **GCP Projesi şu adımları izleyin: - Bir web tarayıcısı açın ve bir Google Hesabı oluşturun veya oturum açın - GCP Konsoluna gidin - Bu sizin ilk GCP Projenizse, sizden bir GCP Projesi oluşturmanız istenecektir. Her Google Hesabı, 12 ay içinde GCP'de kullanılmak üzere 300 ABD doları tutarında kredi alır. Bir GCP Projesi oluşturmak için bir kredi kartı girmeniz gerekir, ancak 300 ABD doları tutarındaki kredi tüketilene veya 12 aylık süre sona erene kadar kredi kartınızdan ödeme alınmayacaktır. - Bu yeni bir GCP Projesiyse, GCP Konsolunun Compute Engine bölümüne giderek Compute Engine API'yi etkinleştirmeniz ve başlatma işleminin tamamlanmasını beklemeniz gerekir. Google Cloud SDK'yı yükleyin Henüz yüklemediyseniz, **Google Cloud SDK buradaki talimatları uygulayın gcloud'u doğrulayın Bir GCP Projesi oluşturup Google Cloud SDK'yı yükledikten sonra son adım, Google Hesabınıza gcloud komutu. Terminal uygulamanızı açın ve aşağıdaki komutu çalıştırın: gcloud kimlik doğrulama girişi Web tarayıcınızda bir web sayfası açılacaktır. Google Hesabınızı seçin ve GCP'ye erişmesine izin verin. Tamamlandığında, kimliğiniz doğrulanacak ve ilerlemeye hazır olacaksınız. ## Bir Dizin Oluşturun Ardından, Google App Engine uygulamanızı depolamak için iş istasyonunuzda bir yerde bir dizin oluşturun: mkdir ~/Sites/example.com/app_engine Bu dizine geçin: cd ~/Sites/example.com/app_engine Bu gönderinin geri kalanı, bu dizinin içinde çalıştığınızı varsayacaktır. Ek olarak, içinde bir dizin oluşturun. **app_engine** dizini **statik olarak adlandırılır mkdir ~/Sites/example.com/app_engine/static Bu dizini daha sonra tekrar ziyaret edeceksiniz ## app.yaml oluştur Google App Engine genellikle iki dosya gerektirir: **app.yaml** ve Python, Golang, Java veya PHP'de yazılmış bir **uygulama dosyası** - bu durumda dosya Golang olacaktır. **app.yaml**, uygulamanızı çalıştırmak için gerekli yapılandırmayı sağlar. **app.yaml içinde bulunabilecek birçok farklı parametre vardır. Bu parametreler, kullanılan programlama diline göre farklılık gösterebilir. Bu gönderi için Golang kullanılacak ve mevcut tüm Golang parametrelerini burada bulabilirsiniz. Dosya oluştur **app.yaml** aşağıdaki içeriklerle birlikte: çalışma zamanı: go api_version: go1 işleyicileri: - url:script: _go_app güvenli: her zaman yönlendirme_http_response_code: 301 Dikkat edin **güvenli: her zaman** ayarlandı. Bu, Golang uygulamasının her zaman HTTPS üzerinden sunulacağı anlamına gelir. Bir son kullanıcı HTTP üzerinden web uygulamasına giderse, varsayılan olarak HTTPS sürümüne 302 yönlendirilir. Bu nedenle **redirect_http_response_code: 301** de ayarlanmıştır. Web uygulamasının her zaman HTTPS üzerinden sunulmasını istiyorum ve arama motorlarının HTTP'den HTTPS'ye yönlendirmeyi geçici bir yeniden yönlendirme olarak yorumlamasını istemiyorum; kalıcı bir yönlendirmedir Statik varlıklarınız varsa, ki muhtemelen vardır, App Engine'i bu konuda bilgilendirmek ve bu varlıkları uygulamanız yerine nesne deposundan sunmasına izin vermek en iyi uygulamadır. Bunu yapmak kolaydır ve aynı zamanda **app.yaml** dosyası Örneğin, bir favicon dosyanız, bir CSS dizininiz, bir Javascript dizininiz ve bir görseller dizininiz varsa, aşağıdakini kullanın **app.yaml** dosyası: çalışma zamanı: go api_version: go1 işleyicileri: - url: /favicon.png$ static_files: static/favicon.png yükleme: static/favicon.png - url: /css static_dir: static/css - url: /js static_dir: static/js - url: /images static_dir: static/images - url:script: _go_app güvenli: her zaman yönlendirme_http_response_code: 301 ## main.go'yu oluştur Ardından, Golang uygulama dosyasına ihtiyacınız var Aşağıdaki kodun ihtiyaçlarınızı karşılaması için dosya oluşturun **main.go aşağıdaki kodu kopyalayıp yapıştırın ve aşağıdaki değişiklikleri yapın: - İçinde domainvariable, alan adınızı doğru HTTP protokolüyle eşleştirmek için değeri değiştirin - İçinde urlsmap, yerinde ihtiyacınız olan yönlendirmelerle eşleşmesi için tüm anahtar değer çiftlerini değiştirin. Her anahtarı, değiştirmek istediğiniz mevcut alan adının eski URL'sinin yalnızca yol kısmıyla ( httpsexample.com/example-post-1.html yerine /example-post-1.html) değiştirin. hayatta kal. Ardından, her değeri yönlendirmek istediğiniz mevcut alan adının yeni URL'sinin yol kısmıyla değiştirin. Tüm yönlendirmeler 301 yönlendirmeleri olacaktır. Bu değiştirilerek değiştirilebilir Aşağıdaki koddaki **301**, **302** gibi farklı bir HTTP yönlendirme durum koduna paket ana import ("net/http""os""strings") func init() { http.HandleFunc işleyici) } func işleyici(w http.ResponseWriter, r *http.Request) { // True (ok) if request değer, tamam ise yol urls haritasındadır := urls[r.URL.Path]; ok { değer = etki alanı + değer http.Redirect(w, r, değer, 301) } else { yol := "statik/"+ r.URL.Path // HTTP isteği var olan ve çalışan bir dizine ise 403 döndürür f, err := os.Stat(yol); err == nil&& f.IsDir() { index := strings.TrimSuffix(path,+ "/index.html"if _, err := os.Open(index); err != nil { w.WriteHeader (403) w.Writebytehtml> 403 Yasak

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