diff --git a/docs/devops/03-nginx.md b/docs/devops/03-nginx.md index ae5cf292..932e5538 100644 --- a/docs/devops/03-nginx.md +++ b/docs/devops/03-nginx.md @@ -1,87 +1,4 @@ --- title: Nginx description: وب‌سرور دوست‌داشتنی ---- - -## وب سرور (Web server) -فرض کنید میخواهیم به صورت اولیه یک وب سایت داخل شبکه بارگذاری کنیم تا افراد بتوانند به راحتی با آن ارتباط برقرار کنند و توسط آن یک سری داده متنی، تصویری یا ویدیویی رد و بدل کنند. یکی از بخش های مهم این پروسه استفاده از وب سرورها است. - -وب سرور یک نرم افزار یا سخت افزار کامپیوتری است که از پروتکل HTTP و پروتکل های دیگر برای پاسخ به درخواست های مشتری که از طریق وب انجام می شود، استفاده می کند. وظیفه اصلی وب سرور نمایش محتوای وب سایت از طریق ذخیره سازی، پردازش و ارائه صفحات وب به صورت فایل HTML همراه با هر نوع داده دیگری مانند تصویر، متن، فایل‌های CSS و همچنین جاوا اسکریپت به کاربران است. وب سرورها علاوه بر HTTP از SMTP و FTP نیز پشتیبانی می کنند. - -حال به صورت دقیق‌تر به کارکرد وب سرور می‌پردازیم. -فرض کنید در خانه نشسته‌اید. طی اتفاقاتی به اطلاعات خاصی از وب‌سایت [example.com](https://www.example.com/) نیاز پیدا می‌کنید. به همین دلیل با وارد کردن URL خواسته‌شده در مرورگر خود، درخواست خود را صادر می‌کنید. در مرحله بعد مرورگر با استفاده از پروتکل DNS آدرس IP سایت [example.com](https://www.example.com/) را پیدا می‌کند و با این کار، مرورگر به یک وب سرور منتقل می شود. سپس مرورگر با درخواست HTTP فایل خاصی را از وب سرور درخواست می کند. وب سرور پاسخ خواهد داد و مجدداً از طریق HTTP صفحه درخواستی را برای مرورگر ارسال می کند. اگر صفحه درخواستی وجود نداشته باشد یا مشکلی پیش بیاید، وب سرور با یک پیام خطا پاسخ خواهد داد. سپس مرورگر قادر به نمایش صفحه وب خواهد بود. - -در این بخش به تقابل وب سرور Static در مقابل وب سرور Dynamic می‌پردازیم. -یک وب سرور می‌تواند برای ارائه محتوای ثابت یا پویا استفاده شود. محتوای ثابت به محتوایی اشاره دارد که همانطور که هست نشان داده می شود، در حالی که محتوای پویا را می توان به روز کرد و آن را به صورت شخصی سازی شده تغییر داد. یک وب سرور Static از یک کامپیوتر و نرم افزار HTTP تشکیل شده است و فایل های میزبانی شده را همانطور که هست به یک مرورگر ارسال می کند. در حالی که در وب سرور پویا از یک وب سرور و سایر نرم افزارها مانند برنامه Backend و پایگاه داده استفاده می کنیم تا داده‌ها را به صورت متغیر و شخصی سازی شده به او نشان دهیم. - -برای کسب اطلاعات بیشتر راجع به وب سرور میتوانید به [این لینک](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_web_server) مراجعه کنید. - -## پروکسی معکوس (Reverse Proxy) -حال فرض کنید وب سایت خود را گسترش داده‌اید و این وب سایت چندین سرویس ارائه می دهد. پس تصمیم می گیرید تا به جای پاسخ دهی به کاربران توسط یک سرور، چندین سرور با وظایف متفاوت ایجاد کنید. از آن جایی که اضافه شدن این سرورها باعث ایجاد پیچیدگی سیستم میشود، علاقمندیم تا همه این سرورها را تا حد توان از دید کاربر پنهان نگه داریم و کاربر صرفا با یک سرور تعامل داشته باشد. -Reverse proxy ابزاری است که تحت عنوان یک سرور مستقل امکانات متعددی را در اختیار ما قرار میدهد تا بتوانیم به نیازهای بیان شده پاسخ دهیم. -Reverse Proxy یک مدل معماری شبکه است که در آن یک سرور واسط بین کلاینت و سرور اصلی قرار می‌گیرد. در این مدل، درخواست‌های کلاینت به سرور اصلی ارسال نمی‌شوند، بلکه ابتدا به ریورس پروکسی می‌رسند و سپس ریورس پروکسی مسئول ارسال درخواست به سرور اصلی و دریافت پاسخ آن است. - -به طور خلاصه، فرایند کارکرد یک Reverse Proxy به این شکل است: -فرض کنید یک وب سرور به عنوان Reverse Proxy در مقابل چندین وب سرور داخلی با IP Address های 192.168.1.04 و 192.168.1.03 و 192.168.1.02 قرار گرفته است. -- کاربر یک درخواست به آدرس [example.com](https://www.example.com/) ارسال می‌کند. -- درخواست به Reverse proxy می‌رسد. -- Reverse proxy بر اساس قوانین تعریف شده، آدرس درخواست را با یکی از آدرس‌های سرورهای داخلی مثل 192.168.1.03 جایگزین می‌کند. -- درخواست را به سرور مقصد ارسال می‌کند. -- پاسخ از سرور داخلی دریافت و برای کاربر ارسال می‌شود. - - -برای کسب اطلاعات بیشتر راجع به Reverse proxy میتوانید به [این لینک](https://liara.ir/blog/%D9%BE%D8%B1%D9%88%DA%A9%D8%B3%DB%8C-%D9%85%D8%B9%DA%A9%D9%88%D8%B3-reverse-proxy-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F/) مراجعه کنید. - - -![Reverse Proxy Picture](./images/reverse_proxy.png) - -## متعادل کننده بار (Load Balancer) -حال فرض کنید این وبسایت راه اندازی شده چندین سرویس مختلف ارائه می‌دهد و هر سرویس بار بسیار زیادی را تحمل میکند. تعداد درخواست‌ها به هر سرور بسیار زیاد شده است و یک سرور نمی‌تواند به همه درخواست‌ها بدرستی و در زمان کوتاه پاسخ دهد. -حال این چالش را میتوان به روش‌های مختلفی حل کرد: -- اضافه کردن منابع (CPU و RAM و Memory و …) سرور که با هزینه زیادی همراه است و scalable هم نیست. -- اضافه کردن چند سرور با وظایف مشابه و تقسیم بار روی چندین سرور به جای یک سرور که این حالت scalable است. -برای انجام روش دوم، با مفهومی به نام Load balancing آشنا می شویم. لود بالانسینگ (Load Balancing) یا متعادل‌کردن بار به معنای توزیع یکسان بار یا ترافیک ورودی به یک شبکه، میان گروهی از سرورهای بک‌اند می‌باشد. این عمل توسط یک لود بالانسر (Load Balancer) انجام شده و باعث می‌شود تا سرور در ساعات اوج ترافیک دچار کندی و یا اختلال نشود. لود بالانسر میان کلاینت‌ها و سرورها قرار گرفته و به گونه‌ای ترافیک را توزیع می‌کند که بر هیچ‌یک از سرورها فشاری وارد نشود. برای درک بهتر لود بالانسینگ به این مثال توجه کنید. فرض کنید فروشگاهی دارای ۱۰ صندوق است که تنها یکی از آن‌ها کار می‌کند و در چنین شرایطی تمام مشتریان مجبورند در صفی طولانی بایستند و فرد صندوق‌دار نیز باید کار تمام آن‌ها راه بیندازد که این عمل باعث خستگی و کاهش بهره‌وری آن فرد در حین کار می‌شود. حال فرض کنید به‌یکباره تمام صندوق‌ها شروع به کار کرده و تمام مشتریان به صورت مساوی میان آن‌ها تقسیم شوند. در این حالت مشتریان زودتر از فروشگاه خارج شده و صندوق‌دار‌ها نیز دچار خستگی نمی‌شوند. لودبالانسینگ هم دقیقا به همین صورت عمل می‌کند. - -حال شما میتوانید بر اساس نیاز و نوع استفاده از تکنیک‌های متفاوتی برای Load Balancing استفاده کنید. -- الگوریتم Round Robin: در این نوع الگوریتم، ترافیک ورودی به شبکه به صورت زنجیره‌ای و پشت‌سرهم میان سرورها تقسیم می‌شود. این متد اغلب زمانی مورد استفاده قرار می‌گیرد که تمام سرورها دارای مشخصات یکسان باشند. -- الگوریتم Weighted round-robin: نوعی الگوریتم لود بالانسینگ است که در آن شما با توجه به ظرفیت و عملکرد سرورها می‌توانید ترافیک ورودی را میان آن‌ها تقسیم می‌کند. به عنوان مثال می‌توانید بیشتر ترافیک وب‌سایت خود را به سمت سروری که منابع قوی‌تری دارد، ارسال کنید. -- الگوریتم IP Hash: در این متد، لود بالانسرها محاسبات ریاضی به نام Hashing را بر روی آدرس‌های IP انجام داده و بر اساس عدد بدست آمده، ترافیک آن‌ها را به سمت سرورهای مناسب هدایت می‌کنند. با استفاده از این روش می‌توانید مطمئن شوید که درخواست‌های یک IP هر بار تنها به سمت یک سرور خاص می‌روند. -- الگوریتم Weighted least connection: در این الگوریتم، تعداد درخواست‌های ارسالی به هر سرور بر اساس میزان عملکرد و ظرفیت مشخص می‌شود و بنابراین سرورهای قدرتمندتر نسبت به سایر سرورها باید تعداد اتصالات بیشتری داشته باشند. -- -برای آشنایی بیشتر با لود بالانسینگ (Load Balancing) میتوانید به [این لینک](https://aws.amazon.com/what-is/load-balancing/#:~:text=A%20load%20balancer%20is%20a,resource%20servers%20are%20used%20equally.) رجوع کنید. - -## وب‌سرور دوست‌داشتنی Nginx -حال پس از آشنا شدن با کلیدواژه‌های reverse proxy، web server و همچنین load balancing به سراغ ابزاری می‌رویم که همه این امکانات را برای ما فراهم می‌کند. - -وب سرور Nginx یک وب سرور با عملکرد بالا است که علاوه بر این، به عنوان یک پروکسی معکوس، پروکسی ایمیل، لود بالانسر و پروکسی عمومی TCP/UDP عمل می‌کند. این سیستم برای اولین بار توسط ایگور سیسوئف توسعه یافت و در سال ۲۰۰۴ به صورت عمومی منتشر شد. Nginx به خاطر ثبات، مجموعه ویژگی‌های غنی، پیکربندی ساده و مصرف کم منابع شناخته شده است. - - -در اینجا به تفصیل به ویژگی‌ها و قابلیت‌های کلیدی آن می‌پردازیم: - - -۱) وب سرور: Nginx برای ارائه محتوای استاتیک به صورت سریع و کارآمد استفاده می‌شود. همچنین می‌توان از آن به عنوان وب سرور برای محتوای داینامیک نیز استفاده کرد، اگرچه این قابلیت معمولاً شامل واگذاری جنبه‌های داینامیک به یک سرور برنامه پشت Nginx است که به عنوان یک پروکسی معکوس استفاده می‌شود. - - -۲) پروکسی معکوس: Nginx، می‌تواند ترافیک ورودی را بین چندین سرور پشتی توزیع کند، پاسخ‌ها را کش کند، و بهبود امنیت و عملکرد را فراهم کند. این برای تعادل بار بین چندین سرور برنامه یا برای کش کردن سایت‌های کند مبتنی بر پایگاه داده مورد استفاده قرار می‌گیرد. - - -۳) توزیع بار: سیستم توزیع بار Nginx می‌تواند درخواست مشتریان را بر اساس IP ،URL و دیگر خصوصیات توزیع کند و از هر دو خصوصیت active/passive health check پشتیبانی می‌کند تا اطمینان حاصل شود ترافیک فقط به سرورهای سالم هدایت می‌شود. - - -۴) کش HTTP: Nginx می‌تواند پاسخ‌ها را در کش ذخیره و بازیابی کند تا بار روی سرورهای برنامه را کاهش دهد و زمان پاسخ را سرعت ببخشد. - - -۵) فشرده‌سازی محتوا: Nginx، از فشرده‌سازی محتوا با استفاده از gzip پشتیبانی می‌کند تا مقدار داده‌هایی که باید از طریق شبکه ارسال شود را کاهش دهد. - - -۶) انعطاف‌پذیری در پیکربندی: فایل پیکربندی Nginx هم ساده و هم قدرتمند است، که امکان تغییر مسیر آسان، بازنویسی URL‌ها و بسیاری موارد دیگر را فراهم می‌کند. - - -۷) همزمانی(Concurrency): ابزار Nginx با معماری رویداد محور(event-driven architecture) خود، تعداد زیادی اتصال همزمان را بسیار کارآمد مدیریت می‌کند. این امر باعث سهولت هرچه بیشتر پاسخ دهی به درخواست کاربران می‌شود. - - - - - - - +--- \ No newline at end of file diff --git a/docs/devops/06-test-concept.md b/docs/devops/06-test-concept.md index 23bb62e5..bac54c62 100644 --- a/docs/devops/06-test-concept.md +++ b/docs/devops/06-test-concept.md @@ -1,37 +1,4 @@ --- title: Test Concept description: وقتی همه چیز باید درست باشد ---- - -تست نرم افزار یکی از فرایندهای اصلی و مهم در توسعه نرم افزار است. در چرخه (SDLC (Software Development Life Cycle، فرایند تست پس از پیاده‌سازی یک بخش از نرم افزار قرار میگیرد. در این بخش با روش‌های گوناگون سعی می‌کنیم تا مطمئن شویم نرم افزار بدرستی کار میکند. در این فصل ابتدا با لزوم وجود تست در انواع و سطوح مختلف توسعه نرم افزار رو به رو میشویم و پس از آن با انواع روش‌های اعمال تست آشنا می‌شویم. - - - -در بخش اول با این سوال مواجه میشویم. چرا باید نرم افزار را تست کنیم؟ آیا دستی تست کردن نرم افزار کفایت نمی‌کند؟ این سوالات و برخی سوالات دیگر، پرسش‌هایی است که در این بخش به آن‌ها میپردازیم. - -نرم افزار یک موجود زنده است و مدام در حال توسعه است. این توسعه‌ها باعث ایجاد کامپوننت‌های بزرگ با پیچیدگی‌های زیادی میشود. تغییر داخل یکی از این کامپوننت‌ها ممکن است به چندین بخش سامانه آسیب برساند و چندین باگ بزرگ و کوچک ایجاد کند. طبق یکی از اصول مهم نرم افزار، هیچ نرم افزار بدون باگی وجود ندارد و کشف نکردن باگ‌ها به معنی بدون باگ بودن نرم افزار نیست ولی نیاز داریم تا با تست درست سامانه و کشف هرچه بیشتر باگ‌ها از پدید آمدن آن‌ها تا حد توان جلوگیری کنیم. - -در این بخش با چند مورد از مهمترین رویکردهای تست آشنا میشویم: - -- تست دود (Smoke testing): در این رویکرد، کارکرد کلی محصول، رفتار و functionality های اولیه و بسیار مهم محصول تست میشود به گونه‌ای که با fail شدن تست‌ها میتوان گفت محصول به باگ‌هایی با اولویت بسیار بالا برخورده است. -- تست رگرسیون (Regression testing): فرض کنید بخشی از یک کامپوننت درون نرم افزار دستخوش تغییر میشود. این تغییرات ممکن است چندین جای سامانه را هدف گیرد و آن‌ها را تغییر دهد. تست رگرسیون نوعی تست نرم افزاری است که پس از به روز رسانی کد انجام می شود تا اطمینان حاصل شود که به روزرسانی کد هیچ باگ جدیدی ایجاد نکرده است. این امر به این دلیل است که کد جدید ممکن است منطق جدیدی وارد کند که با کد موجود در تضاد باشد و منجر به ایجاد باگ شود. - -چندین رویکرد مهم دیگر نیز مثل Acceptance testing یا Sanity testing و … نیز وجود دارند که میتوانید آن‌ها را مطالعه کنید. - -![Test types](./images/test_types.jpg) - -Functional testing: این تست‌ها کارکرد عملی و کاربردی نرم افزار را هدف می‌گیرند. این نوع تست به چندین زیر نوع تقسیم میشود که در ادامه به توضیح آن‌ها میپردازیم. - -Unit testing: Unit testing یک مرحله از تست نرم افزار است که در آن بخش‌های کوچک از یک برنامه (Units) یا کامپوننت‌های مختلف یک نرم افزار تست می‌شوند. منظور از بخش کوچک یک برنامه، کلاس‌ها و توابع است. برنامه نویسان از Unit Test استفاده می‌کنند تا از صحت و درستی کد خود اطمینان کسب کنند. این تست به صورت white box انجام میشود. تست white box به تست‌هایی می‌گویند که توسعه دهنده در آن به سورس کد برنامه دسترسی دارد. - -Integration testing: شاید در نگاه اول و از دید فردی که در حوزه‌ی نرم‌افزارهای Enterprise تجربه‌ای نداشته است،‌ اگر هر کدام از ماژول‌ها یا بخش‌های نرم‌افزار، به تنهایی خوب و درست کار کنند؛ قاعدتا در صورتی که وارد سیستم شوند و با ماژول‌های دیگر در رابطه باشند هم درست کار میکنند و مشکلی پیش نخواهد آمد. اما در واقعیت اینطور نیست! بلکه وصل کردن ماژول‌های مختلف یک سیستم نرم‌افزاری به یکدیگر، به خودیِ خود یکی از پرچالش‌ترین مسائل در طراحی نرم‌افزار است. تست یکپارچه‌سازی یک تست نرم‌افزاری است که در آن ماژول‌های نرم‌افزاری منحصر به فرد به عنوان یک گروه ترکیب و آزمایش می‌شوند. این تست برای ارزیابی انطباق یک سیستم یا یک جزء(component) با نیازمندی‌های عملکردی مشخص انجام میشود. تست یکپارچه سازی، پس از تست واحد(Unit testing) و قبل از تست کل سیستم(System testing) انجام می‌شود. تست یکپارچه سازی ماژول‌هایی را که روی آنها تست واحد(Unit testing) انجام شده‌ است را به عنوان ورودی می‌گیرد و آن‌ها را در گروه‌های بزرگتری دسته‌بندی می‌کند و تست‌های تعریف شده را روی آن گروه‌ها انجام می‌دهد. خروجی آن، سیستم یکپارچه شده‌ است که آماده برای تست سیستم(System testing) است. این تست به صورت gray box انجام میشود. - -Acceptance testing: تست پذیرش روشی در تست نرم افزار است که در آن، یک سیستم برای پذیرش، آزموده یا بررسی می‌شود. این تست، تطبیق سیستم را با requirements، ارزیابی و بررسی می‌کند که آیا برای آماده تحویل به مشتری است یا خیر. تست پذیرش آخرین مرحله تست نرم افزار است که پس از تست سیستم و پیش از ایجاد سیستم برای مصارف عمومی انجام می‌شود و به صورت black box انجام میشود. تست black box به تست‌هایی می‌گویند که توسعه دهنده در آن به سورس کد برنامه دسترسی ندارد و صرفا به نحوه کارکرد برنامه، flow های آن و برخی نمودارهای آن مثل UML و … دسترسی دارد. - -انواع مختلف دیگری از انواع تست نیز وجود دارند که هریک جنبه خاصی از نرم افزار را مورد بررسی قرار میدهند و بر اساس نیاز محصول و بودجه مورد نظر میتوانند روی محصول اعمال شوند. - -یکی از مهمترین موضوعاتی که باید به آن دقت کنیم حرکت از سمت تست دستی به سمت تست خودکار است. در موارد بسیار کمی به دلیل زیاد بودن هزینه نسبت به سود بدست آمده، باید از همان تست دستی استفاده کنیم چون خودکار کردن برخی روال‌ها هزینه بسیار زیادی را به ما متحمل میکند. اما این تست‌ها، بخش بسیار ناچیزی از فرایند ما را شامل میشوند. - -در هر بروزرسانی کد محصول، باید از کیفیت آن مطمئن شویم. همچنین از خراب نشدن قسمت‌های قبلی و منطق‌های پیشین کد اطمینان حاصل کنیم. به همین دلیل باید علاوه بر کد جدید از صحت و خراب نشدن کدهای قدیمی نیز اطمینان حاصل کنیم. با توجه افزایش هر روز حجم کد، تست کردن دستی محصول طبیعتا امری غیر ممکن و طاقت فرسا میشود. بنابراین با حرکت به سمت تست خودکار و انجام آن‌ها در زمان‌های دلخواه و مناسب میتوانیم باعث افزایش کیفیت محصول و همچنین کاهش زمان تست شویم. - -در نتیجه باید در جهت افزایش تست خودکار محصول و جلوگیری از تست‌های دستی تا حد توان بکوشیم و به بلوغ و کیفیت محصول کمک کنیم. +--- \ No newline at end of file diff --git a/docs/devops/images/reverse_proxy.png b/docs/devops/images/reverse_proxy.png deleted file mode 100644 index fd2a4243..00000000 Binary files a/docs/devops/images/reverse_proxy.png and /dev/null differ diff --git a/docs/devops/images/sdlc.png b/docs/devops/images/sdlc.png deleted file mode 100644 index 7de8bdf5..00000000 Binary files a/docs/devops/images/sdlc.png and /dev/null differ diff --git a/docs/devops/images/test_types.jpg b/docs/devops/images/test_types.jpg deleted file mode 100644 index a9cbb398..00000000 Binary files a/docs/devops/images/test_types.jpg and /dev/null differ diff --git a/docs/devops/test_types.jpg b/docs/devops/test_types.jpg deleted file mode 100644 index a9cbb398..00000000 Binary files a/docs/devops/test_types.jpg and /dev/null differ