Υπάρχουν αρκετοί φθηνοί τρόποι για να φιλοξενήσετε έναν στατικό ιστότοπο που δημιουργείται με μια γεννήτρια στατικών τοποθεσιών όπως ο Jekyll, ο Hugo ή ο Pelican: Ολόκληρο αυτό το ιστολόγιο δημιουργείται στατικά χρησιμοποιώντας το Jekyll. Ωστόσο, δεν μπορώ να χρησιμοποιήσω καμία από τις παραπάνω επιλογές, επειδή, κατά τη διάρκεια ζωής αυτού του ιστολογίου, άλλαξα ονόματα τομέα, άλλαξα σχήματα URL και μετονομάστηκαν αναρτήσεις και θέλω να κρατήστε ζωντανές όλες τις παλιές διευθύνσεις URL Φιλοξενούσα αυτό το ιστολόγιο χρησιμοποιώντας Apache και, πιο πρόσφατα, nginx σε μια ενιαία εικονική μηχανή, και οι δυνατότητες ανακατεύθυνσης οποιουδήποτε λογισμικού λειτουργούν μια χαρά, αλλά ήμουν έτοιμος να το φιλοξενήσω κάπου νέο και διαφορετικό Μια προηγούμενη ανάρτηση περιγράφει πώς ανακατευθύνω τις διευθύνσεις URL από έναν παλιό τομέα σε έναν νέο τομέα χρησιμοποιώντας το Google App Engine και την Python, αλλά τώρα χρειαζόμουν έναν τρόπο να προβάλλω στατικό περιεχόμενο **και** διευθύνσεις URL ανακατεύθυνσης από τον ίδιο τομέα. Αυτή η ίδια απαίτηση ανακατεύθυνσης τομέα είναι ο λόγος που δεν μπορώ απλώς να χρησιμοποιήσω τη δυνατότητα μόνο στατικού περιεχομένου της Μηχανής Εφαρμογών Google (σύνδεσμος στην παραπάνω λίστα). Ωστόσο, μπορώ να χρησιμοποιήσω το Google App Engine σε συνδυασμό με μια απλή εφαρμογή Golang για να εξυπηρετήσω τόσο στατικό περιεχόμενο **και** ανακατευθύνσεις ίδιου τομέα ## Γιατί Google App Engine; Πριν βουτήξετε στην υπόλοιπη ανάρτηση, ίσως αναρωτιέστε, γιατί να φιλοξενήσετε ένα ιστολόγιο στο Google App Engine; Εδώ είναι οι λόγοι μου: - Εάν η επισκεψιμότητά σας χωράει στη δωρεάν βαθμίδα του App EngineâÃÂà28 ωρών και 1 GB κίνησης εξόδου ανά ημέρα, η φιλοξενία του ιστολογίου είναι πρακτικά δωρεάν - Η προώθηση ενημερώσεων γίνεται με μία εντολή - Η καταγραφή και η παρακολούθηση ενσωματώνονται χρησιμοποιώντας το Stackdriver - Αυτόματη κλιμάκωση πάνω και κάτω με βάση τα μοτίβα κυκλοφορίας - Με μερικά κλικ, τα αρχεία καταγραφής ιστού μπορούν εύκολα να προωθηθούν σε κάτι σαν το BigQuery για μακροπρόθεσμη αποθήκευση και ad hoc ανάλυση - Διαχείριση πιστοποιητικών SSL χρησιμοποιώντας LetâÃÂÃÂs Encrypt ## Προαπαιτούμενα Αυτή η ανάρτηση προϋποθέτει τα εξής: - Είστε εξοικειωμένοι με το Google Cloud Platform (GCP) και έχετε ήδη δημιουργήσει ένα έργο GCP - Έχετε εγκαταστήσει το Google Cloud SDK - Έχετε επικυρώσει την ταυτότητα του gcloudcommand έναντι του Λογαριασμού σας Google Δημιουργήστε ένα έργο GCP Εάν δεν έχετε δημιουργήσει ακόμα ένα **Το έργο GCP ακολουθήστε τα εξής βήματα: - Ανοίξτε ένα πρόγραμμα περιήγησης ιστού και δημιουργήστε ή συνδεθείτε σε έναν Λογαριασμό Google - Πλοηγηθείτε στην Κονσόλα GCP - Εάν αυτό είναι το πρώτο σας έργο GCP, θα σας ζητηθεί να δημιουργήσετε ένα έργο GCP. Κάθε Λογαριασμός Google λαμβάνει πίστωση 300 $ για χρήση εντός 12 μηνών για το GCP. Απαιτείται να εισαγάγετε μια πιστωτική κάρτα για να δημιουργήσετε ένα έργο GCP, αλλά δεν θα χρεωθεί μέχρι να καταναλωθεί η πίστωση 300 $ ή να λήξουν 12 μήνες - Εάν πρόκειται για νέο έργο GCP, θα πρέπει να ενεργοποιήσετε το API Compute Engine μεταβαίνοντας στην ενότητα Compute Engine της Κονσόλας GCP και περιμένετε να ολοκληρωθεί η προετοιμασία Εγκαταστήστε το Google Cloud SDK Εάν δεν έχετε εγκαταστήσει ακόμη το **Το Google Cloud SDK ακολουθήστε τις οδηγίες εδώ Έλεγχος ταυτότητας gcloud Αφού δημιουργήσετε ένα έργο GCP και εγκαταστήσετε το Google Cloud SDK, το τελευταίο βήμα είναι να ελέγξετε την ταυτότητα του εντολή gcloud στον Λογαριασμό σας Google. Ανοίξτε την εφαρμογή τερματικού και εκτελέστε την ακόλουθη εντολή: gcloud auth login Θα ανοίξει μια ιστοσελίδα στο πρόγραμμα περιήγησής σας. Επιλέξτε τον Λογαριασμό σας Google και δώστε του άδεια πρόσβασης στο GCP. Μόλις ολοκληρωθεί, θα επαληθευτείτε και θα είστε έτοιμοι να προχωρήσετε ## Δημιουργία καταλόγου Στη συνέχεια, δημιουργήστε έναν κατάλογο κάπου στο σταθμό εργασίας σας για να αποθηκεύσετε την εφαρμογή Google App Engine: mkdir ~/Sites/example.com/app_engine Αλλάξτε σε αυτόν τον κατάλογο: cd ~/Sites/example.com/app_engine Το υπόλοιπο αυτής της ανάρτησης θα υποθέσει ότι εργάζεστε μέσα σε αυτόν τον κατάλογο Επιπλέον, δημιουργήστε έναν κατάλογο μέσα στο **εφαρμογή_μηχανής** κατάλογος που ονομάζεται **στατικός mkdir ~/Sites/example.com/app_engine/static Θα επισκεφθείτε ξανά αυτόν τον κατάλογο αργότερα ## Δημιουργία app.yaml Το Google App Engine απαιτεί συνήθως δύο αρχεία: **app.yaml** και ένα **αρχείο εφαρμογής** γραμμένο σε Python, Golang, Java ή PHP - σε αυτήν την περίπτωση θα είναι Golang. Το **app.yaml** παρέχει τις απαραίτητες ρυθμίσεις για την εκτέλεση της εφαρμογής σας. Υπάρχουν πολλές διαφορετικές παράμετροι που μπορούν να υπάρχουν στο **app.yaml Αυτές οι παράμετροι μπορεί να διαφέρουν ανάλογα με τη γλώσσα προγραμματισμού που χρησιμοποιείται. Για αυτήν την ανάρτηση, θα χρησιμοποιηθεί Golang και μπορείτε να βρείτε όλες τις διαθέσιμες παραμέτρους Golang εδώ Δημιουργία αρχείου **app.yaml** με τα ακόλουθα περιεχόμενα: runtime: go api_version: go1 handlers: - url:script: _go_app safe: always redirect_http_response_code: 301 Σημειώσε ότι **secure: έχει οριστεί πάντα **. Αυτό σημαίνει ότι η εφαρμογή Golang θα εξυπηρετείται πάντα μέσω HTTPS. Εάν ένας τελικός χρήστης πλοηγηθεί στην εφαρμογή Ιστού μέσω HTTP, από προεπιλογή θα ανακατευθυνθεί 302 στην έκδοση HTTPS. Αυτός είναι ο λόγος που έχει οριστεί και το **redirect_http_response_code: 301**. Θέλω πάντα η εφαρμογή web να εξυπηρετείται μέσω HTTPS και δεν θέλω οι μηχανές αναζήτησης να ερμηνεύουν την ανακατεύθυνση από το HTTP στο HTTPS ως προσωρινή ανακατεύθυνση. είναι μια μόνιμη ανακατεύθυνση Εάν έχετε στατικά στοιχεία, και πιθανότατα έχετε, είναι καλύτερη πρακτική να ενημερώσετε το App Engine για αυτό και να το αφήσετε να εξυπηρετήσει αυτά τα στοιχεία από την αποθήκευση αντικειμένων αντί από την εφαρμογή σας. Αυτό είναι εύκολο και γίνεται επίσης μέσω του Αρχείο **app.yaml** Για παράδειγμα, εάν έχετε ένα αρχείο favicon, έναν κατάλογο CSS, έναν κατάλογο Javascript και έναν κατάλογο εικόνων, χρησιμοποιήστε τα ακόλουθα Αρχείο **app.yaml**: runtime: go api_version: go1 handlers: - url: /favicon.png$ static_files: static/favicon.png upload: 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 safe: πάντα redirect_http_response_code: 301 ## Δημιουργία main.go Στη συνέχεια, χρειάζεστε το αρχείο εφαρμογής Golang Για να καλύψει τις ανάγκες σας ο παρακάτω κώδικας, δημιουργήστε αρχείο **main.go αντιγράψτε και επικολλήστε τον παρακάτω κώδικα και κάντε τις ακόλουθες τροποποιήσεις: - Στο μεταβλητή τομέα, αλλάξτε την τιμή για να ταιριάζει με το όνομα τομέα σας με το σωστό πρωτόκολλο HTTP - Στο urlsmap, αντικαταστήστε όλα τα ζεύγη τιμών κλειδιών για να ταιριάζουν με τις ανακατευθύνσεις που χρειάζεστε. Αντικαταστήστε κάθε κλειδί με μόνο το τμήμα διαδρομής ( /example-post-1.htmlαντί για httpsexample.com/example-post-1.html) του τρέχοντος παλιού URL τομέα που θέλετε να κρατήσει ζωντανή. Στη συνέχεια, αντικαταστήστε κάθε τιμή με το τμήμα διαδρομής της νέας διεύθυνσης URL του τρέχοντος τομέα στο οποίο θέλετε να ανακατευθύνετε Όλες οι ανακατευθύνσεις θα είναι 301 ανακατευθύνσεις. Αυτό μπορεί να τροποποιηθεί με αλλαγή **301** στον παρακάτω κωδικό σε διαφορετικό κωδικό κατάστασης ανακατεύθυνσης HTTP όπως **302** κύρια εισαγωγή πακέτου ( "net/http""os""strings") func init() { http.HandleFunc handler) } func handler(w http.ResponseWriter, r *http.Request) { // True (ok) if request Η διαδρομή βρίσκεται στον χάρτη των urls εάν η τιμή, ok := urls[r.URL.Path]; ok { value = domain + value http.Redirect(w, r, value, 301) } else { path := "static/"+ r.URL.Path // Επιστροφή 403 εάν το αίτημα HTTP είναι σε έναν κατάλογο που υπάρχει και το κάνει δεν περιέχει αρχείο index.html εάν f, err := os.Stat(path); err == μηδέν&& f.IsDir() { index := strings.TrimSuffix(path,+ "/index.html"if _, err := os.Open(index); err != nil { w.WriteHeader (403) w.Writebytehtml> 403 Απαγορευμένο

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