# Tech

Сервер-ийн бүтцийг Apache веб сервертэй

2017-02-08

Вэб сервер програм яаж ажилладаг нь ихэнх шинээр суралцаж байгаа хүмүүст ойлгомжгүй, шидэт хайрцаг мэт байдаг байх. Харин интернет-ээс хайхаар ихэвчлэн хэрхэн суулгах, яаж тохируулах талаар олддог болохоос хэрхэн ажилладаг болон ямар бүтэцтэй талаарх мэдээлэл төдийлөн олдоод байдаггүй. Тиймээс өнөөдөр вэб сервер гэж юу болох, хэрхэн ажилладаг талаар танилцуулж бичье гэж бодлоо. Жишээ болгож хамгийн өргөн хэрэглэгддэг Apache web server-ийн ажиллагаа, бүтцийнх нь талаар уншсан судалснаа хуваалцаж байна. Apache web server-ийн талаар үндсэн ойлголтыг авсанаар цаашид интернетээс олж авах мэдээлэлийг ойлгоход илүү дөхөм болно гэж найдаж байна.

Вэб сервер програм гэж юу вэ?

Вэб сервер програм бол сервер компьютер дээр байрладаг бөгөөд үндсэн үүрэг нь хэрэглэгчээс ирсэн HTTP хүсэлтийг хүлээж авч боловсруулан, хэрэглэгчийн хүсэлтэнд харгалзах хариу HTML болон бусад файл, обьектуудыг буцааж явуулах үүрэг бүхий програм юм. Хэрвээ динамик вэб сервер ажиллаж байгаа бол вэб сервер програм нь тухайн програмын хэлтэй хосолж ажиллах шаардлагатай.

Тиймээс вэб сервер програм нь
- Интернет протоколууд (http, tcp, ip ftp…) дээр ажилладаг

- Ирсэн хүсэлтийг задалж боловсруулдаг

- Бусад сервер програмуудтай (java, php…) хосолж ажилладаг байна

Үүнээс гадна:

- Тогтвортой ажиллагаа (availability)

- Уян хатан байх (flexibility)
- Нэг доор олон хүсэлтийг хүлээж авах (concurrency and isolation)
- Үйлдлийн системийн ялгааг арилгаж ажиллах (operation system env)
- Хэрэглээндээ тааруулж тохируулах, функц нэмж хасах (scalability, expandability)
зэрэг боломжуудыг агуулсан байх шаардлагатай.

Apache, Nginx, Microsoft IIS, Webrick гэх мэтчлэн олон төрлийн вэб сервер программууд байдгаас одоогоор Apache веб сервер нийт интернетийн 50-с дээш хувийг хангаж байна.

Apache веб серверийн товч түүх

1996 оноос Robert McCool үндсийг нь тавьсан веб сервер бөгөөд NCSA HTTPd серверийг цааш нь үргэлжлүүлэн OpenSource болгосон төсөл юм. Одоогоор Apache Software Foundation хөгжүүлэлтийг нь хариуцдаг Unix-д зориулан гаргасан энэхүү вэб сервер нь өнөөдрийг хүртэл хөгжихдөөн олон функцуудыг нэмж улам сайжирсаар өдийг хүрчээ. Apache лиценз бүхий энэхүү програмыг C/C++ болон XML хэл голлон ашиглаж хөгжүүлсэн болно.

Apache-н бүтэц ба хэрэглээ

Apache-г өөрсдийн хэрэглээндээ тааруулж ашиглахад Apache-н ажиллагааны талаарх ерөнхий мэдлэг, бүтэц болон мэргэжлийн хэллэгүүдийг мэдэх шаардлагатай байдаг. Ямар функцууд өөрт нь бэлэн байдгийг мэдсэнээрээ магад зарим хөгжүүлэлтийг веб сайт дээр хийлгүйгээр Apache-н модулиас авч ашиглаж болох юм. Тиймээс дараах ойлголтуудыг ерөнхийд нь тодорхойлъё.
- MPM – apache Multi-Processing Module
- APR – Apache Portable Runtime
- Process болон Thread гэж юу болох, Apache нь эдгээрийг яаж ашигладаг
- Modular architecture
- Module

MPM (Multi-Processing Module)

Apache нь олон зэрэг хүсэлтийг хүлээн авахын тулд параллель ажиллах шаардлагатай болдог ба үүнийгээ гүйцэтгэхийн тулд multi-processing, multi-thread болон mixture буюу thread process-ийн хослолыг ашиглах гэсэн үндсэн сонголтууд байдаг. Үйлдлийн системийн зарим нь thread-тэй сайн ажилладаг бол, зарим нь process-тэй илүү сайн ажилладаг. Энэ сонголтыг хийхэд ашиглаж буй програмын хэл мөн чухал үүрэг гүйцэтгэдэг. Жишээлбэл: PHP нь процесс талдаа сайн ажилладаг бол Java хэл нь аль алинд нь сайн ажилладаг. Энэхүү параллель ажиллагааг Apache-н MPM хэмээх модуль гардан гүйцэтгэдэг.

Multi-processing-н ерөнхий ойлголт

Компьютер нэг дор олон програмуудыг зэрэг ажиллуулах шаардлагатай ба эдгээр нь кибер ертөнцөд тус тусдаа процесс болон оршдог. Аливаа процесс нь хэд хэдэн resource-тай байдгаас memory resource, cpu resource болон үйлдлийн системийн resource гурав нь голлох үүрэг гүйцэтгэнэ. Memory resource болон cpu resource нь ерөнхийдөө ойлгомжтой ч үйлдлийн системийн resource нь их өвөрмөц. Нэг ээлжинд ажиллах хугацаа, нээлттэй байгаа файлуудын жагсаалт, хүлээлгэнд байгаа эсэх, сүлжээ ашиглаж байгаа эсэх, процессийн priority (зэрэглэл) гэх мэт нь үйлдлийн системийн resource юм. Мэдээж нэг процессоос нөгөө процессруу шилжих үйлдэл тодорхой хэмжээний хугацаа шаарддаг нь санах ой дахь зарим датаг шинэчлэх, cpu дахь регистерүүдийг шинэчлэх, шилжиж ирсэн процессийн сүүлийн үйлдлийг сэргээх гэх зэргээр хамаарна.

Харин Apache-н хувьд нэг дор олон хэрэглэгчийн хүсэлтийг зохицуулах арга нь шинэ процесс үүсгэх буюу хүсэлт бүрийг нэг процесс хүлээн авч боловсруулах юм. Тийм болохоор хөгжүүлэгчид apache-н тохиргоонд үүсгэж болох процессийн дээд хязгаар тоог зааж өгөх боломжтой. Нөгөөтэйгүүр үйлдлийн систем нь шинээр процесс үүсгэх нь бас их хугацаа шаарддаг учраас тэр болгонд нь үүсгэвэл програм маань удаан ажиллана. Тэгвэл apache энэ асуудлыг process pool буюу процессүүдийг урьдчилан үүсгээд бэлдэх замаар зохицуулах бөгөөд үүнийг мөн тохируулах боломжтой.

Multi-threading

Multi-threading бол ихэнх хүмүүсийн хэлж заншсанаар хөнгөн процесс гэдэг нь учиртай. Хөнгөрүүлж байгаа гол шалтгаан нь дээр дурьдсан гурван resource-аас (memory, cpu, OS) санах ой нь дундынх байдагт оршино. Нэг процесс олон трэдтэй байх ба бүх трэд адилхан санах ойн датаг хуваалцаж ажиллана. Иймд нэг трэдээс нөгөөд шилжих үйлдэл хурдасна гэсэн үг. Харамсалтай нь үйлдлийн системийн онцлог болон ашиглаж байгаа программын хэлнээс шалтгаалан энэ сонголт боломжгүй болох нь олон ба үүн дээр ашиглаж байгаа хөгжүүлэлтийн сан (library) хүртэл нөлөөлнө.

Mixture буюу процесс трэдийн хослол

Аль алиныхаа давуу талыг ашиглаж нэгнээр нь нөгөөгийнхөө сул талыг нөхөж байвал процесс трэдийг хослуулах шиг сайхан сонголт байхгүй. Ажиллаж байгаа сервер компьютэртээ тааруулж тохируулбал маш сайн ажиллана.

APR (Apache Portable Runtime

APR нь Apache-ийн зүгээс MPM-ийн ямар ч горимд ажиллаж байсан вэб сайт хөгжүүлэгчид асуудалгүй ажиллагааг хангах үүрэг бүхий орчин бүрдүүлнэ. APR-ыг Java хэлний JRE (Java Runtime Environment)-тэй адилтгаж болон юм. Өөр өөр үйлдлийн системд суугаад орчины ялгааг арилган адилхан interface-ээр хангана.

Modular architecture

Apache-ийн бахархал болсон дизайн шийдэл болох modular architecture нь олон функцуудыг өөртөө агуулдаг мөртлөө асуудалгүй ажиллагааг хангаж хурдтай хэвээрээ байдгийн гол нууц гэж хэлж болох юм. Apache-core гэх цөм модуль ба бусад модулиуд гэсэн ерөнхий бүтэцтэй.
Зөвхөн цөм модуль нь бусад модультай харьцах бөгөөд энэ нь модулиудын хоорондох шууд нөлөөг тусгаарлаж аюулгүй ажиллагааг давхар хангадаг. Мөн хүссэн үедээ шинэ модуль нэмж хасах боломжтой ба ингэж шинээр функц нэмж хасахдаа apache-г унтрааж асаах шаардлагагүйгээрээ Nginx мэтийн серверүүдээс ялгардаг. Modular architecture-ийн хамгийн том давуу тал нь мэдээж scalability бөгөөд маш өргөн сонголт бүхий модулиудаас хүссэнээрээ нэмж хасч хэрэглээндээ тааруулж өөрчлөх боломжтой.
Өргөн хэрэглэгддэг модулиудаас дурьдвал:
- mod-ssl, mod-security зэрэг аюулгүй ажиллагааны модулиуд
- mod-perl, mod-python, mod-php зэрэг хөгжүүлэлтийн хэлтэй нийлж ажилладаг модулиуд
- mod-jk, mod-passenger зэрэг apache серверийг өөр бусад TomCat, Passenger серверүүдтэй хосолж ажиллуулдаг гэх мэтчилэн олон модулиудыг дурьдаж болох юм.
Нэгэнт энэхүү хичээлдээ бүх модулиудыг судалж барахгүйгээс apache цөм модулиа цааш нь дэлгэрүүлье.

Apache Core Module

Apache цөм модуль нь үндсэн таван үүрэгтэй:
- Хүсэлт хүлээж авах
- Ирсэн хүсэлтийг зөв задалж харгалзах зөв модульд дамжуулах
- Модуль хоорондын халилцааг хангах
- Ирсэн хүсэлт боловсруулалтын ямар шатандаа явж байгааг хянах
- Бүрэн боловсруулж дууссан хүсэлтийн үр дүнг хэрэглэгчид буцаах

Apache-core-ийн үндсэн бүтцийг зураглавал:

Apache Request Phase

Apache Request Phase нь хэрэглэгчээс ирсэн хүсэлт нэг бүрийн ямар шат дараалалтай боловсруулагддагийг хянадаг хүсэлтийн төлөв юм. Үүнд:
- URI to filename translation
http хүсэлтийн URI хаягийг задлах
- Header parsing
Хүсэлтийн header (толгой) мэдээллийг задалж унших
- Access control based on host and more
Хүсэлт ямар файл хүсэлттэй болон ямар модуль ажиллуулахыг тодорхойлох
- Authenticate: Get user_id from http and validate
Хэрэглэгчийн зэрэглэлийг тодорхойлох (admin, guest…)
- Authorization
Тодорхойлсон хэрэглэгч ирүүлсэн хүсэлтийг гүйцэтгэх эрхтэй эсэхийг тодорхойлох
- Determine MIME (return filetypes etc)
Товчхондоо бол модулийг дуудна. Модулиудын онцлогоос шалтгаалж олон үйлдэл хийнэ
- Fix-ups (update header, replace alias etc.)
Модулиас ирсэн хариуг бас засварлана. Жишээлбэл буцаах хариу response-ийн header-ийг өөрчилнө.
- Send response to client
Хүсэлтийг ирсэн хаягаар нь буцаана. Амжилтгүй бол дахиж явуулна.
- Log request
Хүсэлтийг гүйцэтгэлийг баримтжуулж Log болгож үлдээнэ
- Cleanup
Гүйцэтгэсэн хүсэлтийг биелүүлэхэд шаардагдсан орчинг цэвэрлэж шинэ хүсэлт хүлээж авахад бэлдэнэ.
энэхүү төлвүүд нь apache 1.3 дээр үндэслэсэн болно.

Ажиллагаа ба тохиргооны хувьд

Дээр дурьдсанчлан apache хүсэлт хурдан хүлээж авахад бэлдээд процесс болон трэдүүдийг урьдчилж үүсгэдэг гэсэн. Тэгвэл apache нэг хүсэлтийг боловсруулахад хэдий хугацаа зарцуулсан, дараагийн хүсэлт хэр удаан хүлээсний эцэст ирсэн зэргийг хөтөлдөг онооны самбартай ба тэрнийхээ үр дүнд үндэслэн одоо байгаа процесс болон трэдийн тоо хангалттай эсэхийг тодорхойлдог аж. Энэ нь ид ачааллын үед нэмж олон процесс, трэд үүсгэх ба ачаалал багатай үед зарим процессээ устгаж ажиллахад нь тус болдог байна. Анхны тохиргоогоороо apache 3-аас 5-н процесс бэлэн байлгадаг, нэг процесс дээд тал нь 50-н трэп үүсгэх боломжтойгоор тохируулагдсан байдаг ба тухайн агшинд 256-н хүсэлтийг хүлээж авч боловсруулж байх чадвартай юм байна.

Өөр нэгэн чухал хүчин зүйл бол интернет холбол (tcp) юм. Аливаа вэб сайтыг ачааллахад html, css, зурагнууд гэх мэт олон файлын хүсэлтүүд ирдэг бөгөөд тэр болгонд нь шинээр холболт үүсгээд байвал асар удахаас гадна серверт их хэмжээний ачаалал өгнө. Тиймээс apache нэг холболтоор дээд тал нь 100-н хүсэлт хүрээж авахаар тохируулагджээ. Энэ нь мэдээж нэг л хэрэглэгчийн 100 хүсэлт ба энэнээс их хүсэлт ирвэл дундуур нь холболтоо таслаад дахиж шинээр холболт үүсгэнэ. Гэхдээ энэ тоо ихэнхдээ хангалттай юм.

Төгсгөлд нь гэж хэлэхэд Apache болон вэб серверийг хамарсан сэдэв маш өргөн учраас өнөөдөр зөвхөн багахан хэсгийг нь л авч үзлээ. Бид apache-ийн бүтэц ажиллагааг нарийвчилж харсанаар магад ирээдүйд өөрсдийн ажил амьдралдаа apache-ийн шалгарсан шийдлээс санаа авч хөгжүүлэлтээ хийх, суралцах, наандаж л өөр бусад серверүүдтэй харьцуулж давуу тал сул талыг нь тодорхойлох чадвартай болон юм.

Сэтгэгдэл

Unimedia LLC

Web development is changing very fast and getting more complex each day