Go هي لغة برمجة مفتوحة المصدر عامة الأغراض. مستوحاة من إنتاجية Python مع تقديم قدرات لغة C. تم تطويرها في الأصل بواسطة Google لمعالجة المشكلات التي كانوا يواجهونها في قاعدة الكود الخاصة بهم (تعقيد الكود ووقت الترجمة الطويل). مثل أي لغة برمجة حديثة أخرى، فإن Go مناسبة لجميع أنواع الأغراض. على سبيل المثال، يمكن استخدامها لتطوير الويب، والبرمجة النصية لسطر الأوامر، وتطبيقات خادم الشبكات، وتطوير الواجهة الأمامية، وما إلى ذلك.
في هذا الدليل، سنقوم بـإرشادك عبر خطوات نشر تطبيق ويب بسيط بلغة Go على Ubuntu 22.04 LTS. سنقوم أيضًا بتنفيذ وكيل عكسي Nginx للتعامل مع حمل حركة المرور.
المتطلبات الأساسية
لتنفيذ الخطوات الموضحة في هذا الدليل، ستحتاج إلى تكوين المكونات التالية مسبقًا:
- نظام Ubuntu تم تكوينه بشكل صحيح. تعرف على المزيد حول إعداد خادم Ubuntu الخاص بك على CloudSigma.
- بيئة برمجة Go مع متغيرات البيئة اللازمة ( $GOROOT و $GOPATH). تحقق من الدليل الخاص بـ تكوين بيئة برمجة Go على Ubuntu.
- Nginx للوكيل العكسي. يوضح هذا الدليل بالتفصيل تثبيت وتكوين Nginx على Ubuntu.
- محرر نصوص مناسب للعمل مع كود Go، على سبيل المثال، Atom, Sublime Text, Brackets, VS Code, Vim، وما إلى ذلك. بالنسبة لهذا الدليل، سيكون VS Code هو محرر النصوص المفضل لدينا.
إذا كان من المفترض أن تكون الخدمة سهلة الوصول عبر اسم مجال، فيجب أن يكون لديك FQDN يشير إلى الخادم. في هذه الحالة، يوصى بتأمين Nginx باستخدام SSL. يمكنك معرفة المزيد حول تأمين Nginx باستخدام Let’s Encrypt على Ubuntu من برنامجنا التعليمي.
الخطوة 1 – إنشاء تطبيق ويب بلغة Go
سنقوم ببناء تطبيق ويب بسيط بلغة Go يطبع “Hello World” على الشاشة عند الوصول إلى المجال. علاوة على ذلك، سيرحب التطبيق بالمستخدم عند الوصول إلى <domain>/greet/<username>.
ابدأ بإنشاء مشروع جديد تحت $GOPATH. أنشئ دليل المشروع:
|
1 |
mkdir -pv $GOPATH/go-web |

تغيير الدليل الحالي:
|
1 |
cd $GOPATH/go-web |

ثم، ابدأ مشروعًا:
|
1 |
go mod init <package_name> |

بعد ذلك، قم بإنشاء main.go الذي سيكون بمثابة جذر تطبيق Go الخاص بنا. سيستضيف الكود المصدري لتطبيق الويب الخاص بنا:
|
1 |
touch main.go |
افتح المشروع في VS Code:
|
1 |
code . |
الصق الكود التالي في الملف 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) } |

دعنا نلقي نظرة سريعة على برنامج Go الذي أنشأناه للتو:
- المصطلح package main بمثابة نقطة الدخول إلى تطبيقنا. كما أنه يوجه مترجم Go لترجمة الملف كملف قابل للتنفيذ بدلاً من مكتبة مشتركة.
- عبارة import تستورد جميع الوحدات الإضافية المطلوبة ليعمل البرنامج. هنا، قمنا باستيراد حزمتي fmt (لطباعة النصوص) و net/http (لتطبيقات خادم الويب).
- باستخدام الدالة
http.HandleFunc، قمنا بإنشاء مسارين:
- المسار الأول / بمثابة المسار الرئيسي داخل func main.
- المسار الثاني
/greet/ يقبل معلمة URL (سلسلة نصية، في هذه الحالة). ثم يتم عرض السلسلة النصية مصحوبة برسالة الترحيب.
- URL مسار يُستخدم لتخزين القيمة بعد /greet/. ثم يتم تمرير القيمة كـ name لمعلمة URL.
- تقوم http.ListenAndServe ببدء تشغيل خادم الويب. هنا، يستمع إلى المنفذ 9990.
الآن بعد أن أصبح برنامجنا جاهزًا، قم بتجميع الملف إلى ملف قابل للتنفيذ:
|
1 |
go build main.go |
سيقوم مترجم Go بإنشاء ملف قابل للتنفيذ بنفس اسم الملف. تحقق من المخرجات:
|
1 |
ls -lh |
الخطوة 2 – تكوين ملف وحدة systemd للتشغيل في الخلفية
حتى الآن، إذا قام المستخدم الحالي بتسجيل الخروج من النظام، فسيتوقف تطبيق ويب Go عن العمل. هذا تصميم سيئ لخادم الويب. لحل هذه المشكلة، سنقوم بإنشاء ملف وحدة systemd لإبقائه قيد التشغيل في الخلفية، حتى عندما يقوم المستخدم بتسجيل الخروج من الخادم. هذا يجعل التكوين أقرب بخطوة واحدة إلى أن يكون جاهزًا للبيئة الإنتاجية.
قم بإنشاء ملف systemd مخصص goweb.service تحت /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
أضف المقتطف التالي في ملف الوحدة:
|
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 |

هنا،
- يشير المتغير ExecStart إلى نقطة الدخول للخدمة من خلال الملف القابل للتنفيذ الرئيسي الموجود في دليل مشروعنا ( $GOPATH/go-web). لاحظ أنه بدلاً من ذكر $GOPATH، قمنا بكتابة المسار الكامل للملف القابل للتنفيذ. ذلك لأن المتغير $GOPATH مرئي للمستخدم فقط.
- يخبر المتغير Restart نظام systemd بما يجب فعله في حال توقف البرنامج عن العمل. القيمة always تخبر systemd بإعادة تشغيل البرنامج في كل مرة يتوقف فيها عن التنفيذ.
- يخبر المتغير RestartSec نظام systemd بالانتظار لفترة زمنية محددة قبل محاولة إعادة تشغيل البرنامج. هنا، تم تعيين القيمة على 5s (5 ثوانٍ).
- تحدد العبارة WantedBy=multi-user.target الحالة التي سيقوم فيها systemd بتمكين الخدمة.
احفظ الملف وأغلق المحرر. ابدأ الخدمة:
|
1 |
sudo service goweb start |

تحقق مما إذا كانت الخدمة تعمل بشكل صحيح:
|
1 |
sudo service goweb status |

كما توضح المخرجات، فإن التطبيق يعمل بشكل صحيح. نحن الآن جاهزون لاستخدام Nginx كوكيل عكسي.
الخطوة 3 – تكوين Nginx كوكيل عكسي
الآن، سنقوم بإنشاء كتلة خادم لـ Nginx ليعمل كوكيل عكسي. سيتم عرض تطبيق الويب على الإنترنت من خلال الوكيل العكسي (للحصول على أداء وأمان إضافيين).
قم بتغيير الدليل النشط الحالي إلى sites-available:
|
1 |
cd /etc/nginx/sites-available |

الآن، قم بإنشاء ملف باسم النطاق الذي ترغب في عرض تطبيقك من خلاله. للتوضيح، سنستخدم example.com:
|
1 |
sudo nano example.com |
أدخل الكود التالي في ملف الكتلة:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

هنا، نستخدم proxy_pass لخدمة تطبيق ويب Go على عنوان IP الخاص بالخادم (localhost) على المنفذ 9990.
لتمكين كتلة Nginx، قم بإنشاء رابط رمزي (يُعرف أيضًا باسم الرابط اللين) للملف إلى مجلد sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

أعد تحميل تكوين Nginx لتطبيق التغييرات:
|
1 |
sudo nginx -s reload |
الخطوة 4 – التحقق
إذا سار كل شيء كما هو متوقع، فيجب أن يكون تطبيق الويب الآن متاحًا على localhost:9990 والنطاق الذي قمنا بتكوينه. افتح عنوان URL في متصفح الويب:
|
1 |
localhost:9990 |

كما هو متوقع، يقوم التطبيق بطباعة “Hello World” على الشاشة. هذه هي وظيفة المسار الأساسي. بعد ذلك، اختبر المسار الثاني عن طريق زيارة عنوان URL التالي:
|
1 |
localhost:9990/greet/<name> |

يقوم التطبيق بإرجاع رسالة الترحيب البسيطة بنجاح مع الاسم من المعلمة المستلمة من عنوان URL.
ها قد انتهينا! لقد قمنا بنشر تطبيق ويب Go بنجاح على خادمنا المحلي!
أفكار أخيرة
في هذا الدليل، قمنا بشرح نشر تطبيق ويب Go بسيط بمساعدة مكتبات Go القياسية. كما قمنا بنشر وكيل عكسي باستخدام Nginx. في حين تم إجراء هذا العرض التوضيحي على خادم محلي، فبالنسبة للخادم العام، يوصى بشدة بـ تطبيق شهادة SSL للوصول الآمن إلى الإنترنت. لمزيد من برمجة Go، يمكنك الاطلاع على برنامجنا التعليمي حول بناء وتثبيت برامج Go.
حوسبة سعيدة!


التعليقات
لا توجد تعليقات بعد. كن أول من يعلق.