Go açık kaynaklı, genel amaçlı bir programlama dilidir. Python'ın üretkenliğinden esinlenirken C'nin yeteneklerini sunar. İlk olarak Google tarafından kendi kod tabanlarında karşılaştıkları sorunları (kod karmaşıklığı ve uzun derleme süresi) çözmek amacıyla geliştirilmiştir. Diğer tüm modern programlama dilleri gibi Go da her türlü amaca uygundur. Örneğin, web geliştirme, komut satırı betikleri, ağ sunucusu uygulamaları, ön uç geliştirme vb. için kullanılabilir.
Bu kılavuzda, size Ubuntu 22.04 LTS üzerinde basit bir Go web uygulamasını dağıtma adımlarında yol göstereceğiz. Trafik yükünü yönetmek için bir Nginx ters proxy'si de uygulayacağız.
Önkoşullar
Bu kılavuzda gösterilen adımları gerçekleştirmek için önceden yapılandırılmış aşağıdaki bileşenlere ihtiyacınız olacaktır:
- Düzgün şekilde yapılandırılmış bir Ubuntu Hakkında daha fazla bilgi edinin: CloudSigma üzerinde kendi Ubuntu sunucunuzu kurma.
- Gerekli ortam değişkenlerine sahip Go programlama ortamı ( $GOROOT ve $GOPATH). Şu kılavuza göz atın: Ubuntu üzerinde Go programlama ortamını yapılandırma.
- Nginx ters proxy için. Bu kılavuzda şu konu ayrıntılı olarak ele alınmaktadır: Ubuntu üzerinde Nginx kurulumu ve yapılandırılması.
- Go koduyla çalışmak için uygun bir metin düzenleyici, örneğin, Atom, Sublime Text, Brackets, VS Code, Vim, vb. Bu kılavuz için tercih edeceğimiz metin düzenleyici VS Code olacaktır.
Hizmete bir alan adı üzerinden erişilecekse, sunucuya yönlendirilmiş bir FQDN'niz olmalıdır. Bu durumda, Nginx'i SSL ile güvence altına almanız önerilir. Şu konudan daha fazla bilgi edinebilirsiniz: eğitimimizden Ubuntu üzerinde Let’s Encrypt ile Nginx'i güvence altına alma.
Adım 1 – Bir Go Web Uygulaması Oluşturma
Alan adına erişildiğinde ekrana –Hello World– yazdıracak basit bir Go web uygulaması oluşturacağız. Ayrıca uygulama, şuraya erişildiğinde kullanıcıyı selamlayacaktır: <domain>/greet/<username>.
Şunun altında yeni bir proje oluşturarak başlayın: $GOPATH. Proje dizinini oluşturun:
|
1 |
mkdir -pv $GOPATH/go-web |

Mevcut dizini değiştirin:
|
1 |
cd $GOPATH/go-web |

Ardından, bir proje başlatın:
|
1 |
go mod init <package_name> |

Ardından, şunu oluşturun: main.go bu dosya Go uygulamamızın kökü olarak hizmet edecektir. Web uygulamamızın kaynak kodunu barındıracaktır:
|
1 |
touch main.go |
Projeyi VS Code'da açın:
|
1 |
code . |
Aşağıdaki kodu şu dosyaya yapıştırın: main.go:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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) } |

Yeni oluşturduğumuz Go programının hızlı bir analizini yapalım:
- Şu terim: package main uygulamamızın giriş noktası olarak hizmet eder. Ayrıca Go derleyicisine dosyayı paylaşılan bir kitaplık yerine yürütülebilir bir dosya olarak derlemesini söyler.
- Şu import ifadesi, programın çalışması için gereken tüm ek modülleri içe aktarır. Burada, fmt (metinleri yazdırmak için) ve net/http (web sunucusu uygulamaları için) paketlerini içe aktardık.
- Şu işlevi kullanarak:
http.HandleFunc, iki rota oluşturduk:
- İlk rota / şunun içinde ana rota olarak hizmet eder: func main.
- İkinci rota
/greet/ bir URL parametresi (bu durumda bir dize) kabul eder. Dize daha sonra karşılama mesajı eşliğinde görüntülenir.
- URL Yolu, şundan sonraki değeri saklamak için kullanılır: /greet/. Değer daha sonra URL parametresinin name i olarak aktarılır.
- The http.ListenAndServe fonksiyonu web sunucusunu başlatır. Burada, şu portu dinliyor: 9990.
Artık programımız hazır olduğuna göre, dosyayı çalıştırılabilir bir dosyaya derleyin:
|
1 |
go build main.go |
Go derleyicisi, dosyayla aynı ada sahip çalıştırılabilir bir dosya oluşturacaktır. Çıktıya göz atın:
|
1 |
ls -lh |
Adım 2 – Arka Planda Çalıştırma için bir systemd Birim Dosyası Yapılandırma
Şu ana kadar, mevcut kullanıcı sistemden çıkış yaparsa Go web uygulaması çalışmayı durduracaktır. Bu, bir web sunucusu için kötü bir tasarımdır. Bu sorunu çözmek için, kullanıcı sunucudan çıkış yapsa bile arka planda çalışmaya devam etmesini sağlayacak bir systemd birim dosyası oluşturacağız. Bu, yapılandırmayı üretim düzeyinde bir dağıtıma bir adım daha yaklaştırır.
Özel bir systemd dosyası oluşturun: goweb.service şunun altında: /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Birim dosyasına aşağıdaki kod parçacığını ekleyin:
|
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/<username>/go/go-web/main [Install] WantedBy=multi-user.target |

Burada,
- The variable ExecStart değişkeni, proje dizinimizde bulunan ana çalıştırılabilir dosya aracılığıyla hizmetin giriş noktasını belirtir ( $GOPATH/go-web). $GOPATH belirtmek yerine çalıştırılabilir dosyanın tam yolunu yazdığımıza dikkat edin. Bunun nedeni, $GOPATH değişkeninin yalnızca kullanıcı tarafından görülebilmesidir.
- The variable Restart değişkeni, systemd birimine programın çalışması durduğunda ne yapacağını söyler. always değeri, systemd birimine program her durduğunda onu yeniden başlatmasını söyler.
- RestartSec değişkeni, systemd birimine programı yeniden başlatmayı denemeden önce belirli bir süre beklemesini söyler. Burada değer şu şekilde ayarlanmıştır: 5s (5 saniye).
- Şu ifade: WantedBy=multi-user.target, systemd biriminin hizmeti hangi durumda etkinleştireceğini belirtir.
Dosyayı kaydedip düzenleyiciyi kapatın. Hizmeti başlatın:
|
1 |
sudo service goweb start |

Hizmetin çalışır durumda olup olmadığını doğrulayın:
|
1 |
sudo service goweb status |

Çıktının da gösterdiği gibi, uygulama çalışır durumdadır. Artık Nginx'i ters proxy (reverse proxy) olarak kullanmaya hazırız.
Adım 3 – Nginx'i Ters Proxy Olarak Yapılandırma
Şimdi, Nginx'in ters proxy olarak çalışması için bir sunucu bloğu (server block) oluşturacağız. Web uygulaması, ters proxy aracılığıyla internete açılacaktır (ek performans ve güvenlik için).
Mevcut aktif dizini şununla değiştirin: sites-available:
|
1 |
cd /etc/nginx/sites-available |

Şimdi, uygulamanızı sunmak istediğiniz alan adıyla bir dosya oluşturun. Gösterim amacıyla şunu kullanacağız: example.com:
|
1 |
sudo nano example.com |
Blok dosyasına aşağıdaki kodu girin:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Burada, Go web uygulamasını sunucunun IP adresinde (localhost) proxy_pass kullanarak şu portta sunuyoruz: 9990.
Nginx bloğunu etkinleştirmek için, dosyanın sites-enabled klasörüne bir sembolik bağlantısını (symlink veya soft link olarak da bilinir) oluşturun:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Değişikliklerin geçerli olması için Nginx yapılandırmasını yeniden yükleyin:
|
1 |
sudo nginx -s reload |
Adım 4 – Doğrulama
Her şey beklendiği gibi gittiyse, web uygulamasına artık şuradan erişilebiliyor olmalıdır: localhost:9990 ve yapılandırdığımız alan adı. URL'yi bir web tarayıcısında açın:
|
1 |
localhost:9990 |

Beklendiği gibi, uygulama ekrana “Hello World” yazdırıyor. Bu, birincil rotanın görevidir. Ardından, aşağıdaki URL'yi ziyaret ederek ikinci rotayı test edin:
|
1 |
localhost:9990/greet/<name> |

Uygulama, URL'den alınan parametredeki isimle birlikte basit karşılama mesajını başarıyla döndürüyor.
Voila! Yerel sunucumuzda bir Go web uygulamasını başarıyla dağıttık!
Son Düşünceler
Bu kılavuzda, Go standart kütüphanelerinin yardımıyla basit bir Go web uygulamasını dağıtmayı gösterdik. Ayrıca Nginx kullanarak bir ters proxy dağıttık. Gösterim yerel bir sunucuda yapılmış olsa da, genel bir sunucu için, internete güvenli bir şekilde açılmak amacıyla bir SSL sertifikası kurmanız şiddetle önerilir. Daha fazla Go programlama için, şu eğitimimize göz atabilirsiniz: Go Programlarını Derleme ve Kurma.
Keyifli Kodlamalar!


Yorumlar
Henüz yorum yapılmamış. İlk siz olun.