Assalomu alaykum! Bugungi maqolamda sizlarga veb server haqida tushuncha berib o'tmoqchiman. Maqolam so'ngida bilganlarimiz asosida o'zimizning sodda veb serveriminizni yaratamiz. 

Veb server nima? 

Veb server - HTTP so'rovlarni(request) qabul qiluvchi va HTTP javob(response) brauzer yordamida foydalanuvchiga  HTML sahifa ko'rinishida  yuboruvchi server. Veb server deb ba'zan uning funksiyasini bajaruvchi dasturiy ta'minotga ham aytiladi. Kompyuterlarni ham veb server deb atashadi(apparat ta'minoti). Aynan o'sha kompyuterda veb server funksiyasini bajaruvchi dasturiy ta'minot o'rnatilgan bo'ladi.

Klient tushunchasi mavjud. Klient vazifasini veb brauzerlar bajarib keladi. Ular URL manzillar bo'yicha veb serverga resurslarni qabul qilish uchun so'rov yuboradilar. Resurs deganda aynan HTML sahifalarni, media(rasm, video...), foydalanuvchiga kerak bo'lgan istalgan ma'lumot turlari.  Berilgan so'rov bo'yicha veb server javob qaytaradi. So'rov jo'natish, javob qaytarish HTTP protokollari orqali amalga oshiriladi.

REQUEST va RESPONSE

Misol tariqasida www.example.com saytini olaylik. Undan biz path/file.html boyicha file.html faylini olishimiz kerak. Shuning uchun biz brauzer orqali http://www.example.com/path/file.html so'rovini yuboramiz. Request yuborildi, response sifatida file.html ni olamiz(agarda fayl rostdan ham serverdan mavjud bo'lsa).

GET /path/file.html HTTP/2
Host: www.example.com

GET  - "Ega bo'lish" resurs uchun so'rov yuborildi.

Yana HEAD , POST va TRACE kabi  metodlar mavjud.

Maxsus status kodlarni diapazonlarga bo'ladigan bo'lsak:

  • 100-199 informatsion
  • 200-299 muvaffaqiyatli(success)
  • 300-399 boshqa tomonga yo'naltirish(redirect). Ex: 302 found, 305 user proxy...
  • 400-499 bu status kodlari asosan klient tomonidan xatolik bo'lganda chiqadi. Ex:404 not found ya'ni noto'g'ri so'rov yuborilsa, 403 taqiqlanga(cheklov o'rnatilgan) kataloglar, 400 bad request va hokazolar.
  • 500-599 server tomonidan bo'ladigan xatoliklar. Ex:500 -Internal Server Error serverning ichida yuz bergan xatolik. 502 - Bad gateway va hokazolar.

Veb serverlar ma'lumotlarni jo'natish va qabul qilishdan boshqa ko'plab funksiyalarga ega bo'lishi mumkin:

  • Veb sahifalarning ishini avtomatizatsiya qilish
  • Foydalanuvchining so'rovlarini jurnalga kiritib borish*
  • Foydalanuvchiniavtorizatsiya va autifikatsiya qilish
  • HTTPSning qo'llab quvvatlanishi. Bu tarmoqda xavfsiz bog'lanishni(connection)ni yuzaga keltiradi.(Qisqa qilib aytganda SSL sertifikat)

*So'rovlarni jurnalga saqlab borish(loglar) - qisqa qilib aytganda bular server loglardir. Misol uchun ko'p ishlatiladigan Apache veb serverlarini olaylik. Fayllar jurnali access.log , xatoliklar jurnali esa error.log deb ataladi.

Misol tariqasida:

127.0.0.1 - - [14/Jun/2020:18:00:00 +0000] "GET /example.html HTTP/1.1" 200 - "http://example.com" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"

Veb serverlarni ham 2 toifaga ajratish mumkin. Statik va dinamik veb serverlar.

  • Statik veb serverlar - u asosan kompyuterdan("Temirdan") va HTTP serverlarining dasturiy ta'minotdan tashkil topgan bo'ladi. Uning "statik" deb atalishiga sababi, bu server foydalanuvchiga serverga joylashgan fayllarni qanday bo'lsa shundayligicha yetkazib beradi.
  • Dinamik veb serverlar - ular ham statik veb server va maxsus dasturiy ta'minotlar, veb ilovalar va ma'lumotlar omboridan tashkil topgan bo'ladi. Biz uni dinamik deyishimizga sabab, bu turdagi serverlar sizning brauzeringizga yuboriladigan fayllarni o'zgartiradi. Misol uchun, bunday serverlar shablonlardan tashkil topgan bo'ladi. Community.uzbekcoders.uz saytini olsak, siz shaxsiy akkauntingiz sahifasiga e'tibor bering: u asosan bir shablondan iborat, faqatgina ma'lumotlar omboridan username,rasm va hokazolarni yuklab olib namoyish etadi. Hammada sahifa har xil bo'lishi mumkin. Bu esa dinamik veb serverning asosiy xossalaridan biri.(Boshqa misol tariqasida: mail.ru sayti.)

Dasturiy ta'minot(Software)

Hozirgi kunda keng tarqalgan veb server sifatida Apache hamda Nginxni ayta olamiz. Apache - veb server, asosan UNIX operatsion tizimlarida ko'proq qo'llaniladi. Apache python,php,ruby,perl kabi dasturlash tillari bilan integratsiyaga ega.

Ngix - bu ham UNIX operatsion tizimlarida ishlovchi veb serverdir. Tezkor, katta hajmdagi yuklanishlarni ko'tarishga qodir. Rembler, Facebook, Xabr, Instagram, Yandeks, Vkontakte, Netflix kabi taniqli loyihalarda Ngix qo'llanilgan.

Apache hamda Ngix asosan bir biriga raqobatchi ammo ularni to'g'ri konfiguratsiya yordamida birga ishlatish ham mumkin. Natija kuchli funksionalga ega veb server vujudga keladi. Reytinga keladigan bo'lsak, albatta Apache birinchi o'rinda Ngix esa ikkinchi o'rinni egallab kelmoqda.

Dasturiy ta'minot sifatida yana: IIS, lighttpd, Google Web server, Resin, Open server kabilarni aytishimiz mumkin.

Server dasturlash tillari haqida

Oddiy html,css bilan saytni server qismini yaratib bo'lmaydi albatta. Buning uchun bizga server dasturlash tillari kerak. iT ning veb dasturlash sohasi aynan shunga qaratilgan.

Veb dasturlash(eng-web programming) - Veb ilovalar ishlab chiqishga yo'naltirilgan dasturlash sohasi. Asosan dinamik veb saytlar ishlab chiqish bilan shug'ullaniladi.

Htmlning o'zi bilan sizning saytingiz statik hamda word hujjatidan farqi qolmaydi. Unga siz Css hamda frontend qismiga javascriptni qo'shishingiz mumkin ammo sayt baribir statik bo'lib qoladi. Uni dinamik qilish uchun sizga server dasturlash tillari va ma'lumotlar ombori zarur.

Veb dasturlashda qo'llaniladigan dasturlash tillari ko'p: Python, PHP, Ruby,Golang,Java,C#,Perl va hokazolar. 

Qo'shimcha: Javascript avvalari saytning frontend qismida qo'llanilgan edi. Node JSning chiqishi bilan backendda ham faol ravishda qo'llanilib kelinmoqda.

Yuqorida keltirilgan dasturlash tillari yordamida siz saytingizni backend qismini to'liq yoza olasiz. Server dasturlash tillari foydalanuvchi bilan server o'rtasida muloqotni so'rovlarni amalga oshirishda xizmat qiladi. Ammo ma'lumotlar qayergadur yozib olinishi kerak. Misol uchun oddiy vaziyat:

  1. Siz veb saytingizda avtorizatsiya&autifikatsiya kabi formalarni joyladingiz.
  2. Ishlatib ko'rish uchun siz uning veb serveringizga so'rov yuborasiz: username, email va parol.
  3. Saytning backend qismi yaratilganligi uchun so'rov serverga yuboriladi, javob ham keldi deylik. Saytdan bir qancha muddat foydalandingiz.
  4. Ammo saytga qayta kirganingizda sizning registratsiyadan o'tish uchun kiritgan ma'lumotlaringzi shunchaki yo'q bo'lib ketadi...(Xuddi live usb operatsion tizimlardagidek)

Yuqoridagi muammoni faqat ma'lumotlar ombori bilan hal etish mumkin. Demak server dasturlash tilining o'zi yetarli bo'lmaydi. Ma'lumotlar omborida username,email, parollar va hokazolar kabi ma'lumotlar saqlanadi. Ular bilan har bir backend dasturchi ishlay olishi shart. Ma'lumotlar ombori backendni asoslaridan biridir. Veb serverga ma'lumotlar ombori bilan ishlay olish uchun dasturiy ta'minot o'rnatilgan bo'lishi zarur. Tanlov uchun sizda :MySQl, PostgreSQL,MS SQL,MongoDB va hokazolar mavjud. Shaxsan men PostgreSQLni tavsiya etaman :)

Serverl dasturlash tillari uchun tanlov ko'p, ammo men pythonni tanlaganman. Shuning uchun hozir o'rganganlarimiz asosida sodda veb server yaratib ko'ramiz)

2.Python dasturlash tilida sodda veb server yaratamiz

Eslatib o'tmoqchiman! Kompyuteringizda python o'rnatilgan bo'lishi va pythonda kod yoza olishingiz uchun matn muharriri bo'lishi zarur. Matn muharrirlari: PyCharm, Sublime va VsCode(python extension)

$ mkdir project
$ cd project

project nomli katalog(papka) yaratdik. Fayllar aynan shu yerda joylashadi. Endi esa run.py  va index.html fayllarini yaratamiz.

$ touch run.py
$ touch index.html

Qisqa qilib aytganda: run.py - veb serverimiz, index.html - oddiy HTML veb sahifa.

index.html faylini ochamiz:

<!DOCTYPE html>
<html>
<head>
  <title>Abduaziz</title>
</head>
<body>
  <h1>Veb sahifa</h1>
</body>
</html>

Oddiy boshlang'ich kodlar, menimcha izohga hojat yo'q)

run.py

from http.server import HTTPServer, BaseHTTPRequestHandler

http.server modulidan HTTPServer, BaseHTTPRequestHandlerlarni import qilib olamiz. HTTPServer - serverni ishga tushirish uchun, BaseHTTPRequestHandler requestlarni tartibga solish uchun(200,404...).

class web_server(BaseHTTPRequestHandler):

Python obyetktga yo'naltirilgan dasturlash tili :)

web_server classini yaratdik. Endi esa uning ichiga web serverimizning funksiyamizni yozamiz:

def do_GET(self):
        if self.path == '/':
            self.path = '/index.html'

do_GET funksiyasi. Foydalanuvchi tomonidan veb serverga '/' bo'yicha so'rov yuborilsa, veb server index.html faylini qaytaradi.

try:
    file_to_open = open(self.path[1:]).read()
    self.send_response(200)

Yuborilgan so'rov bo'yicha resursni izlaydi.Agarda u mavjud bo'lsa u bilan birgalikda 200 status kodini qaytaradi.

except:
     file_to_open = "Not Found ERROR:404 "
     self.send_response(404)
self.end_headers()
self.wfile.write(bytes(file_to_open, 'utf-8'))

(Agar o'xshamasa) Ko'rib turganingizdek so'rov notog'ri kiritilgan bo'lsa veb serverimiz 404[NOT FOUND]ni qaytaradi. HTML sahifada esa Not Found ERROR:404 yozuvuni chop etadi.

Endi esa shunchaki veb serverni ishga tushirish uchun python kodimizning so'ngi qismini kiritsak:

httpd = HTTPServer(('localhost', 8080), web_server)
httpd.serve_forever()

Veb serverimiz localhost(yoki 127.0.0.1 ip manzili) hamda 8080-portda ishga tushadi. httpd.serve_forever() orqali serverimiz butunlay ishga tushushi, ya'ni fayl yopilmagunicha ishlab turishini ta'minlaydi.

from http.server import HTTPServer, BaseHTTPRequestHandler


class web_server(BaseHTTPRequestHandler):

    def do_GET(self):
        if self.path == '/':
            self.path = '/index.html'
        try:
            file_to_open = open(self.path[1:]).read()
            self.send_response(200)
        except:
            file_to_open = "Not Found ERROR:404"
            self.send_response(404)
        self.end_headers()
        self.wfile.write(bytes(file_to_open, 'utf-8'))


httpd = HTTPServer(('localhost', 8080), web_server)
httpd.serve_forever()

Yuqorida kodning umumiy ko'rinishi.

Endi esa shunchaki veb serverimizni ishga tushiramiz.

$ python3 run.py

Terminalda hech narsa sodir bo'lmasligi mumkin, shunchaki  localhost:8080 bo'yicha o'ting:

Server ishlamoqda, ko'rib turganingizdek so'rov yuborilganda index.html faylini oldik. Endi esa biror bir xato so'rov yuborib ko'ramiz(url bo'yicha):

Hammasi biz o'ylagandek, HTTP 404 status kodini oldik. Biz pythonda eng sodda ko'rinishdagi veb serverni tayyorladik. Aslida bularning hammasini flask yoki boshqa veb freymvorkda tayyorlashimiz mumkin edi ammo men sizlarga sodda veb server python dasturlash tilining oddiy kutubxonalari yordamida qanday yaratilishini ko'rsatib bermoqchi edim va maqasadimga yetdim deb o'ylayman.

Xulosa: 

Bugungi maqolamda siz veb server haqida tushunchalarni bilib olgan bo'lsangiz men bundan xursandman. Agarda sizda savol yoki taklif paydo bo'lgan bo'lsa bemalol murojaat qilavering. Xayr salomat bo'ling!

E'tiboringiz uchun tashakkur.