سرور مجازی

۶ مطلب با کلمه‌ی کلیدی «خرید سرور مجازی آمریکا» ثبت شده است

  • ۰
  • ۰

 نحوه نصب و استفاده از Homebrew در لینوکس

ورود به سایت

معرفی

Homebrew یک مدیر بسته است که در ابتدا برای macOS توسعه داده شد تا به شما امکان می دهد نرم افزار رایگان و منبع باز را با استفاده از ترمینال خود نصب کنید. سیستم‌های لینوکس همگی از مدیران بسته داخلی خود مانند apt در دبیان، اوبونتو و مشتقات و dnf در Red Hat، Fedora و Rocky Linux برای نصب برنامه‌ها و ابزارها از مخازن بسته‌های قابل اعتماد و نگهداری شده استفاده می‌کنند.

با این حال، نصب همه نرم افزارها از طریق apt یا dnf همیشه عملی نیست. به عنوان مثال، برخی از زبان‌های برنامه‌نویسی ترجیح می‌دهند از مدیریت بسته‌های خود مانند پیتون پایتون یا npm Node.js برای نصب اسکریپت‌ها یا کتابخانه‌های اضافی که در حساب کاربری شما بومی‌سازی شده‌اند استفاده کنند.

اخیراً Homebrew پشتیبانی بومی برای لینوکس اضافه کرده است. در حالی که Homebrew در ابتدا برای نصب ابزارهای لینوکس در macOS ایجاد شد، بسیاری از بسته‌های Homebrew نسبت به بسته‌های مشابه موجود در مخازن لینوکس بهتر نگهداری می‌شوند یا استفاده از آنها راحت‌تر است. همچنین، از آنجایی که بسته های Homebrew فقط برای ارائه عملکرد برای هر کاربر طراحی شده اند، Homebrew می تواند در کنار مدیر بسته سیستم شما بدون ایجاد تداخل استفاده شود.

در این آموزش شما Homebrew را در محیط لینوکس نصب و استفاده می کنید. شما ابزارهای سیستم را نصب کرده و محیط پوسته خود را برای استفاده از Homebrew از رابط خط فرمان پیکربندی خواهید کرد.

پیش نیازها

  • یک سرور لینوکس یا محیط دسکتاپ، و یک کاربر غیر ریشه با امتیازات sudo.
  • گیت ابزار کنترل نسخه بر روی دستگاه شما نصب شده است.

مرحله 1 – نصب یک محیط کامپایلر

قبل از نصب Homebrew، به یک کامپایلر کار نیاز دارید تا Homebrew بتواند بسته ها را بسازد. در حالی که اکثر بسته‌ها از پیش کامپایل شده‌اند، برخی از وابستگی‌های بسته باید مستقیماً روی دستگاه شما ساخته شوند. اکثر توزیع‌های لینوکس به شما اجازه می‌دهند یک کامپایلر را با یک فرمان نصب کنید، اما به طور پیش‌فرض آن را ارائه نمی‌کنند.

در اوبونتو، می‌توانید بسته‌ای به نام build-essential نصب کنید که تمام بسته‌های مورد نیاز برای یک محیط کامپایلر مدرن و با پشتیبانی خوب را فراهم می‌کند. بسته را با apt نصب کنید:

sudo apt build-essential

در راکی لینوکس، CentOS یا سایر مشتقات RedHat، می‌توانید گروهی از بسته‌ها به نام ابزار توسعه را نصب کنید تا عملکرد کامپایلر یکسانی را ارائه دهید. بسته ها را با dnf نصب کنید:

dnf groups mark install “Development Tools”
dnf groupinstall “Development Tools”

شما می توانید با بررسی وجود دستور make در سیستم خود اطمینان حاصل کنید که یک کامپایلر در دسترس است. برای انجام این کار از دستور which استفاده کنید:

which make

 

Output

/usr/bin/make

اکنون که یک کامپایلر فعال دارید، می توانید Homebrew را نصب کنید.

مرحله 2 – نصب و راه اندازی Homebrew

برای نصب Homebrew، یک اسکریپت نصب را دانلود کرده و سپس اسکریپت را اجرا می کنید.

ابتدا اسکریپت را در دستگاه محلی خود دانلود کنید:

curl -fsSL -o install.sh https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh

این دستور از curl برای دانلود اسکریپت نصب Homebrew از مخزن Homebrew’s Git در GitHub استفاده می کند.

بیایید از طریق پرچم هایی که با دستور curl مرتبط هستند عبور کنیم:

  • پرچم -f یا –fail به پوسته می گوید که هیچ خروجی سند HTML روی خطاهای سرور ارائه نکند.
  • پرچم -s یا –silent کرل را بی صدا می کند تا متر پیشرفت را نشان ندهد و همراه با پرچم -S یا –show-error این اطمینان را ایجاد می کند که curl در صورت عدم موفقیت، پیام خطا را نشان می دهد.
  • پرچم -L یا –location به curl می گوید که تغییر مسیرها را مدیریت کند. اگر سرور گزارش دهد که صفحه درخواستی به مکان دیگری منتقل شده است، به طور خودکار درخواست را دوباره با استفاده از مکان جدید اجرا می کند.
  • سوئیچ -o نام فایل محلی را برای فایل مشخص می کند. سوئیچ -o به جای نمایش محتویات روی صفحه، محتویات را در فایلی که شما مشخص کرده اید ذخیره می کند.

قبل از اجرای اسکریپتی که از اینترنت دانلود کرده اید، باید محتویات آن را بررسی کنید تا بدانید اسکریپت چه کاری انجام می دهد. از دستور less برای بررسی اسکریپت نصب استفاده کنید تا بفهمید چه کاری انجام خواهد داد.

less install.sh

هنگامی که با محتوای اسکریپت راحت شدید، اسکریپت را با دستور bash اجرا کنید:

/bin/bash install.sh

اسکریپت نصب توضیح می دهد که چه کاری انجام می دهد و از شما می خواهد تأیید کنید که می خواهید آن را انجام دهید. این به شما امکان می دهد قبل از اینکه اجازه دهید Homebrew دقیقاً چه کاری با سیستم شما انجام دهد. همچنین تضمین می کند که پیش نیازهای لازم را قبل از ادامه آن دارید.

از شما خواسته می شود که رمز عبور خود را در طول فرآیند وارد کنید. اگر امتیازات sudo ندارید، می توانید به جای آن Ctrl+D را فشار دهید تا این دستور را دور بزنید و Homebrew با مجوزهای محدودتر نصب می شود. می توانید این گزینه را در مستندات Homebrew مرور کنید.

هر زمان که از شما خواسته شد تا نصب را تأیید کنید، حرف y را برای “بله” فشار دهید.

پس از تکمیل، خروجی نصب Homebrew شامل مراحل بعدی نیز می شود تا محیط پوسته خود را برای کار با بسته های Homebrew پیکربندی کنید. این پیکربندی تضمین می کند که ابزار Homebrew به نفع ابزارهای ارائه شده توسط مدیر بسته سیستم استفاده می شود. دستورات را از خروجی خود کپی و جایگذاری کنید تا مسیرهای پیکربندی صحیح در سیستم شما شناسایی شود. مثال زیر از bash است:

 

Output

==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/home/sammy/.linuxbrew/bin/brew shellenv)"' >> /home/sammy/.profile
    eval "$(/home/sammy/.linuxbrew/bin/brew shellenv)"

هنگامی که این دو دستور را اجرا کنید، تغییراتی که در متغیر محیطی PATH پوسته خود ایجاد کرده اید اعمال می شود. هنگامی که در آینده دوباره وارد سیستم شوید، آنها به درستی تنظیم می شوند، زیرا فایل پیکربندی پوسته شما به طور خودکار با باز کردن یک جلسه جدید اجرا می شود.

اکنون بررسی کنید که Homebrew به درستی تنظیم شده است. این دستور را اجرا کنید:

brew doctor

اگر در این زمان نیازی به به‌روزرسانی نیست، خروجی زیر را دریافت خواهید کرد:

 

Output

Your system is ready to brew.

در غیر این صورت، ممکن است برای اطمینان از به روز بودن نصب Homebrew، اخطاری برای اجرای دستور دیگری مانند به‌روزرسانی brew دریافت کنید. هر دستورالعمل روی صفحه را دنبال کنید تا پیکربندی محیط خود را قبل از حرکت به پایان برسانید.

مرحله 3 – نصب، ارتقا و حذف بسته ها

اکنون که Homebrew نصب شده است، از آن برای دانلود یک بسته استفاده کنید. دستور درخت به شما امکان می دهد یک درخت دایرکتوری گرافیکی را ببینید و از طریق Homebrew در دسترس است.

درخت را با دستور brew install نصب کنید:

brew install tree

Homebrew لیست بسته های خود را به روز می کند و سپس دستور درخت را دانلود و نصب می کند:

 

Output

. . .
==> Downloading https://ghcr.io/v2/homebrew/core/tree/manifests/2.0.2
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:e1d7569f6930271d694e739e93eb026aac1e8b386
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:e1d7569f6930271d694e739
######################################################################## 100.0%
==> Pouring tree--2.0.2.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/tree/2.0.2: 8 files, 162.4KB
==> Running `brew cleanup tree`...

Homebrew فایل‌ها را به‌طور پیش‌فرض در /home/linuxbrew/.linuxbrew/bin/ نصب می‌کند، بنابراین با به‌روزرسانی‌های آینده لینوکس تداخلی ندارند. با نمایش مکان دستور با کدام دستور تأیید کنید که درخت نصب شده است:

which tree

خروجی نشان می دهد که درخت در /home/linuxbrew/.linuxbrew/bin/ قرار دارد:

 

Output

/home/linuxbrew/.linuxbrew/bin/tree

برای مشاهده نسخه، دستور درخت را اجرا کنید:

tree –version

نسخه روی صفحه چاپ می شود و نشان می دهد که نصب شده است:

 

Output

tree v2.0.2 (c) 1996 - 2022 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro

گاهی اوقات، شما می خواهید یک بسته موجود را ارتقا دهید. از دستور brew upgrade و به دنبال آن نام بسته استفاده کنید:

brew upgrade tree

می‌توانید برای ارتقای همه برنامه‌ها و بسته‌هایی که Homebrew مدیریت می‌کند، بدون هیچ استدلال اضافی، ارتقاء دم را اجرا کنید.

هنگامی که نسخه جدیدی را نصب می کنید، Homebrew نسخه قدیمی را در اطراف نگه می دارد. پس از مدتی، ممکن است بخواهید فضای دیسک را با حذف این کپی‌های قدیمی‌تر بازیابی کنید. برای حذف تمام نسخه‌های قدیمی نرم‌افزار مدیریت شده توسط Homebrew خود، Brew cleanup را اجرا کنید.

برای حذف بسته‌ای که دیگر از آن استفاده نمی‌کنید، از brew uninstall استفاده کنید. برای حذف دستور درخت، این دستور را اجرا کنید:

brew uninstall tree

خروجی نشان می دهد که بسته حذف شده است:

 

Output

Uninstalling /home/linuxbrew/.linuxbrew/Cellar/tree/2.0.2... (8 files, 162.4KB)

مرحله 4 – حذف نصب Homebrew

اگر دیگر نیازی به Homebrew ندارید، می توانید از اسکریپت حذف نصب آن استفاده کنید.

دانلود اسکریپت حذف با curl:

curl -fsSL -o uninstall.sh https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh

مثل همیشه، محتویات اسکریپت را با دستور less برای تایید محتویات اسکریپت مرور کنید:

less uninstall.sh

هنگامی که اسکریپت را تأیید کردید، اسکریپت را با پرچم –help اجرا کنید تا گزینه های مختلفی را که می توانید استفاده کنید مشاهده کنید:

bash uninstall.sh –help

گزینه هایی که روی صفحه نمایش داده می شوند:

 

Output

Homebrew Uninstaller
Usage: uninstall.sh [options]
    -p, --path=PATH  Sets Homebrew prefix. Defaults to /usr/local.
        --skip-cache-and-logs
                     Skips removal of HOMEBREW_CACHE and HOMEBREW_LOGS.
    -f, --force      Uninstall without prompting.
    -q, --quiet      Suppress all output.
    -d, --dry-run    Simulate uninstall but don't remove anything.
    -h, --help       Display this message.

از پرچم -d استفاده کنید تا ببینید اسکریپت چه کاری انجام می دهد:

bash uninstall.sh -d

اسکریپت همه چیزهایی را که حذف می کند فهرست می کند:

 

Output

Warning: This script would remove:
/home/linuxbrew/.linuxbrew/Caskroom/
/home/linuxbrew/.linuxbrew/Cellar/
/home/linuxbrew/.linuxbrew/Homebrew/
/home/linuxbrew/.linuxbrew/Homebrew/.dockerignore
/home/linuxbrew/.linuxbrew/Homebrew/.editorconfig
. . .

وقتی آماده حذف همه چیز هستید، اسکریپت را بدون هیچ پرچمی اجرا کنید:

bash uninstall.sh

این کار Homebrew و هر برنامه ای را که با آن نصب کرده اید حذف می کند.

نتیجه

در این آموزش شما Homebrew را در محیط لینوکس نصب و استفاده کردید. اکنون می توانید از Homebrew برای نصب ابزارهای خط فرمان، زبان های برنامه نویسی و سایر ابزارهایی که برای توسعه نرم افزار به آنها نیاز دارید استفاده کنید.

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:Homebrew در لینوکسVPS یا سرور مجازیاتصال به سرور مجازی لینوکسخرید سرور مجازیخرید سرور مجازی آمریکاخرید سرور مجازی فرانسهنصب کامپایلرنصب و راه اندازی Homebrew

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه ایجاد قوانین، جدول زمانی، و موارد از رویدادهای Suricata با استفاده از برنامه های SIEM Kibana

ورود به سایت

معرفی

آموزش های قبلی در این مجموعه شما را با نحوه نصب و پیکربندی Suricata راهنمایی کردند. آنها همچنین توضیح دادند که چگونه از Filebeat برای ارسال هشدار از سرور Suricata به سرور Elastic Stack استفاده کنید تا با عملکرد داخلی اطلاعات امنیتی و مدیریت رویداد (SIEM) از آن استفاده کنید.

در این آخرین آموزش در این سری، قوانین سفارشی Kibana را ایجاد می‌کنید و هشدارهایی را در داشبوردهای SIEM Kibana ایجاد می‌کنید. هنگامی که قوانینی را وضع کردید و فهمیدید که کجا و چگونه لاگ های Suricata را با استفاده از Kibana فیلتر کنید، نحوه ایجاد و مدیریت پرونده ها با استفاده از ابزارهای تجزیه و تحلیل جدول زمانی Kibana را بررسی خواهید کرد.

در پایان این آموزش شما یک سیستم SIEM خواهید داشت که می توانید از آن برای ردیابی و بررسی رویدادهای امنیتی در تمام سرورهای شبکه خود استفاده کنید.

پیش نیازها

اگر این مجموعه آموزشی را دنبال کرده اید، باید از قبل یک سرور با حداقل 4 گیگابایت رم و 2 CPU و یک کاربر غیر روت پیکربندی شده داشته باشید. برای اهداف این راهنما، بسته به سیستم عامل انتخابی خود، می‌توانید با پیروی از راهنماهای اولیه راه‌اندازی سرور ما برای Ubuntu 20.04، Debian 11 یا Rocky Linux 8، این را تنظیم کنید.

شما همچنین باید Suricata را روی سرور خود نصب و اجرا کنید. اگر نیاز به نصب Suricata بر روی سرور خود دارید، می توانید با استفاده از یکی از آموزش های زیر بسته به سیستم عامل خود این کار را انجام دهید:

اوبونتو 20.04: نحوه نصب Suricata در اوبونتو 20.04
Debian 11: نحوه نصب Suricata در Debian 11
راکی لینوکس 8: نحوه نصب Suricata در راکی ​​لینوکس 8
همچنین به سروری نیاز دارید که Elastic Stack را اجرا کرده و پیکربندی شده باشد تا Filebeat بتواند گزارش‌ها را از سرور Suricata شما به Elasticsearch ارسال کند. اگر نیاز به ایجاد یک سرور Elastic Stack دارید، از یکی از آموزش های لیست زیر که با سیستم عامل شما مطابقت دارد استفاده کنید:

اوبونتو 20.04: نحوه ایجاد یک سیستم اطلاعات امنیتی و مدیریت رویداد (SIEM) با Suricata و Elastic Stack در اوبونتو 20.04
دبیان 11: نحوه ایجاد یک سیستم اطلاعات امنیتی و مدیریت رویداد (SIEM) با Suricata و Elastic Stack در Debian 11
Rocky Linux 8: نحوه ایجاد یک سیستم اطلاعات امنیتی و مدیریت رویداد (SIEM) با Suricata و Elastic Stack در Rocky Linux 8
اطمینان حاصل کنید که می توانید در سرور Elasticsearch خود به Kibana وارد شوید و رویدادهایی در داشبوردهای مختلف Suricata Alerts و Events وجود دارد.

هنگامی که همه پیش نیازها را آماده کردید، یک تونل SSH را به سرور Kibana خود باز کنید و با مرورگر خود با استفاده از اعتبارنامه هایی که در آموزش قبلی ایجاد کرده اید، به Kibana وارد شوید.

مرحله 1 – فعال کردن کلیدهای API در Elasticsearch

قبل از ایجاد قوانین، هشدارها و جدول زمانی در Kibana، باید تنظیمات ماژول امنیتی xpack را فعال کنید.

فایل /etc/elasticsearch/elasticsearch.yml خود را با nano یا ویرایشگر دلخواه خود باز کنید.

sudo nano /etc/elasticsearch/elasticsearch.yml

خط هایلایت شده زیر را به انتهای فایل اضافه کنید:

/etc/elasticsearch/elasticsearch.yml

. . .
discovery.type: single-node
xpack.security.enabled: true
xpack.security.authc.api_key.enabled: true

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. اگر از نانو استفاده می‌کنید، می‌توانید این کار را با CTRL+X انجام دهید، سپس Y و ENTER را تأیید کنید.

اکنون Elasticsearch را مجددا راه اندازی کنید تا تنظیمات جدید اعمال شود.

sudo systemctl restart elasticsearch.service

اکنون آماده پیکربندی قوانین، بررسی هشدارها و ایجاد جدول زمانی و موارد در Kibana هستید.

مرحله 2 – اضافه کردن قوانین به Kibana

برای استفاده از عملکرد SIEM Kibana با داده‌های رویداد Suricata، باید قوانینی ایجاد کنید که هشدارهایی درباره رویدادهای دریافتی ایجاد کند. برای ایجاد یا وارد کردن قوانین، از داشبورد قوانین در صفحه برنامه امنیتی Kibana دیدن کنید.

برای اهداف این آموزش، ما از امضاهای زیر برای شناسایی ترافیک هدایت شده به سرور در پورت های ناهمخوان (به ترتیب ترافیک SSH، HTTP و TLS) استفاده خواهیم کرد:

Example Suricata Signature

alert ssh any any -> 203.0.113.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000000;)
alert ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;)

alert http any any -> 203.0.113.5 !80 (msg:"HTTP REQUEST on non-HTTP port"; classtype:misc-activity; sid:1000002;)
alert http any any -> 2001:DB8::1/32 !80 (msg:"HTTP REQUEST on non-HTTP port"; classtype:misc-activity; sid:1000003;)

alert tls any any -> 203.0.113.5 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; classtype:misc-activity; sid:1000004;)
alert tls any any -> 2001:DB8::1/32 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; classtype:misc-activity; sid:1000005;)

اگر از امضاهای خود یا از یک مجموعه قوانین استفاده می‌کنید، مطمئن شوید که می‌توانید هشدار ایجاد کنید و می‌توانید به رویدادهای مربوطه در داشبوردهای پیش‌فرض Suricata در Kibana دسترسی داشته باشید.

اکنون به صفحه قوانین در برنامه امنیتی Kibana مراجعه کنید http://localhost:5601/app/security/rules/. روی دکمه ایجاد قانون جدید در سمت راست بالای صفحه کلیک کنید.

مطمئن شوید که کارت نوع قانون پرس و جو سفارشی انتخاب شده است. به قسمت ورودی درخواست سفارشی بروید و موارد زیر را در آن قرار دهید:

Kibana Query Language Input

rule.id: "1000000" or rule.id :"1000001"

مطمئن شوید که مقادیر rule.id شما با مقدار جانبی Suricata برای حمله یا حملاتی که می‌خواهید درباره آن هشدار دهید مطابقت داشته باشد.

پیش‌نمایش سریع Query را به Last Month تغییر دهید و سپس روی Preview Results کلیک کنید. با فرض اینکه رویدادهای منطبقی را در گزارش های Suricata خود داشته باشید، صفحه با نموداری که هشدارهای ماه گذشته را نشان می دهد در جای خود به روز می شود. صفحه شما باید شبیه تصویر زیر باشد:

روی Continue کلیک کنید تا به فیلد Rule Name که برای هر قانون اضافه می‌کنید، نامی اضافه کنید. یک نام به قسمت Rule Name اضافه کنید. در این مثال از توضیحات پیام از قانون Suricata SSH TRAFFIC در پورت غیر SSH استفاده می کنیم. یک توضیح برای قانون نیز اضافه کنید. ما در این مثال از بررسی تلاش برای اتصال SSH در پورت های غیر استاندارد استفاده خواهیم کرد.

همچنین می توانید بخش تنظیمات پیشرفته را گسترش دهید و جزئیات مربوط به قانون را اضافه کنید. به عنوان مثال، می‌توانید توضیحی در مورد نحوه رسیدگی به یک هشدار ایجاد شده توسط قانون اضافه کنید یا به مقاله‌های محقق امنیتی در مورد یک نوع حمله خاص پیوند دهید.

پس از افزودن نام قانون، توضیحات و فیلدهای اضافی اختیاری، روی Continue کلیک کنید تا به مرحله 3 ایجاد قانون بروید.

تنظیمات بعدی قانون زمانبندی را با مقادیر پیش فرض خود رها کنید و روی Continue کلیک کنید.

در نهایت در مرحله Rule actions روی Create & activate rule کلیک کنید.

شما به صفحه جدیدی هدایت می شوید که جزئیات مربوط به قانون را نشان می دهد:

اگر قوانین دیگری از Suricata وجود دارد که می‌خواهید درباره آنها هشدار داده شود، مراحل بالا را تکرار کنید و sid امضا را در قسمت query custom.id Kibana جایگزین کنید.

هنگامی که یک قانون یا قوانین را در اختیار دارید، آماده هستید تا به مرحله بعدی بروید، جایی که هشدارها را بررسی می‌کنید و یک مورد یا مواردی برای مدیریت آنها ایجاد می‌کنید.

مرحله 3 – ایجاد یک جدول زمانی برای ردیابی هشدارهای مربوط به ترافیک SSH

اکنون که قانون یا قوانینی برای ایجاد هشدارها در برنامه SIEM کیبانا پیکربندی شده‌اید، به راهی برای گروه‌بندی و مدیریت بیشتر هشدارها نیاز دارید. برای شروع، از داشبورد هشدارهای Kibana دیدن کنید: http://127.0.0.1:5601/app/security/alerts.

مطمئن شوید که مقداری ترافیک نامعتبر ایجاد کرده اید که با امضای Suricata یا امضاهایی که استفاده می کنید مطابقت دارد. به عنوان مثال، می توانید با اجرای دستوری مانند زیر از دستگاه محلی خود، قانون sid:1000000 Suricata را فعال کنید:

ssh -p 80 your_server_ip

این دستور سعی می کند به جای پورت پیش فرض 22، با استفاده از SSH در پورت 80 به سرور شما متصل شود و باید یک هشدار را راه اندازی کند. ممکن است چند دقیقه طول بکشد تا هشدار در Kibana نشان داده شود، زیرا باید توسط Elasticsearch و قانونی که در Kibana ایجاد کرده‌اید پردازش شود.

در مرحله بعد، فیلد comnunity_id را به جدول هشدارهایی که در پایین صفحه نمایش داده می شود، اضافه می کنید. از اولین آموزش به یاد بیاورید که این فیلد توسط Suricata تولید می شود و نشان دهنده آدرس های IP منحصر به فرد و پورت های موجود در یک جریان شبکه است. روی دکمه فیلدها کلیک کنید و در کادر محاوره‌ای که ظاهر می‌شود، network.community_id را وارد کنید و سپس کادر کنار نام فیلد را علامت بزنید:

مدال را ببندید و فیلد به جدول هشدارها اضافه می شود. اکنون ماوس را روی هر یک از هشدارهایی که دارای همان مقدار community_id هستند نگه دارید و روی نماد بررسی جدول زمانی افزودن کلیک کنید. این اطمینان حاصل می کند که همه هشدارهایی که Community_id را به اشتراک می گذارند که Suricata به رویداد اضافه کرده است برای بررسی بیشتر به یک جدول زمانی اضافه می شود:

سپس روی پیوند Untitled Timeline در پایین سمت چپ مرورگر خود کلیک کنید. این پیوند شما را به صفحه ای می برد که فقط هشدارهایی را با قسمت Suricata community_id نشان می دهد که می خواهید بررسی کنید.

صفحه تایم لاین جزئیات بیشتری را در مورد بسته های فردی که با یک هشدار یا جریان شبکه مرتبط هستند به شما نشان می دهد. می توانید از جدول زمانی استفاده کنید تا ایده بهتری درباره زمان شروع یک جریان شبکه مشکوک، محل شروع آن و مدت زمان ادامه آن بدست آورید.

روی دکمه All data sources در سمت راست صفحه کلیک کنید و دکمه Detection Alerts را انتخاب کنید، سپس روی Save کلیک کنید. این گزینه جدول زمانی را محدود می کند تا فقط هشدارهایی را که Kibana تولید می کند نمایش دهد. بدون این گزینه، هشدارهای Suricata نیز در جدول زمانی گنجانده خواهد شد.

برای ذخیره خط زمانی جدید خود، روی نماد مداد در سمت چپ بالای صفحه تایم لاین کلیک کنید. اسکرین شات زیر محل پیدا کردن نماد مداد و دکمه همه منابع داده را مشخص می کند:

اگر اطلاعات بیشتری وجود دارد که می‌خواهید به خط زمانی اضافه کنید، می‌توانید متنی را به قسمت توضیحات اضافه کنید. پس از اتمام ویرایش نام و توضیحات خط زمانی، روی دکمه ذخیره در سمت راست پایین کادر گفتگو کلیک کنید.

مراحل بالا را برای ایجاد جدول زمانی برای سایر هشدارها که می خواهید بعداً عمیق تر بررسی کنید، تکرار کنید.

در مرحله بعدی، از نماهای جدول زمانی رویدادها برای پیوست کردن هشدارها به اپلیکیشن Kibana’s Cases در مجموعه ابزارهای SIEM استفاده خواهید کرد.

مرحله 4 – ایجاد و مدیریت موارد SIEM

در مرحله قبل، یک جدول زمانی ایجاد کردید تا هشدارها و بسته‌ها را با هم بر اساس فیلد Community_id Suricata گروه‌بندی کنید. در این بخش از آموزش شما یک Case برای ردیابی و مدیریت هشدارها در جدول زمانی خود ایجاد می کنید.

برای ایجاد یک مورد جدید از جدول زمانی خود، مطمئن شوید که در یک صفحه جدول زمانی در مرورگر خود هستید. روی دکمه Attach to case در سمت راست بالای صفحه تایم لاین و سپس دکمه Attach to new case را از لیست ظاهر شده کلیک کنید.

شما به صفحه ای هدایت می شوید که در آن می توانید اطلاعات مربوط به حادثه ای را که در حال بررسی آن هستید وارد کنید. در اسکرین شات مثال زیر، مورد مثال هشدار ترافیک SSH در یک پورت غیر SSH است:

فیلدها را با یک نام توصیفی و تگ یا تگ های اختیاری پر کنید. در این مثال، نام مورد SSH TRAFFIC در پورت غیر SSH از 203.0.113.5 است، زیرا این نوع ترافیک و میزبان خاصی است که ما در حال بررسی آن هستیم. با بسیاری از رویدادها برای بررسی در سیستم SIEM شما، یک طرح نامگذاری مانند این به شما کمک می کند موارد، جدول زمانی و هشدارها را پیگیری کنید زیرا نام با هشدار Kibana و فیلد پیام امضای Suricata مطابقت دارد.

به پایین صفحه بروید و روی دکمه Create case کلیک کنید. مرورگر شما در صفحه ای قرار می گیرد که کیس ذخیره شده را نشان می دهد. شما می توانید نظرات را در قالب Markdown با اطلاعات اضافی اضافه کنید و همچنین مورد را از این صفحه ویرایش کنید.

سپس، روی پیوند در توضیحات کلیک کنید تا به جدول زمانی پرونده که در مرحله قبلی این آموزش اضافه کرده‌اید بروید.

برای هر هشداری که می‌خواهید در کیس قرار دهید، روی نماد اقدامات بیشتر در هشدار کلیک کنید. روی افزودن به پرونده موجود کلیک کنید.

روی نام مورد در حالتی که ظاهر می شود کلیک کنید تا هشدار به پرونده اضافه شود. مطمئن شوید که موردی را انتخاب کنید که با جدول زمانی و هشدارهایی که در حال بررسی آن هستید مطابقت دارد. اضافه کردن هر هشدار در لیست به مورد موجود را تکرار کنید.

اکنون با استفاده از منوی پیمایش در سمت چپ صفحه، دوباره از برنامه Cases در Kibana] (http://localhost:5601/app/security/cases) دیدن کنید. روی پرونده خود کلیک کنید و توجه داشته باشید که چگونه هشدارهایی که اضافه کرده اید در جزئیات پرونده فهرست شده اند:

از اینجا می‌توانید به پایین کیس پیمایش کنید و اطلاعات بیشتری را که می‌خواهید اضافه کنید. به عنوان مثال، هر اقدامی که برای بررسی یک هشدار یا هشدارها انجام داده اید، تغییرات پیکربندی به Suricata مانند یک قانون جدید یا ویرایش شده، افزایش به یکی دیگر از اعضای تیم یا هر چیز دیگری که مربوط به مورد است.

هنگامی که با ایجاد مواردی برای انواع مختلف هشدارهایی که می‌خواهید پیگیری کنید راحت هستید، اکنون می‌توانید از ابزارهای SIEM Kibana برای سازماندهی و هماهنگ کردن بررسی هر هشدار در یک مکان مرکزی استفاده کنید.

نتیجه

در این آموزش شما سیستم Suricata و Elastic Stack SIEM موجود خود را با افزودن قوانینی به Kibana که هشدارهایی را در مورد ترافیک خاص مورد علاقه ایجاد می کند، ساخته اید. شما همچنین یک جدول زمانی یا جدول زمانی ایجاد کردید تا مجموعه ای از هشدارها را بر اساس Community_id گروه بندی کنید. در نهایت، یک مورد ایجاد کردید و جدول زمانی خود را به همراه هشدارهای فردی مورد علاقه به آن مرتبط کردید.

با وجود این سیستم SIEM، اکنون می توانید رویدادهای امنیتی را در سراسر سیستم های خود تقریباً در هر مقیاسی ردیابی کنید. همانطور که با Suricata بیشتر آشنا می شوید و هشدارهایی را که در Kibana SIEM شما ایجاد می کند ردیابی می کنید، می توانید هشدارهای Suricata و اقدامات پیش فرضی را که مطابق با شبکه خاص شما انجام می دهد سفارشی کنید.

برای داشتن یک رابط کاربری سبک تر SIEM، ممکن است به EveBox نیز علاقه مند باشید، که تمام داده های رویداد Suricata و عملکرد SIEM را در یک صفحه ارائه می دهد.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:Rocky Linux 8اتصال به سرور مجازیاوبونتو 20.04ایجاد سرور مجازیخرید سرورخرید سرور مجازی آمریکاسیستم SIEMمدیریت موارد SIEMنصب و پیکربندی Suricata

  • behnam gol mohamadi
  • ۰
  • ۰

 نحوه استفاده از توابع در PHP

ورود به سایت

معرفی

وقتی متوجه شدید که در حال کپی و چسباندن بلوک های کد برای استفاده مجدد در بخش های مختلف برنامه خود هستید، آماده نوشتن یک تابع هستید. اگر نیاز به تعامل با محتوای یک متغیر دارید – تغییر حروف، پیدا کردن طول، برش یا مرتب‌سازی – احتمالاً یک تابع داخلی برای آن وجود دارد. توابع، بلوک‌های کد مستقل و قابل استفاده مجدد هستند که وظیفه خاصی را انجام می‌دهند. آنها ماژولار بودن را ارائه می دهند و یکی از روش های استفاده مجدد از کد هستند.

یک تابع تا زمانی که فراخوانی نشود غیرفعال است. هنگامی که یک تابع فراخوانی می شود، وظیفه تعریف شده در تابع را انجام می دهد. یک تابع معمولا ورودی می گیرد، یک عمل را انجام می دهد و خروجی حاصل را برمی گرداند. عملی که در داخل یک تابع انجام می شود، رابطه ای بین ورودی و خروجی ایجاد می کند. سه بخش اصلی که هنگام تعامل با یک تابع باید به آن فکر کرد عبارتند از ورودی، رابطه و خروجی. حتی زمانی که ورودی صریح نباشد، معمولاً برخی از داده های ضمنی مربوط به محیط کد وجود دارد: تاریخ، زمان، سیستم، فایل، شماره خط و غیره.

در این آموزش شما با تمام قطعات مختلف یک تابع کار خواهید کرد تا بتوانید از توابع به بهترین شکل برای حل چالش خود استفاده کنید. ما با نوشتن توابع تعریف شده توسط کاربر شروع خواهیم کرد. این توابع تفاوت بین آرگومان‌ها و پارامترها را روشن می‌کنند، متغیرها را بر اساس مقدار و مرجع ارسال می‌کنند، مقادیر پیش‌فرض را تنظیم می‌کنند و از اعلان نوع برای تعیین انواع قابل قبول برای ورودی و خروجی استفاده می‌کنند. با درک دامنه، می توانید بخش خاصی از کد خود را که باید تغییر کند دستکاری کنید و در عین حال سایر بخش ها را دست نخورده باقی بگذارید. هنگامی که جنبه‌های مختلف یک تابع و نحوه تأثیر آن‌ها توسط دامنه را درک کردید، می‌توانید مستندات بسیاری از توابع داخلی را که PHP ارائه می‌کند، بخوانید و درک کنید. شما از توابع داخلی برای انجام کارهای معمول برنامه نویسی بدون زحمت استفاده خواهید کرد.

توابع تعریف شده توسط کاربر

نوشتن کد یکسان در چندین مکان، خواندن و درک یک پروژه را دشوار می کند. یکی از “اصول اصلی” یا اصول اساسی برنامه نویسی “خودت را تکرار نکن” است که اغلب به آن برنامه نویسی DRY می گویند. متغیرها ما را از نوشتن مکرر داده های مشابه باز می دارند. توابع ما را از نوشتن مکرر یک عمل باز می دارند.

ایجاد و فراخوانی توابع

هنگام نوشتن یک تابع، ابتدا ساختار تابع باید ساخته شود. این بلوک کد تا زمانی که فراخوانی یا فراخوانی نشود غیرفعال می ماند. یک تابع با استفاده از کلمه کلیدی تابع به اضافه یک نام انتخاب شده به دنبال پرانتز ایجاد می شود. بدنه تابع توسط پرانتزهای مجعد احاطه شده است و کدی است که عمل را انجام می دهد:

hello.php

<?php
function hello() {
    echo "Hello World!";
}

این تابع که hello نام دارد، غیر فعال می ماند، یعنی هیچ کاری انجام نمی دهد و تا زمانی که تابع فراخوانی نشود، فایل خروجی نخواهد داشت. برای فراخوانی یک تابع، از نام و به دنبال آن پرانتز استفاده می شود:

hello.php

<?php
function hello() {
    echo "Hello World!";
}
hello();

فراخوانی تابع چیزی است که باعث می شود تابع عملکرد خود را انجام دهد. در این حالت، خروجی را نمایش می دهد:

 

Output

Hello World!

این مثال ساده استفاده خوبی از یک تابع نیست، زیرا هیچ ورودی وجود ندارد، به این معنی که هیچ رابطه ای وجود ندارد و فقط خروجی وجود دارد. داده های مورد استفاده در مکان های مختلف باید در یک متغیر ذخیره شوند، مانند این:

hello.php

<?php
$hello = "Hello World!";
echo $hello;

این دو خط نتیجه مشابه تابع و فراخوانی را ارائه می دهند:

 

Output

Hello World!

اجازه دهید تابع مثال را برای پذیرش ورودی گسترش دهیم.

آرگومان ها و پارامترها

برای ایجاد یک تابع hello که رابطه ای بین ورودی و خروجی ایجاد می کند، تابع باید مقداری ورودی را بپذیرد. این ورودی به عنوان یک متغیر بین پرانتزهای تعریف تابع پذیرفته می شود. سپس این متغیر را می توان در بدنه تابع استفاده کرد:

hello.php

<?php
function hello($name) {
    echo "Hello ".$name;
}
hello();

تابع hello اکنون یک پارامتر ذخیره شده در متغیر $name را می پذیرد. سپس این متغیر در بدنه تابع با الحاق رشته “Hello” به متغیر $name با استفاده از . عملگر الحاق رشته ها اکنون تابع نیاز دارد که هنگام فراخوانی تابع، یک ورودی ارسال شود، اما ورودی ارائه نشده است، و باعث می شود PHP با خطا پاسخ دهد:

 

Output

Warning:  Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in php shell code on line 1 and exactly 1 expected

هنگامی که تابع hello فراخوانی می شود، برای استفاده به عنوان ورودی نیاز به یک آرگومان دارد که مقدار $name را تعیین می کند. اصطلاح پارامتر زمانی استفاده می شود که بخشی از تعریف تابع باشد و اصطلاح آرگومان زمانی استفاده می شود که بخشی از فراخوانی تابع باشد. هر دو به ورودی یک تابع اشاره دارند. برای ارائه ورودی به تابع، یک آرگومان بین پرانتز فراخوانی تابع ارسال می کنیم:

hello.php

<?php
function hello($name) {
    echo "Hello ".$name;
}
hello("Sammy");

این تابع اکنون می تواند از ورودی رشته برای ایجاد خروجی تبریک استفاده کند. تبریک بر اساس ورودی ارسال شده هنگام فراخوانی تابع تغییر می کند:

 

Output

Hello Sammy

این آرگومان‌های اساسی «آگومان‌های موقعیتی» نامیده می‌شوند زیرا باید به همان ترتیبی که توسط تابع تعریف می‌شوند، ارسال شوند. PHP تعداد پارامترهای جدا شده با کاما را محدود نمی کند، اما یک تابع باید تنها یک عمل را اجرا کند. کمی بعد به اتصال توابع خواهیم پرداخت.

مقادیر پیش فرض اختیاری

به‌طور پیش‌فرض، هر پارامتری که برای تابع تعریف می‌شود، مستلزم ارسال آرگومان با فراخوانی تابع است. این باعث می شود خروجی ما به جای فراخوانی داده های یکسان از یک متغیر منحصر به فرد باشد. گاهی اوقات ما به یک مقدار منحصر به فرد برای همه پارامترهای خود نیاز نداریم. در عوض، اگر فراخوانی تابع شامل آن آرگومان نباشد، می‌توانیم از یک مقدار خاص استفاده کنیم. برای تعیین یک پارامتر به عنوان اختیاری، به پارامتر یک مقدار پیش فرض بدهید. این مقدار زمانی استفاده می شود که آرگومان ارسال نشود. می تواند هر مقدار معتبری باشد، از جمله null:

hello.php

<?php
function hello($name, $greeting = "Hello") {
    echo $greeting." ".$name;
}
hello("Sammy", "Bonjour");

اکنون یک پارامتر دوم به نام $greeting وجود دارد. سپس این متغیر در بدنه تابع برای تغییر مقدار بخش تبریک خروجی استفاده می شود:

 

Output

Bonjour Sammy

پارامتر اول $name مقدار پیش‌فرض ندارد، بنابراین باید با هر فراخوانی تابع، یک آرگومان گنجانده شود. از آنجا که پارامتر دوم دارای یک مقدار پیش فرض است، تابع نیازی به ارسال آرگومان دوم ندارد:

hello.php

<?php
function hello($name, $greeting = "Hello") {
    echo $greeting." ".$name;
}
hello("Sammy");

هنگامی که تنها یک آرگومان ارسال می شود، مقدار متغیر $greeting روی مقدار پیش فرض “Hello” تنظیم می شود:

 

Output

Hello Sammy

هنگامی که پارامترهای مورد نیاز همراه با پارامترهای اختیاری در یک تابع استفاده می شوند، تمام پارامترهای مورد نیاز باید قبل از همه پارامترهای اختیاری قرار گیرند.

مقدار تهی اختیاری

زمانی که یک متغیر کاملا اختیاری است و اصلاً نیازی به مقدار ندارد، مقدار پیش‌فرض را می‌توان null تعریف کرد. مقدار null فضایی را برای یک مقدار بدون اضافه کردن یک مقدار اضافی نگه می دارد:

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    echo $greeting." ".$name.$punctuation;
}
hello("Sammy");

متغیر is “اعلام شده” است، بنابراین هنگام تلاش بدنه تابع برای دسترسی به متغیر، خطایی وجود نخواهد داشت، و با این حال، متغیر “تنظیم نشده” در نظر گرفته می شود، بنابراین خروجی اضافی اضافه نخواهد شد:

 

Output

Hello Sammy

ارزش های بازگشتی

ممکن است همیشه نخواهیم خروجی یک تابع را چاپ کنیم. برای ایجاد انعطاف‌پذیری بیشتر در یک تابع، معمول است که مقدار خروجی را به کدی که در ابتدا فراخوانی تابع را انجام داده است، برگردانید. به جای کلمه کلیدی echo از کلمه کلیدی return استفاده کنید:

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    return $greeting." ".$name.$punctuation;
}
hello("Sammy");
echo hello("Sammy");

در اولین فراخوانی تابع hello، هیچ کاری با مقدار برگشتی انجام نمی شود، و به نظر می رسد که هیچ اتفاقی نیفتاده است، حتی اگر کد موجود در تابع اجرا شده باشد. در فراخوانی دوم تابع hello، کلمه کلیدی echo قبل از فراخوانی تابع استفاده می‌شود و به PHP می‌گوید نتایج خروجی برگشتی را چاپ کند:

 

Output

Hello Sammy

ما همیشه مجبور نیستیم نتیجه را چاپ کنیم. این نتایج همچنین می توانند در یک متغیر ذخیره شوند یا به عنوان ورودی برای تابع دیگری استفاده شوند.

فراخوانی توابع در یک تابع

توابع بلوک هایی از کد قابل استفاده مجدد هستند. اکثر کدهایی که می توانند خارج از یک تابع نوشته شوند، می توانند در داخل یک تابع نیز نوشته شوند. اما فقط به این دلیل که می توانید، به این معنا نیست که باید. شما هرگز نباید تابعی را در یک تابع دیگر تعریف کنید، مگر در موارد بسیار پیشرفته. با این حال، اغلب یک تابع را از داخل تابع دیگر فراخوانی می کنید. برای تعیین فرمت پیام تبریک خروجی، می توانید از برخی توابع داخلی استفاده کنید:

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

خط اول در تابع hello اکنون مقداری قالب بندی برای مقدار $name اعمال می کند. ابتدا رشته را به حروف کوچک تبدیل می کند. تابع strtolower مقداری را برمی گرداند که بلافاصله در تابع دوم، ucwords استفاده می شود. این حرف اول هر کلمه را به حروف بزرگ تبدیل می کند. تابع hello اکنون بدون در نظر گرفتن ورودی دریافتی، یک خروجی با فرمت ثابت ارائه می دهد:

 

Output

Hello Sammy

اعلانات نوع

PHP یک زبان با تایپ آزاد است، به این معنی که سعی می کند مقدار داده شده را به نوع مناسب برای هر موقعیت تبدیل کند. این می تواند نتایج شگفت انگیز و گاهی اوقات نامطلوب ایجاد کند. یک نام باید یک رشته باشد، اما چه اتفاقی می‌افتد اگر به جای آن یک عدد صحیح ارسال کنیم:

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

PHP هیچ گونه مشکلی در شعبده بازی ندارد، که عدد صحیح 123 را به رشته “123” تبدیل می کند، سپس تابع را مانند قبل ادامه می دهد:

 

Output

Hello 123

این خروجی معتبر است، اما احتمالاً این نیز نتیجه مطلوب نیست. بیایید ببینیم وقتی یک آرایه را پاس می کنیم چه اتفاقی می افتد. تابع stringtolower یک خطای متفاوت ایجاد می کند. برای این نمایش، اسلش‌های دوتایی به ابتدای آن خط اضافه می‌شود تا آن را به عنوان یک نظر تبدیل کند، که اجرای آن کد را رد می‌کند:

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    // $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(["Sammy", "World"]);

این بار کد یک اطلاعیه ارائه می دهد، اما خیلی واضح نیست. همچنین، بسته به نحوه راه‌اندازی سیستم، اعلان‌ها می‌توانند خاموش یا نادیده گرفته شوند زیرا اجرای کد را متوقف نمی‌کنند. ممکن است متوجه نباشیم که مشکلی وجود دارد، یا ممکن است در تشخیص محل وقوع مشکل با مشکل مواجه شویم. خروجی به نظر می رسد که گویی رشته “Array” به تابع ارسال شده است:

 

Output

Notice: Array to string conversion in php shell code on line 2
Hello Array

توسعه دهندگان زمان بسیار بیشتری را صرف خواندن و اشکال زدایی می کنند تا اینکه واقعاً کد بنویسند، بنابراین هر کدی را که می نویسیم تا حد امکان برای خواندن و اشکال زدایی آسان تر کنیم، در دراز مدت در زمان صرفه جویی می شود. با شروع در PHP 5 و با پشتیبانی قوی تر در PHP 7، اکنون می توانیم انواع مقادیر قابل قبول ورودی و خروجی یک تابع را اعلام یا مشخص کنیم.

اعلان نوع پارامتر

اعلان‌های نوع پارامتر تضمین می‌کنند که مقدار آرگومان که هنگام فراخوانی تابع استفاده می‌شود، با نوع مشخص شده مطابقت دارد. در غیر این صورت، یک TypeError پرتاب می شود. بیایید نوع رشته را به پارامتر $name خود اضافه کنیم و آرگومان های آرایه را دوباره امتحان کنیم. این بار می توانیم خط stringtolower را نگه داریم زیرا به آن کد دسترسی پیدا نمی کند:

hello.php

<?php
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(["Sammy", "World"]);

این بار فراخوانی تابع باعث ایجاد یک استثنا می شود که اجرای کد را متوقف می کند، بنابراین خروجی معتبری به نظر نمی رسد. پیام همچنین واضح تر است که خطا در واقع وجود دارد:

 

Output

Warning: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, array given

اگر آرگومان به جای آرایه به عدد صحیح برگردد، منطقی است که انتظار خطا داشته باشیم زیرا پارامتر فقط باید مقادیر رشته را بپذیرد. بیایید آن را امتحان کنیم:

hello.php

<?php
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

به جای ارسال خطا، یک بار دیگر عدد صحیح بدون مشکل به رشته تبدیل می شود و تابع اجرا می شود:

 

Output

Hello 123

این مربوط به این است که PHP یک زبان تایپ آزاد است. PHP هنوز هم برای تبدیل آن به یک رشته، شعبده برداری از نوع را روی عدد صحیح انجام می دهد، سپس اجرا را ادامه می دهد.

انواع سختگیرانه

ممانعت از اجرای «جلوگیری نوع» توسط PHP می‌تواند در آسان‌تر خواندن کد و اشکال‌زدایی مفید باشد. پی اچ پی راهی را برای ما فراهم می کند تا انواع سخت گیرانه را بر اساس هر فایل اعلام کنیم. اعلان را به بالای هر فایلی که باید تایپ دقیق را اعمال کند اضافه کنید:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

پس از افزودن خط اعلان به بالای فایل، PHP هنگامی که یک عدد صحیح به جای رشته ارسال می شود، یک خطا ایجاد می کند:

 

Output

PHP Fatal error:  Uncaught TypeError: Argument 1 passed to hello() must be of the type string, int given.

انواع Nullable

می‌توانیم پارامتر دوم تابع hello را نیز به عنوان یک رشته اعلام کنیم. چون مقدار پیش‌فرض دارد، نیازی به آرگومان نیست، اما اگر آرگومان ارسال شود، باید از نوع رشته باشد. پارامتر سوم نیز رشته ای با مقدار پیش فرض است. یک مقدار null نیز در این تابع کار می کند:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", string $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

از آنجایی که مقدار پیش‌فرض پارامتر سوم روی null تنظیم شده است، آرگومان null و همچنین یک رشته مجاز است:

 

Output

Hola Sammy

با این حال، هنگامی که مقدار پیش فرض یک پارامتر به عنوان یک رشته اعلام می شود، دیگر مقدار تهی را نمی پذیرد:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", string $punctuation = "!") {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

در عوض TypeError داده می شود:

 

Output

Warning: Uncaught TypeError: hello(): Argument #3 ($punctuation) must be of type string, null given

وقتی مقدار پیش‌فرض یک پارامتر چیزی غیر از null باشد، اما null نیز یک ورودی معتبر باشد، PHP دستور اضافی را برای تعریف آن رابطه با اضافه کردن یک علامت سوال قبل از اعلان نوع ارائه می‌کند:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

حالا تابع آرگومان سوم null را می پذیرد و همانطور که قبلا پردازش شده است ادامه می دهد:

 

Output

Hola Sammy!

پیشوند علامت سوال با تمام اعلان‌های نوع کار می‌کند، نه فقط رشته‌ها، و نیازی به مقدار پیش‌فرض (مانند ?int $age) ندارد.

اعلامیه های نوع بازگشت

همانطور که می توان نوع پارامتر را اعلام کرد، نوع بازگشتی تابع را نیز می توان اعلام کرد. برای اعلام نوع برگشتی یک تابع، یک دونقطه به همراه نوع بعد از پرانتز بسته شدن تعریف تابع اضافه کنید:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): ?int {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

توجه داشته باشید که نوع بازگشتی اعلام شده یک عدد صحیح یا یک مقدار تهی است. این نوع اعلام شده با مقدار بازگشتی آنها مطابقت ندارد و یک استثنا ایجاد می شود:

 

Output

Warning: Uncaught TypeError: hello(): Return value must be of type ?int, string returned

بیایید نوع بازگشتی را به روز کنیم تا با نوع رشته برگشتی مطابقت داشته باشد:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

این خروجی را به ما می دهد که قبلاً دیده بودیم:

 

Output

Hello Sammy!

بدون ارزش برگشتی

گاهی اوقات یک تابع عملی را انجام می دهد که به مقدار برگشتی منجر نمی شود. تابع var_dump یک مثال است. اگر به اولین نسخه تابع hello برگردیم، می‌توانیم یک نوع بازگشتی void اضافه کنیم:

hello.php

<?php
function hello(): void {
    echo "Hello World!";
}
$greeting = hello();
var_dump($greeting);

این نشان می دهد که تابع مقداری را بر نمی گرداند. هنگامی که تابع فراخوانی می شود و روی یک متغیر اعمال می شود، خروجی نمایش داده می شود زیرا کلمه کلیدی echo در خود تابع استفاده می شود. با استفاده از var_dump در متغیر $greeting، می‌بینیم که هیچ مقداری برگردانده نشده است و متغیر $greeting روی یک مقدار null تنظیم می‌شود:

 

Output

Hello World!
NULL

نوع void بیشتر هنگام دستکاری خود متغیر و نه فقط یک مقدار استفاده می شود. برای آن، ما باید دامنه را درک کنیم.

محدوده

دامنه فقط یک اصطلاح فنی نیست. در مورد هر چیزی که در آن ما “وسعت منطقه یا موضوعی که چیزی با آن سروکار دارد یا به آن مرتبط است” اندازه گیری می کنیم. به عنوان مثال، دامنه اقیانوس اطلس از قاره آمریکا در غرب به آفریقا و اروپا در شرق و از اقیانوس منجمد شمالی در شمال تا اقیانوس هند در جنوب امتداد دارد. اگر آب از اقیانوس اطلس گرفته شود و به اقیانوس هند ریخته شود، آب بخشی از اقیانوس هند می شود و دیگر هیچ تاثیری بر اقیانوس اطلس ندارد. محدوده اقیانوس اطلس تغییر نکرده است.

در برنامه نویسی، دامنه به نحوه دسترسی قطعات مختلف کد به یکدیگر اشاره دارد. چندین حوزه مختلف در یک برنامه کاربردی وجود دارد. برای هدف توابع، دو مورد از آنها را بررسی می کنیم – دامنه جهانی فایل و محدوده تابع.

به‌طور پیش‌فرض، کد موجود در دامنه جهانی ممکن است هر تابعی را که فایل درباره آن می‌داند فراخوانی کند، اما کد در دامنه جهانی نمی‌تواند مستقیماً به یک تابع برای دسترسی به داده‌ها برسد. باید به مقدار بازگشتی تابع متکی باشد. به‌طور پیش‌فرض، کد موجود در محدوده تابع ورودی را از دامنه جهانی می‌پذیرد و خروجی را به دامنه جهانی برمی‌گرداند. کد در محدوده تابع مستقیماً به دامنه جهانی نمی رسد.

از آنجایی که PHP این دو حوزه را به‌عنوان موجودیت‌های مجزا در نظر می‌گیرد، زمانی که یک متغیر به یک تابع ارسال می‌شود، «مقدار» متغیر ارسال می‌شود و نه خود متغیر. بیایید یک متغیر سراسری تنظیم کنیم تا ببینیم این به چه معناست برای کد:

hello.php

<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello($name);
echo $name;

به جای ارسال مستقیم یک رشته، اکنون یک متغیر رشته را ارسال می کنیم. این متغیر به همان شیوه ای عمل می کند که یک رشته را به طور مستقیم ارسال می کند زیرا فقط از مقدار متغیر استفاده می شود. هنگامی که مقدار متغیر $name در تابع تغییر می کند، فقط متغیر $name در تابع تحت تأثیر قرار می گیرد. متغیر $name در دامنه جهانی یک متغیر جداگانه است:

 

Output

Hello Sammy!
SAMMY

خروجی echo hello($name) “Hello Sammy” است، زیرا این مقداری است که توسط تابعی که با آرگومان $name ارائه شده است، برگردانده می شود. حتی پس از فراخوانی تابع، مقدار متغیر $name در محدوده جهانی تغییر نمی کند، بنابراین خروجی echo $name; “SAMMY” است، زیرا متغیر جهانی روی “SAMMY” تنظیم می شود.

دسترسی به گستره جهانی

یک تفاوت بزرگ بین دامنه جهانی و دامنه تابع این است که شما می توانید به یک تابع اجازه دهید تا برای بازیابی داده ها به دامنه جهانی برسد، اما نمی توانید داده ها را مستقیماً از یک تابع در دامنه جهانی بازیابی کنید. کلمه کلیدی جهانی به دامنه جهانی می رسد:

hello.php

<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string $greeting = "Hello", ?string $punctuation = "!"): string {
    global $name;
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello();
echo $name;

متغیر $name در دامنه جهانی تنظیم شده است، اما به جای ارسال مقدار به تابع، اکنون خط اول تابع برای گرفتن متغیر از دامنه جهانی می رسد. کلمه کلیدی سراسری خود متغیر و نه فقط مقدار آن را می گیرد. قالب‌بندی انجام شده در تابع به دامنه جهانی متغیر اعمال می‌شود که مقدار متغیر خارج از تابع را نیز تغییر می‌دهد:

 

Output

Hello Sammy!
Sammy

استفاده از متغیرهای سراسری عمل بدی در نظر گرفته می‌شود، زیرا ردیابی جایی که ممکن است مقدار یک متغیر تغییر کند دشوار است. هنگامی که تغییر متغیر مورد نظر است، رویکرد بهتر این است که یک مرجع به متغیر منتقل شود.

گذراندن استدلال ها با مرجع

پی اچ پی آرگومان ها را به عنوان مقادیر می خواند. فرقی نمی‌کند که متغیری حاوی رشته «SAMMY» یا خود رشته را پاس کنیم. فقط از مقدار استفاده می شود. عبور از مقدار از همپوشانی دامنه جهانی و دامنه عملکرد جلوگیری می کند. از آنجا که یک تابع ممکن است مقداری را برگرداند، می‌توانیم از آن مقدار برای تنظیم هر متغیری در یک محدوده جداگانه استفاده کنیم، حتی یکی از آن‌ها به عنوان آرگومان استفاده می‌شود. با نوشتن کد به این روش، مدیریت یک متغیر به وضوح در محدوده اصلی نگهداری می شود. مثال‌های قبلی مقدار متغیر $name را با نادیده گرفتن مقدار متغیر برای مطابقت با مقدار بازگشتی برخی از توابع داخلی تغییر داده‌اند. بیایید نگاهی دقیق‌تر به قالب‌بندی ucwords و strtolower بیندازیم:

$name = "SAMMY";
$name = ucwords(strtolower($name));
echo $name;

این مقدار جدید $name اکنون قالب بندی جدیدی دارد:

 

Output

Sammy

در حالی که یک تابع فقط می تواند یک مقدار را برگرداند، یک تابع ممکن است بیش از یک متغیر را تحت تأثیر قرار دهد. در مثال‌هایی که نوشتیم، تابع hello از چندین متغیر استفاده می‌کند اما مقدار آن متغیرها را در محدوده جهانی تغییر نمی‌دهد. PHP راهی را برای تعامل مستقیم با یک متغیر از محدوده دیگر، با ارسال یک مرجع به خود متغیر، نه فقط مقدار آن، فراهم می کند. آرگومان ها با ارجاع با افزودن علامت (&) به هر پارامتری منتقل می شوند:

hello.php

<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): void {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello($name);
echo $name;

هنگامی که متغیر $name توسط مرجع ارسال می شود، مقدار آن متغیر را در محدوده جهانی تغییر می دهد. پس از فراخوانی تابع، $name قالب بندی را حفظ می کند:

 

Output

Hello Sammy!
Sammy

هنگام عبور از مرجع، آرگومان باید یک متغیر باشد. یک مقدار دیگر پذیرفته نمی شود:

hello.php

<?php
declare(strict_types=1);
function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    global $name;
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

از آنجایی که هیچ متغیری برای مرجع وجود ندارد، یک خطا داده می شود:

 

Output

Warning: Uncaught Error: hello(): Argument #1 ($name) cannot be passed by reference

توابع داخلی

PHP همچنین شامل بسیاری از توابع داخلی است که ممکن است برای انجام هر تعداد از وظایف رایج در برنامه شما استفاده شود. اینها توابع واقعی هستند که با زبان از قبل بسته بندی شده اند. مانند همه توابع، این توابع داخلی نیاز به استفاده از پرانتز دارند.

وقتی مستندات تعریف تابع یک تابع داخلی را می خوانید، بسیار شبیه توابع تعریف شده توسط کاربر است که نوشتیم، که شامل Type Declarations نیز می شود.

توابع مدیریت متغیر

توابع مدیریت متغیر جزئیاتی را در مورد یک متغیر مانند نوع یا مقدار آن ارائه می دهند. یکی از رایج ترین توابع مدیریت متغیر var_dump است:

hello.php

<?php
var_dump("Hello World!");

این تابع جزئیات مقادیر داده شده را شامل نوع و اندازه آنها می دهد. رشته “سلام دنیا!” شامل 12 کاراکتر:

 

Output

string(12) "Hello World!"

PHP همچنین توابع اضافی را برای تعامل با مقدار متغیرهای نوع خاص فراهم می کند.

نتیجه

توابع روشی قدرتمند برای نوشتن کدی که ماژولار و قابل استفاده مجدد است ارائه می دهد. توابع ممکن است از توزیع استاندارد PHP یا پسوندهای اضافی که با PHP کامپایل شده اند باشد. توسعه دهندگان فردی همچنین ممکن است توابعی را برای یک پروژه بنویسند یا آنها را در چندین پروژه به اشتراک بگذارند. هنگامی که به یک عمل نیاز دارید که علیه بیش از یک مورد یا مکان انجام شود، توابع ابزار هستند.

اکنون که پایه خوبی برای درک توابع دارید، به بسیاری از توابع داخلی ارائه شده توسط PHP نگاهی بیندازید. نه تنها به شما ایده می‌دهد که این زبان چه کاری می‌تواند انجام دهد، بلکه برخی از چالش‌های رایجی که توسعه‌دهندگان در گذشته با آن‌ها روبرو بوده‌اند و نحوه حل آن‌ها را نیز به شما نشان می‌دهد.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:serverآرگومان ها و پارامترهااستفاده از توابع در PHPانواع Nullableپی اچ پیتوابع داخلی در phpخرید سرور مجازیخرید سرور مجازی آمریکاسرور مجازیمدیریت توابع متغیر در php

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه مقیاس بندی استقرار گفتمان با بار متعادل کننده و خوشه پایگاه داده مدیریت شده

ورود به سایت

معرفی

Discourse که توسط یکی از بنیانگذاران StackOverflow ایجاد شده است، یک پلتفرم گفتگوی منبع باز است. گفتمان می تواند یک انجمن آنلاین، یک لیست پستی، یک اتاق گفتگو و موارد دیگر را تقویت کند.

Discourse با استفاده از نصب با یک کلیک vpsgol روی یک Droplet به خوبی کار می کند، اما با رشد جامعه شما، می تواند از یک Droplet بیشتر شود. اگر یکی از قطره‌های شما آفلاین شود، استفاده از چند قطره به جامعه شما انعطاف‌پذیری می‌دهد. هر قطره همچنین پهنای باند شما را افزایش می دهد. هنگام استفاده از چند قطره، یک Load Balancer می تواند به گسترش استقرار شما کمک کند و دسترسی بالا را به برنامه وب شما بیاورد. در نهایت، یک نمونه پایگاه داده مدیریت شده تجربه کاربری ثابتی را در چندین قطره تضمین می کند.

پس از تکمیل این آموزش، شما یک استقرار Discourse بسیار در دسترس و به راحتی مقیاس پذیر خواهید داشت که در vpsgol اجرا می شود. شما با یک قطره جدید اوبونتو 20.04 شروع می‌کنید و با یک نصب گفتمان مقیاس‌پذیر افقی که شامل یک Load Balancer، Managed PostgreSQL cluster، Redis instance (اختیاری) و Droplet‌های اضافی است، به پایان می‌رسانید.

پیش نیازها

برای دنبال کردن این آموزش، شما نیاز دارید:

  • یک سرور اوبونتو 20.04 با حداقل 2 گیگابایت رم پیکربندی شده با یک کاربر غیر ریشه با امتیازات sudo و فایروال، که می توانید با دنبال کردن راهنما، راه اندازی اولیه سرور با اوبونتو 20.04، این کار را انجام دهید.
  • Discourse بر روی سرور شما نصب و پیکربندی شده است که می توانید با دنبال کردن آموزش نحوه نصب Discourse در اوبونتو 20.04 این کار را انجام دهید.
  • نام دامنه ای که سوابق DNS آن توسط vpsgol مدیریت می شود، که می توانید با دنبال کردن آموزش نحوه اشاره به سرورهای نام vpagol  از ثبت کننده های دامنه رایج، این کار را انجام دهید. هنگام تنظیم Discourse بر روی سرور خود، مطمئن شوید که از نام دامنه اصلی و نه یک زیر دامنه استفاده کنید (به عنوان مثال، به جای discourse.yoursite.com از yoursite.com استفاده کنید).
  • آشنایی با Docker که می توانید از آموزش The Docker Ecosystem: An Introduction to Common Components به دست آورید.

مرحله 1 – اضافه کردن یک متعادل کننده بار vpsgol به یک سرور گفتمان

در این مرحله شما یک vpsgol Load Balancer را به سرور Discourse که در پیش نیازها ایجاد کرده اید اضافه می کنید. به کنترل پنل vpsgol خود دسترسی پیدا کنید، روی Networking، سپس Load Balancers، و سپس روی Create Load Balancer کلیک کنید.

شما باید یک منطقه مرکز داده را برای متعادل کننده بار خود انتخاب کنید. حتماً همان منطقه ای را که برای قطره گفتمان انتخاب کرده اید انتخاب کنید. Load Balancer با Droplet شما با استفاده از شبکه خصوصی آن ارتباط برقرار می کند، بنابراین هر دو Droplet و Load Balancer شما باید در یک منطقه باشند.

سپس، Droplet خود را با تایپ کردن نام Droplet در قسمت متن به Load Balancer اضافه کنید.

Discourse معمولاً با صدور گواهی رایگان Let’s Encrypt در طول فرآیند نصب، HTTPS را برای شما مدیریت می کند. با این حال، وقتی Droplet شما پشت Load Balancer قرار دارد، Let’s Encrypt نمی تواند گواهی شما را تمدید کند زیرا آدرس IP دامنه شما با IP Droplet شما مطابقت ندارد.

خوشبختانه، vpsgol Load Balancer می تواند گواهی ها را برای شما مدیریت کند. فقط باید یک قانون حمل و نقل برای HTTPS به Load Balancer خود اضافه کنید. یک قانون حمل و نقل به Load Balancer می گوید که نوع خاصی از ترافیک را به Droplet شما ارسال کند.

شما به دو قانون ارسال نیاز دارید، یکی برای HTTP و دیگری برای HTTPS. با افزودن یک قانون حمل و نقل برای HTTPS، vpsgol می تواند به طور خودکار یک گواهی را برای شما ایجاد و تمدید کند. پشتیبانی HTTPS برای امنیت و سئوی سایت شما نیز مهم است.

از آنجایی که دامنه خود را به عنوان بخشی از پیش نیازها به vpsgol اضافه کردید، افزودن پشتیبانی HTTPS فقط چند کلیک طول می کشد. در قسمت Forwarding rules یک قانون جدید به نام HTTPS اضافه کنید که می توانید آن را از لیست کشویی انتخاب کنید. حالا Certificate و سپس + New Certificate را بزنید.

نام دامنه خود را در فیلد متنی تایپ کنید، که باید به صورت خودکار برای شما پر شود. سپس به گواهینامه خود یک نام بدهید و روی Generate Certificate کلیک کنید تا vpsgol درخواست داشته باشد و یک گواهی را برای شما مدیریت کند.

تقریباً راه اندازی Load Balancer خود را تمام کرده اید. روی دکمه Edit Advanced Settings کلیک کنید و کادر با عنوان Enable Proxy Protocol را علامت بزنید. هنگامی که پروتکل PROXY فعال است، Load Balancer اطلاعات مشتری مانند آدرس IP کاربر را به Droplets پشت Load Balancer ارسال می کند. بدون پروتکل PROXY، Discourse فکر می‌کرد که تمام ترافیک آن از یک کاربر منفرد (Load Balancer) می‌آید، و همه گزارش‌ها نشانی IP Load Balancer را به جای آدرس‌های IP واقعی کاربران شما نشان می‌دهند.

در نهایت یک نام برای Load Balancer خود انتخاب کنید و روی Create Load Balancer کلیک کنید.

اکنون که Load Balancer را راه اندازی کرده اید، باید فایل های پیکربندی Discourse خود را تغییر دهید.

مرحله 2 – اصلاح فایل های پیکربندی گفتمان

در این مرحله، فایل‌های پیکربندی پیش‌فرض موجود در Discourse را تغییر می‌دهید. SSH را به Droplet خود وارد کنید و با استفاده از این دستور به فهرست /var/discourse بروید:

cd /var/discourse

با استفاده از nano یا ویرایشگر متن مورد علاقه خود، یک فایل جدید به نام loadbalancer.template.yml در فهرست قالب ها ایجاد و باز کنید:

sudo nano templates/loadbalancer.template.yml

پوشه templates فایل هایی را برای پیکربندی Discourse شما نگهداری می کند. در اینجا، شما در حال اضافه کردن یک الگوی سفارشی جدید برای فعال کردن پشتیبانی از پروتکل PROXY برای نصب Discourse خود هستید.

در loadbalancer.template.yml، خطوط زیر را وارد کنید:

run:
– exec: “sed -i ‘s:listen 80: listen 80 proxy_protocol:g’ /etc/nginx/conf.d/discourse.conf”
– exec: “sed -i ‘s:$remote_addr:$proxy_protocol_addr:g’ /etc/nginx/conf.d/discourse.conf”
– exec: “sed -i ‘s:X-Forwarded-For $proxy_add_x_forwarded_for:X-Forwarded-For $proxy_protocol_addr:g’ /etc/nginx/conf.d/discourse.conf”

خط اول پیکربندی Discourse Nginx را برای فعال کردن پشتیبانی از پروتکل PROXY تغییر می‌دهد. اگر پروتکل PROXY در Load Balancer فعال باشد اما در Nginx فعال نباشد، Discourse یک خطای سرور را برمی‌گرداند.

خط دوم یافتن و جایگزینی را انجام می‌دهد و همه رخدادهای $remote_addr را با $proxy_protocol_addr جایگزین می‌کند. $proxy_protocol_addr حاوی آدرس IP مشتری است که از Load Balancer ارسال شده است. $remote_addr معمولاً آدرس IP کاربر را نشان می دهد، اما از آنجایی که Discourse پشت Load Balancer قرار دارد، آدرس IP Load Balancer را نشان می دهد.

خط آخر همه موارد X-Forwarded-For $proxy_add_x_forwarded_for را با X-Forwarded-For $proxy_protocol_addr جایگزین می‌کند و اطمینان حاصل می‌کند که هدر X-Forwarded-For آدرس IP مشتری را به درستی ثبت می‌کند و نه آدرس IP Load Balancer.

با فشار دادن CTRL+X و سپس y فایل را ذخیره کرده و ببندید.

آخرین کاری که باید انجام دهید این است که قالب را در Discourse بارگذاری کنید و Discourse را بازسازی کنید.

با استفاده از nano یا ویرایشگر متن مورد علاقه خود، فایلی به نام app.yml را در فهرست کانتینرها ویرایش کنید:

sudo nano containers/app.yml

ابتدا قالبی را که ایجاد کرده اید اضافه می کنید. در زیر الگوها، خط برجسته شده را مانند شکل اضافه کنید:

containers/app.yml

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/loadbalancer.template.yml"

حتماً الگوی جدید را در یک خط زیر templates/web.template.yml اضافه کنید.

در مرحله بعد، مطمئن شوید که دو خط web.ssl.template.yml و templates/web.letsencrypt.ssl.template.yml هر دو با اضافه کردن یک علامت پوند [#] همانطور که نشان داده شده است، توضیح داده شده اند:

containers/app.yml

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/loadbalancer.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

در نهایت چند خط پایین بروید تا expose را ببینید. خط “443:443” # https را با اضافه کردن علامت پوند [#] همانطور که نشان داده شده است، نظر دهید:

containers/app.yml

...
expose:
  - "80:80"   # http
# - "443:443" # https

اکنون وقتی Discourse را بازسازی می کنید، HTTPS در Discourse غیرفعال می شود. اتصال HTTPS در Load Balancer خاتمه می یابد و Load Balancer با Droplet شما از طریق شبکه خصوصی امن vpsgol ارتباط برقرار می کند، بنابراین نیازی به راه اندازی HTTPS در سرور Discourse خود ندارید.

با فشار دادن CTRL+X و سپس y فایل را ذخیره کرده و ببندید.

برای اعمال پیکربندی و بازسازی Discourse، دستور زیر را اجرا کنید:

sudo ./launcher rebuild app

این دستور به امتیازات فوق کاربر نیاز دارد، به همین دلیل است که با sudo اضافه شده است.

در این مرحله، پیکربندی Discourse و Load Balancer را به پایان رسانده اید. در مرحله بعد، نام دامنه خود را به آدرس IP Load Balancer نشان می دهید.

مرحله 3 – به روز رسانی DNS

در این مرحله، دامنه خود را به جای آدرس IP Droplet به آدرس IP Load Balancer اشاره می‌کنید.

اگر از میزبانی DNS vpsgol استفاده می کنید، به کنترل پنل بروید و روی Networking کلیک کنید. روی نام دامنه خود کلیک کنید، سپس به دنبال رکورد A باشید که به Droplet شما اشاره می کند. منوی بیشتر رکورد را برای تغییر رکورد انتخاب کنید. مقدار این رکورد را از آدرس IP Droplet خود به آدرس IP Load Balancer تغییر دهید.

سرور Discourse شما پشت یک  vpsgol Load Balancer اجرا می شود و شما مجبور نخواهید بود گواهینامه های SSL خود را مدیریت کنید زیرا vpsgol این کار را برای شما انجام می دهد.

با مراجعه به نام دامنه خود، نصب Discourse خود را تست کنید. شما باید صفحه ای را ببینید که شبیه به این است:

اکنون که دامنه شما به Load Balancer اشاره می کند، یک نمونه پایگاه داده مدیریت شده را برای ایجاد یک تجربه ثابت برای کاربران خود اضافه می کنید.

مرحله 4 – افزودن یک پایگاه داده مدیریت شده vpsgol

در این مرحله، یک نمونه vpsgol Managed PostgreSQL ایجاد می‌کنید و آن را به استقرار Discourse خود اضافه می‌کنید.

مزیت اصلی Load Balancer تقسیم ترافیک شما بین چند قطره است. تا به حال، پایگاه داده، سرور Redis و وب سرور شما همگی بر روی یک Droplet اجرا می شدند. اگر نمونه دوم Discourse را اضافه کنید، پایگاه داده، سرور Redis و وب سرور خود را خواهد داشت و مانند یک وب سایت کاملاً متفاوت عمل می کند. بازدیدکنندگان شما ممکن است احساس کنند که به وب‌سایت‌های دیگر با پست‌ها و کاربران متفاوت می‌روند، زیرا به پایگاه‌های داده متفاوتی متصل خواهند شد. شما می توانید این مشکل را با استفاده از یکی از نمونه های مدیریت شده PostgreSQL vpsgol حل کنید، به جای اینکه یک پایگاه داده جداگانه در هر قطره گفتمان اجرا شود.

با رفتن به کنترل پنل vpsgol یک نمونه PostgreSQL مدیریت شده vpsgol را تنظیم کنید. روی Databases کلیک کنید، سپس Create Database Cluster، در نهایت PostgresSQL را انتخاب کنید، منطقه را مطابق با مکان Droplet خود تنظیم کنید و روی Create a Database Cluster کلیک کنید.

در حالی که پایگاه داده شما در حال تهیه است، Droplet خود را به عنوان منبع قابل اعتماد به پایگاه داده خود اضافه کنید. این به Droplet شما اجازه می دهد تا با استفاده از شبکه خصوصی امن vpsgol با پایگاه داده شما ارتباط برقرار کند.

در صفحه بعدی شبکه VPC را انتخاب کنید و مقادیر میزبان پایگاه داده، نام کاربری، رمز عبور و پورت را یادداشت کنید، زیرا باید آنها را به فایل containers/app.yml خود اضافه کنید.

هنگامی که کلاستر پایگاه داده شما ایجاد شد، باید پیکربندی Discourse را به روز کنید. باز کردن containers/app.yml:

sudo nano containers/app.yml

در بخش الگوها، خط را نظر دهید – templates/postgres.template.yml همانطور که نشان داده شده است:

containers/app.yml

templates:
# - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/loadbalancer.template.yml"

این باعث می‌شود Discourse هنگام بازسازی، سرور Postgres خود را فراهم نکند.

سپس به دنبال بخش env از containers/app.yml بگردید و خطوط زیر را اضافه کنید و مقادیر خود را برای نام کاربری پایگاه داده، رمز عبور، میزبان، نام و پورت جایگزین کنید.

containers/app.yml

env:
    DISCOURSE_DB_USERNAME: your_db_username
    DISCOURSE_DB_PASSWORD: your_db_password
    DISCOURSE_DB_HOST: your_db_host
    DISCOURSE_DB_NAME: your_db_name
    DISCOURSE_DB_PORT: your_db_port

این متغیرهای اضافی به Droplet شما اجازه می دهد تا به پایگاه داده خارجی شما متصل شود.

فایل را با فشار دادن CTRL+X و سپس y ذخیره کنید.

اگر یک نصب Discourse از قبل موجود دارید، باید آن را به عنوان پشتیبان صادر کنید. می توانید این کار را با رفتن به قسمت مدیریت سایت خود، روی Backups و سپس روی Backup کلیک کنید.

برای اعمال پیکربندی و بازسازی Discourse، دستور زیر را اجرا کنید:

sudo ./launcher rebuild app

حتی اگر سایت خود را صادر کرده باشید، باید دوباره نصب وب Discourse را انجام دهید تا یک حساب کاربری جدید ایجاد کنید. اکنون که به پایگاه داده جدید خود متصل هستید، می توانید از این حساب برای بازیابی Discourse استفاده کنید.

در نهایت، یک تنظیم را تغییر می‌دهید تا اطمینان حاصل کنید که کاربران هنگام بازدید از سایت، در همان Droplet باقی می‌مانند.

به تنظیمات Load Balancer خود در کنترل پنل vpsgol برگردید. به Networking، سپس Load Balancers، سپس Settings بروید و به دنبال Sticky Sessions بگردید. روی Edit کلیک کنید.

Sticky Sessions را از None به Cookie تغییر دهید و روی Save کلیک کنید.

Sticky Sessions تضمین می‌کند که هر کاربری که از طریق Load Balancer از وب‌سایت شما بازدید می‌کند، در طول مدت بازدید خود به همان Droplet متصل می‌ماند. این مهم است زیرا هر قطره هنوز هم نمونه Redis خود را دارد و Redis این است که چگونه Discourse کاربر را هنگام ورود به سیستم ردیابی می کند. بدون Sticky Sessions، کاربر می تواند در یک Droplet وارد شود، سپس از یک صفحه جدید بازدید کند و (ناشناس به آنها) با قطره دیگری که در آن وارد نشده‌اند تعویض شود. Sticky Sessions با نگه داشتن کاربر در همان Droplet از این امر جلوگیری می کند.

همانطور که ما با پایگاه داده انجام دادیم، می توانید Redis را به نمونه اختصاصی خود منتقل کنید و سپس به Sticky Sessions نیازی نخواهید داشت. می توانید این را در مرحله بعدی امتحان کنید.

مرحله 5 – (اختیاری) افزودن یک نمونه Redis مدیریت شده vpsgol

این مرحله اختیاری است و به یک نمونه vpsgol Managed Redis نیاز دارد. تا این مرحله، نمونه Redis در Droplet در پشت Load Balancer قرار می‌گرفت، که برای اطمینان از ورود کاربران به سیستم، نیاز به جلسات چسبنده دارد. با این حال، در تنظیم قبلی، کاربران پس از تغییر Droplet از سیستم خارج می شدند زیرا اطلاعات جلسه آنها در Droplet ذخیره می شود.

افزودن یک سرور Redis خارجی به Droplets می تواند این مشکل را برطرف کند. این به طور موثر وضعیت Discourse را از Droplets شما دور می کند. اگر Droplet آفلاین شود، کاربران شما از سیستم خارج نمی‌شوند – در واقع، آنها حتی متوجه نمی‌شوند.

شما می توانید یک سرور Redis مدیریت شده vpsgol را به همان روشی که پایگاه داده مدیریت شده PostgreSQL خود را ایجاد کردید راه اندازی کنید. به کنترل پنل vpsgol بروید. روی Databases، سپس Create، سپس Database کلیک کنید و Redis را برای موتور پایگاه داده خود انتخاب کنید. همان منطقه را با سایر منابع خود انتخاب کنید تا مطمئن شوید که آنها در همان شبکه VPC هستند. به سرور خود یک نام بدهید و روی Create a database cluster کلیک کنید.

درست مانند زمانی که پایگاه داده Postgres خود را ایجاد می کنید، یک صفحه خوش آمدگویی با چند مرحله شروع خواهید دید. روی Secure this database cluster کلیک کنید، نام Droplet خود را وارد کنید و سپس روی Allow these inbound sources only کلیک کنید. این تضمین می کند که فقط Droplet شما می تواند به Redis متصل شود.

اکنون باید سیاست تخلیه را برای سرور Redis خود انتخاب کنید. allkeys-lru را انتخاب کنید. این خط مشی به این معنی است که اگر سرور Redis شما پر شود، شروع به حذف قدیمی ترین ورودی های خود می کند. با این کار کاربرانی که مدتی است از وب سایت شما استفاده نکرده اند، از سیستم خارج می شود، اما بهتر از این است که Redis خطاها را بازگرداند و کار را متوقف کند.

سیاست اخراج خود را ذخیره کنید. مانند پایگاه داده PostgreSQL خود، در صفحه جزئیات اتصال، شبکه VPC را انتخاب کنید.

هنگامی که نمونه Redis ایجاد شد، باید پیکربندی Discourse خود را به روز کنید. باز کردن containers/app.yml با استفاده از nano:

sudo nano containers/app.yml

همانطور که در اینجا نشان داده شده است، جزئیات اتصال Redis را به بخش env اضافه کنید. حتما متن هایلایت شده را با اطلاعات خود جایگزین کنید. (نیازی به وارد کردن قسمت نام کاربری ندارید.)

containers/app.yml

env:
    DISCOURSE_REDIS_HOST: your_redis_host
    DISCOURSE_REDIS_PASSWORD: your_redis_password
    DISCOURSE_REDIS_PORT: your_redis_port
    DISCOURSE_REDIS_USE_SSL: true

در مرحله بعد، در بخش templates، روی خط نظر دهید – templates/redis.template.yml همانطور که نشان داده شده است:

containers/app.yml

templates:
# - "templates/postgres.template.yml"
# - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/loadbalancer.template.yml"

این امر از Discourse از ایجاد نمونه Redis خود جلوگیری می کند.

با فشار دادن CTRL+X و سپس y فایل را ذخیره کرده و ببندید.

برای اعمال پیکربندی و بازسازی Discourse، دستور زیر را اجرا کنید:

برنامه بازسازی sudo ./launcher
با یک نمونه Redis مدیریت شده، دیگر نیازی به Sticky Sessions ندارید. در صورت تمایل می توانید آن گزینه را خاموش کنید، اما کاربران شما تفاوتی را در هر دو صورت متوجه نمی شوند.

اکنون که پایگاه داده های مدیریت شده را به پیکربندی خود اضافه کرده اید، برای افزودن قطره های بیشتر، عکس های فوری از سرور Discourse خود ایجاد می کنید.

مرحله 6 – اضافه کردن قطرات اضافی

در این مرحله، شما یک عکس فوری از Discourse Droplet خود ایجاد می کنید که ایجاد سرورهای جدید را آسان تر می کند. یک عکس فوری یک کپی کامل از یک Droplet موجود را ارائه می دهد و می توانید از آنها برای ایجاد قطرات جدید با همان محتوا استفاده کنید.

با رفتن به کنترل پنل vpsgol یک عکس فوری جدید ایجاد کنید. روی Droplets کلیک کنید، Droplet خود را پیدا کنید و روی Snapshots کلیک کنید. برای عکس فوری خود یک نام بگذارید و روی Take snapshot زنده کلیک کنید.

شما می توانید از این عکس فوری برای اضافه کردن قطرات اضافی پشت Load Balancer و افزایش ظرفیت وب سایت خود استفاده کنید.

هر بار که یک Droplet جدید ایجاد می کنید، باید منابع مورد اعتماد را در سرورهای Postgres و Redis خود به روز کنید، که می توانید از طریق کنترل پنل انجام دهید. همانطور که در مرحله قبل انجام دادید، نمونه پایگاه داده‌ای را که می‌خواهید تغییر دهید انتخاب کنید، به نمای کلی بروید و سپس Secure this database cluster. آدرس های IP جدید Droplet خود را به لیست منابع قابل اعتماد اضافه کنید.

در این مرحله، از Snapshot برای ایجاد قطره‌های اضافی استفاده کردید و آنها را به عنوان منابع قابل اعتماد به نمونه‌های PostgreSQL و Redis خود اضافه کردید.

نتیجه

در این آموزش، شما یک سرور Discourse را در پشت یک vpsgol Load Balancer راه اندازی می کنید. برای کمک به مقیاس‌بندی استقرار خود، یک پایگاه داده مدیریت‌شده PostgreSQL و نمونه مدیریت‌شده Redis را نیز اضافه کرده‌اید. در نهایت، با استفاده از عکس های فوری و کنترل پنل، قطرات بیشتری اضافه کردید. با استفاده از کنترل پنل، می توانید منابع بیشتری را با رشد جامعه خود اضافه کنید.

اکنون که یک Load Balancer راه‌اندازی کرده‌اید، می‌توانید موارد استفاده دیگر را برای vpsgol Load Balancer مانند Canary Deployments بررسی کنید. همچنین می توانید با دنبال کردن آموزش نحوه اتصال به یک نمونه Redis مدیریت شده از طریق TLS با Stunnel و redis-cli، با استفاده از خط فرمان به نمونه Redis خود متصل شوید. در نهایت، می‌توانید با استفاده از مستندات پایگاه‌های داده مدیریت شده و آموزش، استخرهای اتصال پایگاه‌های داده مدیریت‌شده و بنچمارک PostgreSQL با استفاده از pgbench، درباره پایگاه‌های داده vpsgol و عملکرد آن‌ها اطلاعات بیشتری کسب کنید.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:استقرار Discourseبه روز رسانی DNSپیکربندی Discourseخرید سرور مجازیخرید سرور مجازی آمریکاسرور Discourseسرور Redisهاست خرید

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از PostgreSQL با برنامه جنگو در اوبونتو 20.04

ورود به سایت

معرفی

جنگو یک چارچوب انعطاف پذیر برای ایجاد سریع برنامه های پایتون است. به طور پیش فرض، برنامه های جنگو برای ذخیره داده ها در یک فایل پایگاه داده سبک وزن SQLite پیکربندی شده اند. در حالی که این کار در برخی از بارها به خوبی کار می کند، یک سیستم مدیریت پایگاه داده سنتی تر می تواند عملکرد در تولید را بهبود بخشد.

در این راهنما، PostgreSQL (که اغلب به آن Postgres گفته می شود) را برای استفاده در برنامه های جنگو نصب و پیکربندی می کنید. شما نرم افزار لازم را نصب می کنید، اعتبار پایگاه داده را برای برنامه ما ایجاد می کنید و سپس یک پروژه جنگو جدید را برای استفاده از این باطن شروع و پیکربندی می کنید.

پیش نیازها

  • شما به یک نمونه سرور اوبونتو 20.04 تمیز با یک کاربر غیر ریشه که با امتیازات sudo پیکربندی شده نیاز دارید. با دنبال کردن راهنمای اولیه راه اندازی سرور ما، نحوه تنظیم این را بیاموزید.

وقتی برای ادامه آماده شدید، به عنوان کاربر sudo خود وارد شوید.

مرحله 1 – نصب کامپوننت ها از مخازن اوبونتو

ابتدا اجزای ضروری را نصب خواهید کرد. این شامل pip، مدیر بسته پایتون برای نصب و مدیریت اجزای پایتون، و همچنین نرم‌افزار پایگاه داده با کتابخانه‌های مرتبط آن است.

شما از پایتون 3 استفاده خواهید کرد که با اوبونتو 20.04 عرضه می شود. نصب را با تایپ کردن شروع کنید:

sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib

با پایان نصب، می توانید به پایگاه داده بروید.

مرحله 2 – ایجاد یک پایگاه داده و کاربر پایگاه داده

به طور پیش فرض، Postgres از یک طرح احراز هویت به نام “تأیید هویت همتا” برای اتصالات محلی استفاده می کند. اساساً، این بدان معنی است که اگر نام کاربری سیستم عامل کاربر با نام کاربری معتبر Postgres مطابقت داشته باشد، آن کاربر می تواند بدون احراز هویت بیشتر وارد شود.

در طول نصب Postgres، یک کاربر سیستم عامل به نام postgres ایجاد شد تا با کاربر مدیریت PostgreSQL مطابقت داشته باشد. برای انجام کارهای اداری باید از این کاربر استفاده کنید. با گزینه -u می توانید از sudo و pass در نام کاربری استفاده کنید.

با تایپ کردن، وارد یک جلسه تعاملی Postgres شوید:

sudo -u postgres psql

ابتدا یک پایگاه داده برای پروژه جنگو ایجاد خواهید کرد. هر پروژه به دلایل امنیتی باید پایگاه داده جدا شده خود را داشته باشد. ما در این راهنما پایگاه داده را myproject می نامیم، اما همیشه بهتر است چیزی توصیفی تر را انتخاب کنید:

CREATE DATABASE myproject;

در مرحله بعد، یک کاربر پایگاه داده ایجاد می کنید که از آن برای اتصال و تعامل با پایگاه داده استفاده می کنید. رمز عبور را روی چیزی قوی و امن تنظیم کنید:

CREATE USER myprojectuser WITH PASSWORD ‘password’;

پس از آن، تعدادی از پارامترهای اتصال را برای کاربری که ایجاد کرده‌اید تغییر می‌دهید. این کار باعث سرعت بخشیدن به عملیات پایگاه داده می شود به طوری که هر بار که یک اتصال برقرار می شود نیازی به جستجو و تنظیم مقادیر صحیح نباشد.

ALTER ROLE myprojectuser SET client_encoding TO ‘utf8’;
ALTER ROLE myprojectuser SET default_transaction_isolation TO ‘read committed’;
ALTER ROLE myprojectuser SET timezone TO ‘UTC’;

شما کدگذاری پیش‌فرض را روی UTF-8 تنظیم می‌کنید که جنگو انتظار دارد. شما همچنین طرح پیش‌فرض جداسازی تراکنش را روی «خواندن تعهد» تنظیم می‌کنید که خواندن تراکنش‌های غیرمتعهد را مسدود می‌کند. در نهایت، شما در حال تنظیم منطقه زمانی هستید. به‌طور پیش‌فرض، پروژه‌های جنگو شما برای استفاده از UTC تنظیم می‌شوند. اینها همه توصیه هایی از خود پروژه جنگو هستند.

اکنون، تنها کاری که باید انجام دهید این است که حقوق دسترسی کاربر پایگاه داده خود را به پایگاه داده ای که ایجاد کرده اید بدهید:

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

برای بازگشت به جلسه پوسته کاربر postgres از اعلان SQL خارج شوید:

\q

جنگو را در یک محیط مجازی نصب کنید

اکنون که پایگاه داده شما راه اندازی شده است، می توانید جنگو را نصب کنید. برای انعطاف‌پذیری بهتر، جنگو و تمام وابستگی‌های آن را در یک محیط مجازی پایتون نصب خواهید کرد. بسته virtualenv به شما این امکان را می دهد که این محیط ها را به راحتی ایجاد کنید.

برای نصب virtualenv تایپ کنید:

sudo pip3 install virtualenv

برای نگهداری پروژه جنگو خود، دایرکتوری بسازید و به آن منتقل کنید:

mkdir ~/myproject

cd ~/myproject

شما می توانید با تایپ کردن یک محیط مجازی برای ذخیره نیازمندی های Python پروژه جنگو خود ایجاد کنید:

python3 -m virtualenv myprojectenv

این یک کپی محلی از پایتون و یک دستور pip محلی را در فهرستی به نام myprojectenv در فهرست پروژه شما نصب می کند.

قبل از نصب اپلیکیشن ها در محیط مجازی، باید آن را فعال کنید. می توانید این کار را با تایپ کردن انجام دهید:

source myprojectenv/bin/activate

اعلان شما تغییر می کند تا نشان دهد که اکنون در محیط مجازی کار می کنید. چیزی شبیه این (myprojectenv)user@host:~/myproject$ خواهد بود.

هنگامی که محیط مجازی شما فعال شد، می توانید نسخه رسمی جنگو را با pip نصب کنید. شما همچنین بسته psycopg2 را نصب خواهید کرد که به ما امکان می دهد از پایگاه داده Postgres که پیکربندی کرده اید استفاده کنیم:

pip install Django psycopg2

اکنون می توانید یک پروژه جنگو را در پوشه myproject شروع کنید. این یک دایرکتوری فرزند به همین نام ایجاد می کند تا خود کد را نگه دارد و یک اسکریپت مدیریتی در دایرکتوری فعلی ایجاد می کند. مطمئن شوید که نقطه را در انتهای دستور اضافه کنید تا به درستی تنظیم شود:

django-admin startproject myproject .

تنظیمات پایگاه داده جنگو را پیکربندی کنید

اکنون که یک پروژه دارید، باید آن را برای استفاده از پایگاه داده ای که ایجاد کرده اید پیکربندی کنید.

فایل اصلی تنظیمات پروژه جنگو را که در دایرکتوری پروژه فرزند قرار دارد باز کنید:

nano ~/myproject/myproject/settings.py

در پایین فایل، یک بخش DATABASES را مشاهده خواهید کرد که به شکل زیر است:

~/myproject/myproject/settings.py

. . .

DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

. . .

این در حال حاضر برای استفاده از SQLite به عنوان پایگاه داده پیکربندی شده است. شما باید این را تغییر دهید تا پایگاه داده PostgreSQL شما به جای آن استفاده شود.

ابتدا موتور را طوری تغییر دهید که به جای آداپتور sqlite3 از آداپتور postgresql استفاده کند. برای NAME، از نام پایگاه داده خود (myproject در این مثال) استفاده کنید. همچنین باید اعتبار ورود به سیستم را اضافه کنید. برای اتصال به نام کاربری، رمز عبور و میزبان نیاز دارید. گزینه پورت را اضافه کرده و آن را خالی می گذارید تا پیش فرض انتخاب شود:

~/myproject/myproject/settings.py

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

. . .

وقتی اینجا هستید، باید دستورالعمل ALLOWED_HOSTS را نیز تنظیم کنید. این یک لیست سفید از آدرس‌ها یا نام‌های دامنه مجاز به اتصال به نمونه جنگو را تعیین می‌کند. هر درخواست دریافتی با هدر Host که در این لیست نیست یک استثنا ایجاد می کند. جنگو نیاز دارد که این را تنظیم کنید تا از یک کلاس آسیب‌پذیری امنیتی جلوگیری کنید.

در قطعه زیر، چند نمونه نظر داده شده برای نشان دادن وجود دارد:

~/myproject/myproject/settings.py

. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP']

در پرانتز، آدرس‌های IP یا نام‌های دامنه مرتبط با سرور جنگو را فهرست کنید. هر مورد باید در نقل قول با ورودی های جدا شده با کاما ذکر شود. اگر می‌خواهید برای کل دامنه و هر زیر دامنه‌ای درخواست کنید، یک نقطه برای شروع ورودی قرار دهید.

وقتی کارتان تمام شد، فایل را ذخیره و ببندید.

پایگاه داده را مهاجرت کنید و پروژه خود را آزمایش کنید.

اکنون که تنظیمات جنگو پیکربندی شده است، می توانید ساختارهای داده خود را به پایگاه داده خود منتقل کرده و سرور را آزمایش کنید.

می توانید با ایجاد و اعمال مهاجرت به پایگاه داده خود شروع کنید. از آنجایی که هنوز هیچ داده واقعی ندارید، این به سادگی ساختار پایگاه داده اولیه را تنظیم می کند:

cd ~/myproject

python manage.py makemigrations

python manage.py migrate

پس از ایجاد ساختار پایگاه داده، می توانید با تایپ کردن یک حساب مدیریتی ایجاد کنید

python manage.py createsuperuser

از شما خواسته می شود یک نام کاربری انتخاب کنید، یک آدرس ایمیل ارائه دهید، و یک رمز عبور برای حساب کاربری انتخاب و تایید کنید.

اگر راهنمای اولیه راه اندازی سرور را دنبال کردید، باید یک فایروال UFW در محل داشته باشید. قبل از اینکه بتوانید برای آزمایش پایگاه داده خود به سرور توسعه جنگو دسترسی پیدا کنید، باید پورت را در فایروال خود باز کنید.

با تایپ کردن:

sudo ufw allow 8000

هنگامی که پورت را باز کردید، می توانید با راه اندازی سرور توسعه جنگو تست کنید که پایگاه داده شما به درستی کار می کند:

python manage.py runserver 0.0.0.0:8000

در مرورگر وب خود، از نام دامنه یا آدرس IP سرور خود و به دنبال آن :8000 دیدن کنید تا به صفحه ریشه پیش فرض جنگو برسید:

http://server_domain_or_IP:8000

شما باید صفحه فهرست پیش فرض را ببینید:

/admin را به انتهای URL اضافه کنید و باید بتوانید به صفحه ورود به رابط مدیریت دسترسی داشته باشید:

نام کاربری و رمز عبوری که به تازگی با دستور createsuperuser ایجاد کرده اید را وارد کنید. سپس به رابط مدیریت هدایت خواهید شد:

پس از اتمام بررسی، می توانید با زدن CTRL-C در پنجره ترمینال، سرور توسعه را متوقف کنید.

با دسترسی به رابط مدیریت، تأیید کرده‌اید که پایگاه داده شما اطلاعات حساب کاربری شما را ذخیره کرده است و می‌توان به آن دسترسی مناسب داشت.

نتیجه

در این راهنما، نحوه نصب و پیکربندی PostgreSQL را به عنوان پایگاه داده پشتیبان برای پروژه جنگو نشان داده اید. در حالی که SQLite می‌تواند به راحتی بار را در طول توسعه و استفاده از تولید سبک تحمل کند، اکثر پروژه‌ها از پیاده‌سازی یک سیستم مدیریت پایگاه داده کامل‌تر بهره می‌برند.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:اوبونتو 20.04برنامه جنگوبرنامه های پایتونخرید سرورخرید سرور مجازیخرید سرور مجازی آمریکاسرور اوبونتو 20.04نحوه استفاده از PostgreSQLنرم‌افزار پایگاه داده

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب Hadoop در حالت مستقل در اوبونتو 20.04

ورود به سایت

معرفی

Hadoop یک چارچوب برنامه نویسی مبتنی بر جاوا است که از پردازش و ذخیره مجموعه داده های بسیار بزرگ در مجموعه ای از ماشین های ارزان قیمت پشتیبانی می کند. این اولین پروژه بزرگ منبع باز در زمینه بازی کلان داده بود و توسط بنیاد نرم افزار آپاچی حمایت می شود.

Hadoop از چهار لایه اصلی تشکیل شده است:

Hadoop Common مجموعه ای از ابزارها و کتابخانه هایی است که از ماژول های دیگر Hadoop پشتیبانی می کند.
HDFS که مخفف Hadoop Distributed File System است، مسئول ماندگاری داده ها روی دیسک است.
YARN، مخفف Yet Another Resource Negotiator، «سیستم عامل» برای HDFS است.
MapReduce مدل پردازش اصلی برای خوشه‌های Hadoop است. کار را در خوشه یا نقشه توزیع می کند، سپس نتایج را از گره ها به یک پاسخ به یک پرس و جو سازماندهی و کاهش می دهد. بسیاری از مدل‌های پردازشی دیگر برای نسخه 3.x Hadoop در دسترس هستند.
راه اندازی خوشه های Hadoop نسبتاً پیچیده است، بنابراین پروژه شامل یک حالت مستقل است که برای یادگیری در مورد Hadoop، انجام عملیات ساده و اشکال زدایی مناسب است.

در این آموزش، Hadoop را در حالت مستقل نصب می‌کنید و یکی از نمونه‌های برنامه MapReduce را اجرا می‌کنید تا نصب را تأیید کنید.

پیش نیازها

برای دنبال کردن این آموزش، شما نیاز دارید:

سرور اوبونتو 20.04 با کاربر غیر ریشه با امتیازات sudo: می‌توانید در راهنمای راه‌اندازی سرور اولیه با اوبونتو 20.04 درباره نحوه راه‌اندازی کاربری با این امتیازات بیشتر بدانید.
همچنین ممکن است دوست داشته باشید نگاهی به مقدمه ای بر مفاهیم و اصطلاحات کلان داده یا مقدمه ای بر هادوپ بیندازید.

پس از تکمیل پیش نیازها، برای شروع به عنوان کاربر sudo خود وارد شوید.

مرحله 1 – نصب جاوا

برای شروع، لیست بسته ما را به روز می کنید و OpenJDK، کیت توسعه پیش فرض جاوا را در اوبونتو 20.04 نصب می کنید:

sudo apt update
sudo apt install default-jdk

پس از اتمام نصب، بیایید نسخه را بررسی کنیم.

java -version

 

Output

openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

این خروجی تأیید می کند که OpenJDK با موفقیت نصب شده است.

مرحله 2 – نصب Hadoop

با جاوا در جای خود، از صفحه انتشارات Apache Hadoop دیدن خواهید کرد تا آخرین نسخه پایدار را بیابید.

برای نسخه ای که می خواهید نصب کنید به باینری بروید. در این راهنما شما Hadoop 3.3.1 را نصب خواهید کرد، اما می توانید شماره نسخه های موجود در این راهنما را با یکی از دلخواه خود جایگزین کنید.

در صفحه بعد، کلیک راست کرده و پیوند را به باینری انتشار کپی کنید.

در سرور، از wget برای واکشی آن استفاده خواهید کرد:

wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz

برای اینکه مطمئن شوید فایلی که دانلود کرده اید تغییر نکرده است، یک بررسی سریع با استفاده از SHA-512 یا الگوریتم هش ایمن 512 انجام خواهید داد. به صفحه انتشار بازگردید، سپس کلیک راست کرده و پیوند را در کپی کنید. فایل چک‌سوم برای نسخه باینری که دانلود کرده‌اید:

باز هم از wget در سرور ما برای دانلود فایل استفاده خواهید کرد:

wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz.sha512

سپس تأیید را اجرا کنید:

shasum -a 512 hadoop-3.3.1.tar.gz

 

Output

2fd0bf74852c797dc864f373ec82ffaa1e98706b309b30d1effa91ac399b477e1accc1ee74d4ccbb1db7da1c5c541b72e4a834f131a99f2814b030fbd043df66  hadoop-3.3.1.tar.gz

این مقدار را با مقدار SHA-512 در فایل .sha512 مقایسه کنید:

cat hadoop-3.3.1.tar.gz.sha512

~/hadoop-3.3.1.tar.gz.sha512

...
SHA512 (hadoop-3.3.1.tar.gz) = 2fd0bf74852c797dc864f373ec82ffaa1e98706b309b30d1effa91ac399b477e1accc1ee74d4ccbb1db7da1c5c541b72e4a834f131a99f2814b030fbd043df66
...

خروجی دستوری که در برابر فایلی که از mirror دانلود کرده اید اجرا می کنید باید با مقدار فایلی که از apache.org دانلود کرده اید مطابقت داشته باشد.

اکنون که تأیید کرده اید که فایل خراب یا تغییر نکرده است، می توانید آن را استخراج کنید:

tar -xzvf hadoop-3.3.1.tar.gz

خروجی دستوری که در برابر فایلی که از mirror دانلود کرده اید اجرا می کنید باید با مقدار فایلی که از apache.org دانلود کرده اید مطابقت داشته باشد.

اکنون که تأیید کرده اید که فایل خراب یا تغییر نکرده است، می توانید آن را استخراج کنید:

sudo mv hadoop-3.3.1 /usr/local/hadoop

با نصب نرم افزار، آماده پیکربندی محیط آن هستید.

مرحله 3 – پیکربندی جاوا خانه Hadoop

Hadoop نیاز دارد که مسیر جاوا را به عنوان یک متغیر محیطی یا در فایل پیکربندی Hadoop تنظیم کنید.

مسیر جاوا /usr/bin/java یک پیوند نمادین به /etc/alternatives/java است که به نوبه خود یک پیوند نمادین به باینری پیش فرض جاوا است. شما از readlink با پرچم -f برای دنبال کردن هر پیوند نمادین در هر قسمت از مسیر، به صورت بازگشتی استفاده خواهید کرد. سپس، از sed برای برش bin/java از خروجی استفاده خواهید کرد تا مقدار صحیح JAVA_HOME را به ما بدهید.

برای یافتن مسیر پیش فرض جاوا

readlink -f /usr/bin/java | sed “s:bin/java::”

 

Output

/usr/lib/jvm/java-11-openjdk-amd64/

می‌توانید این خروجی را برای تنظیم خانه جاوای Hadoop روی این نسخه خاص کپی کنید، که تضمین می‌کند اگر جاوا پیش‌فرض تغییر کند، این مقدار تغییر نخواهد کرد. همچنین، می‌توانید از دستور readlink به صورت پویا در فایل استفاده کنید تا Hadoop به‌طور خودکار از هر نسخه جاوا که به‌عنوان پیش‌فرض سیستم تنظیم شده است استفاده کند.

برای شروع، hadoop-env.sh را باز کنید:

sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh

سپس با انتخاب یکی از گزینه های زیر فایل را تغییر دهید:

گزینه 1: یک مقدار استاتیک تنظیم کنید

/usr/local/hadoop/etc/hadoop/hadoop-env.sh

 . . .
#export JAVA_HOME=
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
 . . .

گزینه 2: از Readlink برای تنظیم ارزش به صورت پویا استفاده کنید

/usr/local/hadoop/etc/hadoop/hadoop-env.sh

 . . .
#export JAVA_HOME=
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
 . . .

اگر در یافتن این خطوط مشکل دارید، از CTRL+W برای جستجوی سریع متن استفاده کنید. پس از اتمام کار، با CTRL+X خارج شوید و فایل خود را ذخیره کنید.

مرحله 4 – اجرای Hadoop

اکنون باید بتوانید Hadoop را اجرا کنید:

/usr/local/hadoop/bin/hadoop

 

Output

Usage: hadoop [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
 or    hadoop [OPTIONS] CLASSNAME [CLASSNAME OPTIONS]
  where CLASSNAME is a user-provided Java class

  OPTIONS is none or any of:

--config dir                     Hadoop config directory
--debug                          turn on shell script debug mode
--help                           usage information
buildpaths                       attempt to add class files from build tree
hostnames list[,of,host,names]   hosts to use in slave mode
hosts filename                   list of hosts to use in slave mode
loglevel level                   set the log4j level for this command
workers                          turn on worker mode

  SUBCOMMAND is one of:
. . .

این خروجی به این معنی است که Hadoop را با موفقیت پیکربندی کرده اید تا در حالت مستقل اجرا شود.

با اجرای نمونه برنامه MapReduce که با آن ارسال می شود، مطمئن خواهید شد که Hadoop به درستی کار می کند. برای انجام این کار، یک دایرکتوری به نام input در فهرست اصلی خود ایجاد کنید و فایل های پیکربندی Hadoop را در آن کپی کنید تا از آن فایل ها به عنوان داده استفاده کنید.

mkdir ~/input
cp /usr/local/hadoop/etc/hadoop/*.xml ~/input

در مرحله بعد، می توانید از دستور زیر برای اجرای برنامه MapReduce hadoop-mapreduce-examples، یک بایگانی جاوا با چندین گزینه استفاده کنید:

/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar grep ~/input ~/grep_example ‘allowed[.]*’

این برنامه grep را فراخوانی می کند، یکی از نمونه های متعدد موجود در نمونه های hadoop-mapreduce، و به دنبال آن دایرکتوری ورودی، ورودی و دایرکتوری خروجی grep_example. برنامه MapReduce grep مطابقت های یک کلمه تحت اللفظی یا عبارت منظم را می شمارد. در نهایت، عبارت منظم allow[.]* برای یافتن رخدادهای کلمه مجاز در داخل یا در انتهای یک جمله اعلانی داده می شود. این عبارت به حروف کوچک و بزرگ حساس است، بنابراین اگر در ابتدای جمله با حروف بزرگ نوشته می شد، کلمه ای را پیدا نمی کنید.

هنگامی که کار تکمیل می شود، خلاصه ای از آنچه پردازش شده و خطاهایی که با آن مواجه شده است ارائه می دهد، اما این شامل نتایج واقعی نیست.

 

Output

 . . .
   File System Counters
        FILE: Number of bytes read=1200956
        FILE: Number of bytes written=3656025
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
    Map-Reduce Framework
        Map input records=2
        Map output records=2
        Map output bytes=33
        Map output materialized bytes=43
        Input split bytes=114
        Combine input records=0
        Combine output records=0
        Reduce input groups=2
        Reduce shuffle bytes=43
        Reduce input records=2
        Reduce output records=2
        Spilled Records=4
        Shuffled Maps =1
        Failed Shuffles=0
        Merged Map outputs=1
        GC time elapsed (ms)=41
        Total committed heap usage (bytes)=403800064
    Shuffle Errors
        BAD_ID=0
        CONNECTION=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0
    File Input Format Counters
        Bytes Read=147
    File Output Format Counters
        Bytes Written=34

نتایج در دایرکتوری خروجی ذخیره می شوند و با اجرای cat در فهرست خروجی قابل بررسی هستند:

cat ~/grep_example/*

 

Output

22    allowed.
1    allowed

وظیفه MapReduce 19 مورد از کلمه مجاز را پیدا کرد و سپس یک نقطه و یک مورد در جایی که نبود. اجرای برنامه نمونه تأیید می کند که نصب مستقل ما به درستی کار می کند و کاربران غیرمجاز در سیستم می توانند Hadoop را برای کاوش یا اشکال زدایی اجرا کنند.

نتیجه

در این آموزش، Hadoop را در حالت مستقل نصب کرده اید و با اجرای یک برنامه نمونه ارائه شده آن را تأیید کرده اید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/ 

برچسب‌ها:VPS یا سرور مجازیاتصال به سرور مجازی لینوکساجرای Hadoopپیکربندی جاواخرید سرور مجازیخرید سرور مجازی آمریکاراه اندازی اولیه سرورنصب Hadoopنصب سرور اوبونتو 20.04

  • behnam gol mohamadi