سرور مجازی

۱۵ مطلب در مهر ۱۴۰۰ ثبت شده است

  • ۰
  • ۰

نحوه نصب وب سرور Apache در اوبونتو 18.04

ورود به سایت

معرفی

سرور Apache HTTP پرکاربردترین وب سرور در جهان است. این ویژگی های قدرتمند بسیاری از جمله ماژول های قابل بارگذاری پویا ، پشتیبانی رسانه ای قوی و ادغام گسترده با سایر نرم افزارهای محبوب را ارائه می دهد.

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

پیش نیازها

قبل از شروع این راهنما ، باید یک کاربر معمولی و غیر روت با امتیازات sudo پیکربندی شده در سرور خود داشته باشید. علاوه بر این ، شما باید یک فایروال اساسی را فعال کنید تا پورت های غیر ضروری را مسدود کند. شما می توانید نحوه پیکربندی یک حساب کاربری معمولی و راه اندازی فایروال برای سرور خود را با پیروی از راهنمای راه اندازی اولیه سرور ما برای اوبونتو 18.04 بیاموزید.

هنگامی که یک حساب ایجاد کردید ، برای شروع به عنوان کاربر غیر ریشه خود وارد شوید.

مرحله 1 – نصب Apache

Apache در پیش فرض اوبونتو موجود است و امکان نصب آن را با استفاده از ابزارهای معمول مدیریت بسته فراهم می کند.

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

sudo apt update

سپس ، بسته apache2 را نصب کنید:

sudo apt install apache2

پس از تأیید نصب ، apt Apache و تمام وابستگی های مورد نیاز را نصب می کند.

مرحله 2 – تنظیم فایروال

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

در حین نصب ، Apache خود را با UFW ثبت می کند تا چند پروفایل برنامه را ارائه دهد که می توان از آنها برای فعال یا غیرفعال کردن دسترسی به Apache از طریق فایروال استفاده کرد.

با اجرای دستورات زیر پروفایل های برنامه ufw را لیست کنید

sudo ufw app list

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

 

Output

Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

این لیست نشان می دهد که سه نمایه برای Apache در دسترس است:

  • Apache: این نمایه فقط پورت 80 را باز می کند (ترافیک وب معمولی و رمزگذاری نشده)
  • Apache Full: این نمایه هم پورت 80 (ترافیک معمولی و رمزگذاری نشده وب) و هم پورت 443 (ترافیک رمزگذاری شده TLS/SSL) را باز می کند.
  • Apache Secure: این نمایه فقط پورت 443 را باز می کند (ترافیک رمزگذاری شده TLS/SSL)

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

sudo ufw allow ‘Apache’

با بررسی وضعیت ، این تغییر را تأیید کنید:

sudo ufw status

 

اکنون ترافیک مجاز HTTP در خروجی نمایش داده می شود:

 

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Apache                     ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Apache (v6)                ALLOW       Anywhere (v6)

 

اکنون پروفایل آپاچی فعال شده است تا دسترسی به سرور وب امکان پذیر باشد.

مرحله 3 – بررسی سرور وب خود

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

برای اطمینان از اینکه سرویس در حال اجرا است ، با سیستم systemd init تماس بگیرید:

sudo systemctl status apache2

 

Output

● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset:
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Tue 2021-09-28 16:52:56 UTC; 1min 14s ago
 Main PID: 9409 (apache2)
    Tasks: 55 (limit: 4915)
   CGroup: /system.slice/apache2.service
           ├─9409 /usr/sbin/apache2 -k start
           ├─9410 /usr/sbin/apache2 -k start
           └─9411 /usr/sbin/apache2 -k start

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

برای تأیید صحت عملکرد نرم افزار از طریق آدرس IP شما ، می توانید به صفحه فرود پیش فرض Apache دسترسی پیدا کنید. اگر آدرس IP سرور خود را نمی دانید ، می توانید آن را از چند طریق مختلف از خط فرمان دریافت کنید.

موارد زیر را در خط فرمان سرور خود اجرا کنید:

hostname -I

چند آدرس دریافت خواهید کرد که با فاصله خالی شده اند. می توانید هر کدام را در مرورگر وب خود امتحان کنید تا بررسی کنید که آیا کار می کنند یا خیر.

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

curl -4 icanhazip.com

وقتی آدرس IP سرور خود را دارید ، آن را در نوار آدرس مرورگر خود وارد کنید:

http://your_server_ip

شما باید صفحه وب پیش فرض Ubuntu 18.04 Apache را دریافت کنید:

این صفحه وب نشان می دهد که Apache به درستی کار می کند. همچنین شامل برخی اطلاعات اولیه در مورد فایل های مهم Apache و مکان های فهرست راهنما می باشد.

مرحله 4 – مدیریت فرایند آپاچی

اکنون که سرور وب خود را فعال کرده اید ، اجازه دهید برخی از دستورات اصلی مدیریت را مرور کنیم.

با دستور زیر می توانید وب سرور خود را متوقف کنید ::

sudo systemctl stop apache2

برای راه اندازی وب سرور در صورت توقف ، این دستور را اجرا کنید:

sudo systemctl start apache2

با اجرای موارد زیر می توانید سرویس را متوقف کرده و دوباره شروع کنید:

sudo systemctl restart apache2

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

sudo systemctl reload apache2

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

sudo systemctl disable apache2

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

sudo systemctl enable apache2

وقتی دوباره سرور بوت می شود ، Apache باید به طور خودکار شروع به کار کند.

مرحله 5 – راه اندازی میزبان مجازی (توصیه می شود)

نگام استفاده از سرور وب آپاچی ، می توانید از میزبان مجازی (مشابه بلوک سرور در Nginx) برای درج جزئیات پیکربندی و میزبانی بیش از یک دامنه از یک سرور استفاده کنید. برای مثال ما ، ما یک دامنه به نام your_domain ایجاد می کنیم ، اما شما باید این نام را با نام دامنه خود جایگزین کنید. برای کسب اطلاعات بیشتر در مورد تنظیم نام دامنه با DigitalOcean ، مقدمه ما بر DigitalOcean DNS را مطالعه کنید.

Apache در اوبونتو 18.04 دارای یک بلوک سرور به طور پیش فرض فعال است که برای ارائه اسناد از فهرست/var/www/html پیکربندی شده است. اگرچه این کار برای یک سایت واحد خوب عمل می کند ، اما اگر از چندین سایت میزبانی می کنید ، ممکن است مشکل باشد. به جای تغییر/var/www/html ، یک ساختار فهرست درون/var/www برای یک سایت your_domain ایجاد کنید ، در صورتی که درخواست مشتری با سایر موارد مطابقت نداشته باشد ،/var/www/html را به عنوان فهرست پیش فرض در محل قرار دهید. سایت های.

دایرکتوری مربوط به دامنه خود را به شرح زیر ایجاد کنید:

sudo mkdir /var/www/your_domain

سپس ، مالکیت دایرکتوری را با متغیر محیط USER $ تعیین کنید:

sudo chown -R $USER:$USER /var/www/your_domain

اگر مقدار ماسک خود را تغییر نداده اید ، مجوز ریشه های وب شما باید صحیح باشد ، اما می توانید با تایپ موارد زیر مطمئن شوید:

sudo chmod -R 755 /var/www/your_domain

سپس ، یک صفحه نمونه index.html با استفاده از nano یا ویرایشگر مورد علاقه خود ایجاد کنید:

nano /var/www/your_domain/index.html

داخل ، نمونه HTML زیر را اضافه کنید:

/var/www/your_domain/index.html

<html>
    <head>
        <title>Welcome to Your_domain!</title>
    </head>
    <body>
        <h1>Success!  The your_domain virtual host is working!</h1>
    </body>
</html>

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

برای اینکه Apache این محتوا را ارائه دهد ، لازم است یک فایل میزبان مجازی با دستورالعمل های صحیح ایجاد کنید. به جای تغییر فایل پیکربندی پیش فرض واقع در /etc/apache2/sites-available/000-default.conf ، یک فایل جدید در

/etc/apache2/sites-available/your_domain.conf:

sudo nano /etc/apache2/sites-available/your_domain.conf

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

/etc/apache2/sites-available/your_domain.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName your_domain
    ServerAlias www.your_domain
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

توجه داشته باشید که ما DocumentRoot را به فهرست جدید و ServerAdmin را به ایمیلی که سرپرست سایت your_domain می تواند به آن دسترسی داشته باشد ، به روز کرده ایم. ما همچنین دو دستورالعمل اضافه کرده ایم: ServerName ، که دامنه اصلی را که باید با این تعریف میزبان مجازی مطابقت داشته باشد ، ایجاد می کند ، و ServerAlias ، نامهای دیگری را که باید مطابق نام اصلی باشد مطابقت می دهد.

پس از اتمام کار فایل را ذخیره و ببندید.

بعد ، فایل را با ابزار a2ensite فعال کنید:

sudo a2ensite your_domain.conf

سایت پیش فرض تعریف شده در 000-default.conf را غیرفعال کنید:

sudo a2dissite 000-default.conf

اکنون خطاهای پیکربندی را آزمایش کنید:

sudo apache2ctl configtest

شما باید خروجی زیر را دریافت کنید:

 

Output

Syntax OK

برای پیاده سازی تغییرات ، Apache را مجدداً راه اندازی کنید:

sudo systemctl restart apache2

Apache اکنون باید نام دامنه شما را ارائه دهد. می توانید این مورد را با حرکت به آدرس http: // your_domain ، جایی که باید چیزی مانند موارد زیر دریافت کنید ، آزمایش کنید:

مرحله 6 – آشنایی با فایلها و فهرستهای مهم Apache

اکنون که می دانید چگونه سرویس Apache را مدیریت کنید ، باید چند دقیقه وقت بگذارید تا با چند دایرکتوری و فایل مهم آشنا شوید.

محتوا

  • /var/www/html: محتوای واقعی وب ، که به طور پیش فرض فقط شامل صفحه پیش فرض Apache است که قبلاً مشاهده کردید ، خارج از فهرست/var/www/html ارائه می شود. با تغییر پرونده های پیکربندی Apache می توانید این مورد را تغییر دهید.

پیکربندی سرور

  • /etc/apache2: فهرست پیکربندی Apache. همه فایلهای پیکربندی Apache در اینجا قرار دارند.
  • /etc/apache2/apache2.conf: فایل اصلی پیکربندی Apache است. این می تواند برای ایجاد تغییر در پیکربندی جهانی Apache اصلاح شود. این فایل مسئول بارگیری بسیاری از فایل های دیگر در فهرست پیکربندی است.
  • /etc/apache2/ports.conf: این فایل پورتهایی را که Apache به آنها گوش می دهد ، مشخص می کند. به طور پیش فرض ، هنگامی که ماژولی که قابلیت های SSL را فعال می کند ، آپاچی به پورت 80 گوش می دهد و همچنین به پورت 443 گوش می دهد.
  • /etc/apache2/sites-available/: دایرکتوری که میزبان مجازی هر سایت در آن ذخیره می شود. Apache از فایلهای پیکربندی موجود در این پوشه استفاده نمی کند مگر اینکه به فهرست راهنمای سایتها پیوند خورده باشد. به طور معمول ، تمام پیکربندی بلوک سرور در این فهرست انجام می شود و سپس با پیوند دادن به فهرست دیگر با دستور a2ensite فعال می شود.
  • /etc/apache2/sites-enabled/: دایرکتوری که میزبان مجازی هر سایت فعال در آن ذخیره می شود. به طور معمول ، اینها با پیوند دادن به فایلهای پیکربندی موجود در فهرست سایتهای موجود با a2ensite ایجاد می شوند. Apache فایلهای پیکربندی و پیوندهای موجود در این فهرست را هنگام شروع یا بارگیری مجدد برای کامپایل یک پیکربندی کامل می خواند.
  • /etc/apache2/conf-available/،/etc/apache2/conf-enabled/: این فهرستها همانند فهرستهای سایتهای موجود و سایتهای فعال هستند ، اما برای ذخیره قطعات پیکربندی که متعلق به یک میزبان مجازی فایل های موجود در فهرست conf-available را می توان با دستور a2enconf فعال کرد و با دستور a2disconf غیرفعال کرد.
  • /etc/apache2/mods-available/،/etc/apache2/mods-enabled/: این فهرستها به ترتیب شامل ماژولهای موجود و فعال هستند. فایل هایی که به .load ختم می شوند شامل قطعاتی برای بارگذاری ماژول های خاص هستند ، در حالی که فایل هایی که به .conf ختم می شوند حاوی پیکربندی آن ماژول ها هستند. ماژول ها را می توان با استفاده از دستورات a2enmod و a2dismod فعال و غیرفعال کرد.

Server Logs

  • /var/log/apache2/access.log: به طور پیش فرض ، هر درخواستی از سرور وب شما در این فایل لاگ ثبت می شود مگر اینکه Apache به گونه دیگری تنظیم شده باشد.
  • /var/log/apache2/error.log: به طور پیش فرض ، همه خطاها در این پرونده ثبت می شوند. دستورالعمل LogLevel در پیکربندی Apache مشخص می کند که چقدر شامل خطا خواهند داشت.

نتیجه

اکنون که وب سرور Apache خود را نصب کرده اید ، گزینه های زیادی برای نوع محتوا و سرویس هایی که می توانید برای ایجاد تجربه ای غنی تر استفاده کنید ، در اختیار دارید.

 

برچسب‌ها:

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب Nginx در اوبونتو 18.04

ورود به سایت

 

معرفی

Nginx یکی از محبوب ترین سرورهای وب در جهان است و وظیفه میزبانی برخی از بزرگترین و پر بازدیدترین سایت های اینترنتی را بر عهده دارد. در بیشتر موارد از Apache بیشتر منابع دوستانه است و می تواند به عنوان وب سرور یا پروکسی معکوس استفاده شود.

در این راهنما ، نحوه نصب Nginx را روی سرور Ubuntu 18.04 و فایل ها و فهرستهای مهم Nginx خواهید آموخت.

پیش نیازها

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

هنگامی که یک حساب کاربری در دسترس دارید ، برای شروع به عنوان کاربر غیر ریشه خود وارد شوید.

مرحله 1 – نصب Nginx

از آنجا که Nginx در  پیش فرض اوبونتو موجود است ، می توان پکیج مناسب  آن را نصب کرد.

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

sudo apt update
sudo apt install nginx

پس از قبول روند ، apt Nginx و هرگونه وابستگی مورد نیاز به سرور شما را نصب می کند.

مرحله 2 – تنظیم فایروال

قبل ازتست Nginx ، نرم افزار فایروال باید تنظیم شود تا دسترسی به سرویس امکان پذیر باشد. Nginx هنگام نصب خود را به عنوان یک سرویس با ufw ثبت می کند و دسترسی به Nginx را ساده می کند.

تنظیمات برنامه ای را که ufw نحوه کار با آنها را می داند ، با تایپ موارد زیر فهرست کنید:

sudo ufw app list

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

 

Output

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

این لیست سه نمایه موجود برای Nginx را نمایش می دهد:

  • Nginx Full: این نمایه هم پورت 80 (ترافیک معمولی و رمزگذاری نشده وب) و هم پورت 443 (ترافیک رمزگذاری شده TLS/SSL) را باز می کند.
  • Nginx HTTP: این نمایه فقط پورت 80 را باز می کند (ترافیک وب معمولی و رمزگذاری نشده)
  • Nginx HTTPS: این نمایه فقط پورت 443 را باز می کند (ترافیک رمزگذاری شده TLS/SSL)

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

با تایپ موارد زیر می توانید این مورد را فعال کنید:

sudo ufw allow ‘Nginx HTTP’

سپس ، تغییر را تأیید کنید:

sudo ufw status

شما باید لیستی از ترافیک HTTP مجاز در خروجی را دریافت کنید:

 

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

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

مرحله 3 – بررسی سرور وب خود

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

برای اطمینان از اینکه سرویس در حال اجرا است ، با سیستم systemd init تماس بگیرید:

systemctl status nginx

 

Output

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
   Active: active (running) since Fri 2021-10-01 21:36:15 UTC; 35s ago
     Docs: man:nginx(8)
 Main PID: 9039 (nginx)
    Tasks: 2 (limit: 1151)
   CGroup: /system.slice/nginx.service
           ├─9039 nginx: master process /usr/sbin/nginx -g daemon on; master_pro
           └─9041 nginx: worker process

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

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

سعی کنید موارد زیر را در خط فرمان سرور خود تایپ کنید:

ip addr show eth0 | grep inet | awk ‘{ print $2; }’ | sed ‘s/\/.*$//’

چند خط دریافت خواهید کرد. می توانید هر کدام را در مرورگر وب خود امتحان کنید که آیا کار می کند یا خیر.

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

curl -4 icanhazip.com

وقتی آدرس IP سرور خود را دارید ، آن را در نوار آدرس مرورگر خود وارد کنید:

http://your_server_ip

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

این صفحه شامل Nginx است تا از صحت عملکرد سرور اطمینان حاصل شود.

مرحله 4 – مدیریت فرایند Nginx

اکنون که سرور وب خود را فعال کرده اید ، اجازه دهید برخی از دستورات اصلی مدیریت را مرور کنیم.

برای توقف سرور وب ، موارد زیر را تایپ کنید:

sudo systemctl stop nginx

برای راه اندازی وب سرور در صورت توقف ، موارد زیر را تایپ کنید:

sudo systemctl start nginx

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

sudo systemctl restart nginx

اگر به سادگی تغییرات پیکربندی را انجام می دهید ، اغلب می توانید Nginx را بدون قطع اتصال به جای راه اندازی مجدد بارگیری مجدد کنید. برای این کار موارد زیر را تایپ کنید:

sudo systemctl reload nginx

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

sudo systemctl disable nginx

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

sudo systemctl enable nginx

هنگامی که سرور دوباره بوت می شود ، Nginx باید به طور خودکار شروع به کار کند.

مرحله 5 – راه اندازی بلوک های سرور (توصیه می شود)

هنگام استفاده از وب سرور Nginx ، می توان از بلوک های سرور (مشابه میزبان مجازی در Apache) برای درج جزئیات پیکربندی و میزبانی بیش از یک دامنه از یک سرور استفاده کرد. ما یک دامنه به نام your_domain ایجاد می کنیم ، اما شما باید نام دامنه خود را جایگزین آن کنید. برای کسب اطلاعات بیشتر در مورد تنظیم نام دامنه با vpsgol ، به مقدمه ما در vpsgol DNS مراجعه کنید.

Nginx در اوبونتو 18.04 دارای یک بلوک سرور است که به طور پیش فرض فعال است و پیکربندی شده است تا اسناد خارج از فهرست را در/var/www/html ارائه دهد. اگرچه این کار برای یک سایت واحد خوب عمل می کند ، اما اگر از چندین سایت میزبانی می کنید ، ممکن است مشکل باشد. به جای تغییر/var/www/html ، بیایید یک ساختار فهرست در/var/www برای سایت your_domain ایجاد کنیم ، در صورتی که درخواست مشتری با هیچ یک مطابقت نداشته باشد ،/var/www/html را به عنوان دایرکتوری پیش فرض در جای خود قرار دهیم.

با استفاده از پرچم -p برای ایجاد هر دایرکتوری اصلی لازم ، دایرکتوری را برای domain_s خود به شرح زیر ایجاد کنید:

sudo mkdir -p /var/www/your_domain/html

سپس ، مالکیت دایرکتوری را با متغیر محیط USER $ تعیین کنید:

sudo chown -R $USER:$USER /var/www/your_domain/html

اگر مقدار umask خود را تغییر نداده اید ، مجوز ریشه های وب شما باید صحیح باشد ، اما می توانید با تایپ موارد زیر مطمئن شوید:

sudo chmod -R 755 /var/www/your_domain

سپس ، یک صفحه نمونه index.html با استفاده از nano یا ویرایشگر مورد علاقه خود ایجاد کنید:

nano /var/www/your_domain/html/index.html

 

داخل ، نمونه HTML زیر را اضافه کنید:

/var/www/your_domain/html/index.html

<html>
    <head>
        <title>Welcome to your_domain!</title>
    </head>
    <body>
        <h1>Success! The your_domain server block is working!</h1>
    </body>
</html>

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

برای اینکه Nginx این محتوا را ارائه دهد ، لازم است یک بلوک سرور با دستورالعمل های صحیح ایجاد کنید. به جای تغییر مستقیم فایل پیکربندی پیش فرض ، یک فایل جدید در آدرس/etc/nginx/sites-available/your_domain قرار دهید:

sudo nano /etc/nginx/sites-available/your_domain

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

/etc/nginx/sites-available/your_domain

server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain.com www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

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

در مرحله بعد ، فایل را با ایجاد پیوندی از آن به فهرست راهنمای سایتها فعال کنید ، که Nginx هنگام راه اندازی آن را می خواند:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

دو بلوک سرور در حال حاضر فعال و پیکربندی شده است تا به درخواست ها بر اساس دستورات listen و server_name آنها پاسخ دهد (در مورد نحوه پردازش این دستورالعمل ها توسط Nginx در اینجا بیشتر بخوانید):

  • your_domain: به درخواست های مربوط به دامنه و www.your_domain شما پاسخ می دهد.
  • پیش فرض: به هرگونه درخواست در پورت 80 که با دو بلوک دیگر مطابقت ندارد پاسخ می دهد.

برای جلوگیری از مشکل احتمالی حافظه سطل هش که ممکن است از افزودن نام سرور اضافی بوجود آید ، لازم است یک مقدار واحد در فایل /etc/nginx/nginx.conf تنظیم شود. فایل را باز کنید:

sudo nano /etc/nginx/nginx.conf

دستور server_names_hash_bucket_size را پیدا کرده و علامت # را حذف کنید تا خط را کامنت نگذارید:

/etc/nginx/nginx.conf

...
http {
    ...
    server_names_hash_bucket_size 64;
    ...
}
...

پس از اتمام کار فایل را ذخیره و ببندید.

در مرحله بعد ، آزمایش کنید تا مطمئن شوید هیچ خطای نحوی در هیچ یک از فایل های Nginx شما وجود ندارد:

sudo nginx -t

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

sudo systemctl restart nginx

Nginx اکنون باید به نام دامنه شما خدمت کند. می توانید این مورد را با حرکت به http: // your_domain ، جایی که باید چیزی شبیه به این را مشاهده کنید ، آزمایش کنید:

مرحله 6 – آشنایی با فایلها و فهرستهای مهم Nginx

اکنون که می دانید چگونه سرویس Nginx را مدیریت کنید ، باید چند دقیقه وقت بگذارید تا با چند فهرست و فایل مهم آشنا شوید.

محتوا

  • /var/www/html: محتوای واقعی وب ، که به طور پیش فرض فقط شامل صفحه پیش فرض Nginx است که قبلاً مشاهده کردید ، از فهرست/var/www/html ارائه نمی شود. با تغییر پرونده های پیکربندی Nginx می توانید این مورد را تغییر دهید.

پیکربندی سرور

  • /etc/nginx: فهرست پیکربندی Nginx. همه فایلهای پیکربندی Nginx در اینجا قرار دارند.
  • /etc/nginx/nginx.conf: فایل اصلی پیکربندی Nginx. این می تواند برای ایجاد تغییر در پیکربندی جهانی Nginx اصلاح شود.
  • /etc/nginx/sites-available/: دایرکتوری ای که می توان بلوک های سرور هر سایت را در آن ذخیره کرد. Nginx از فایلهای پیکربندی موجود در این پوشه استفاده نمی کند مگر اینکه آنها به فهرست راهنمای سایتها پیوند خورده باشند. به طور معمول ، تمام پیکربندی بلوک سرور در این فهرست انجام می شود و سپس با پیوند دادن به فهرست دیگر فعال می شود.
  • /etc/nginx/sites-enabled/: دایرکتوری ای که بلوک های سرور فعال شده در سایت ذخیره می شوند. به طور معمول ، اینها با پیوند دادن به فایلهای پیکربندی موجود در فهرست سایتهای موجود ایجاد می شوند.
  • /etc/nginx/snippets: این فهرست شامل قطعات پیکربندی است که می توان آنها را در جاهای دیگر پیکربندی Nginx قرار داد. بخشهای پیکربندی به طور بالقوه قابل تکرار ، کاندیدهای خوبی برای تغییر شکل در قطعات هستند.

Server Logs

  • /var/log/nginx/access.log: هر درخواستی از سرور وب شما در این فایل لاگ ثبت می شود مگر اینکه Nginx به گونه دیگری پیکربندی شده باشد.
  • /var/log/nginx/error.log: هرگونه خطای Nginx در این گزارش ثبت می شود.

نتیجه

اکنون که سرور وب خود را نصب کرده اید ، گزینه های زیادی برای نوع محتوا برای ارائه و فناوری هایی که می خواهید برای ایجاد یک تجربه غنی تر استفاده کنید ، در اختیار دارید.

برچسب‌ها:Ubuntu 18.04اوبونتوخرید سرور مجازیسرور Nginxسرور Ubuntu 18.04سرور اوبونتو 18.04سرور لینوکسفروش سرورنصب Nginx

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب و پیکربندی VNC در اوبونتو 20.04

ورود به سایت

معرفی

Virtual Network Computing یا VNC یک سیستم اتصال است که به شما امکان می دهد از صفحه کلید و موس خود برای تعامل با محیط دسکتاپ گرافیکی در سرور راه دور استفاده کنید. مدیریت فایل ها ، نرم افزار و تنظیمات روی سرور از راه دور را برای کاربرانی که هنوز با خط فرمان راحت نیستند آسان می کند.

در این راهنما ، شما یک سرور VNC با TightVNC روی سرور اوبونتو 20.04 راه اندازی کرده و از طریق یک SSH tunnel به طور ایمن به آن متصل می شوید. سپس ، از یک برنامه سرویس گیرنده VNC در دستگاه محلی خود برای تعامل با سرور خود از طریق یک محیط رومیزی گرافیکی استفاده خواهید کرد.

پیش نیازها

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

  • یک سرور اوبونتو 20.04 با کاربر اداری غیر روت و فایروال با UFW پیکربندی شده است. برای تنظیم این ، راهنمای راه اندازی سرور اولیه ما برای اوبونتو 20.04 را دنبال کنید.
  • یک رایانه محلی با یک سرویس گیرنده VNC نصب شده است. سرویس گیرنده VNC که استفاده می کنید باید از اتصالات روی تونل های SSH پشتیبانی کند:
    • در Windows ، می توانید از TightVNC ، RealVNC یا UltraVNC استفاده کنید.
    • در macOS ، می توانید از برنامه Screen Sharing داخلی استفاده کنید یا می توانید از یک برنامه چند پلتفرمی مانند RealVNC استفاده کنید.
    • در لینوکس ، می توانید از بین بسیاری از گزینه ها ، از جمله vinagre ، krdc ، RealVNC یا TightVNC ، یکی را انتخاب کنید.

مرحله 1 – نصب محیط دسکتاپ و سرور VNC

به طور پیش فرض ، سرور اوبونتو 20.04 دارای محیط دسکتاپ گرافیکی یا سرور VNC نصب نیست ، بنابراین ابتدا با نصب آن شروع کنید.

هنگام انتخاب سرور VNC و محیط دسکتاپ ، گزینه های زیادی دارید. در این آموزش ، بسته هایی را برای آخرین محیط دسکتاپ Xfce و بسته TightVNC که از مخزن رسمی اوبونتو موجود است ، نصب می کنید. هر دو Xfce و TightVNC به دلیل سبک و سریع بودن معروف هستند ، که به اطمینان از صاف و پایدار بودن اتصال VNC حتی در اتصالات کندتر اینترنت کمک می کند.

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

sudo apt update

اکنون Xfce را به همراه بسته xfce4-goodies ، که شامل چند پیشرفت برای محیط دسکتاپ است ، نصب کنید:

sudo apt install xfce4 xfce4-goodies

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

پس از اتمام نصب ، سرور TightVNC را نصب کنید:

sudo apt install tightvncserver

در مرحله بعد ، دستور vncserver را برای تنظیم گذرواژه دسترسی VNC ، ایجاد فایلهای پیکربندی اولیه و شروع نمونه سرور VNC اجرا کنید:

vncserver

از شما خواسته می شود که رمز ورود را وارد کرده و برای دسترسی از راه دور به دستگاه خود تأیید کنید:

 

Output

You will require a password to access your desktops.

Password:
Verify:

رمز عبور باید بین شش تا هشت کاراکتر باشد. گذرواژه های بیش از 8 کاراکتر به طور خودکار کوتاه می شوند.

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

سپس این فرآیند فایلهای پیکربندی پیش فرض لازم و اطلاعات اتصال را برای سرور ایجاد می کند. علاوه بر این ، یک نمونه سرور پیش فرض را روی پورت 5901 راه اندازی می کند. این پورت پورت نمایش نامیده می شود و توسط VNC به عنوان: 1 شناخته می شود. VNC می تواند چندین نمونه را روی سایر پورت های نمایش نمایش دهد ، از جمله: 2 مورد اشاره به پورت 5902 ،: 3 اشاره به 5903 و موارد دیگر:

 

Output

Would you like to enter a view-only password (y/n)? n
xauth:  file /home/sammy/.Xauthority does not exist

New 'X' desktop is your_hostname:1

Creating default startup script /home/sammy/.vnc/xstartup
Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log

 

توجه داشته باشید که اگر می خواهید گذرواژه خود را تغییر دهید یا گذرواژه فقط برای مشاهده اضافه کنید ، می توانید این کار را با دستور vncpasswd انجام دهید:

vncpasswd

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

مرحله 2 – پیکربندی سرور VNC

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

دستوراتی که سرور VNC هنگام راه اندازی اجرا می کند در یک فایل پیکربندی به نام xstartup در پوشه .vnc زیر فهرست اصلی شما قرار دارد. اسکریپت راه اندازی زمانی ایجاد شد که دستور vncserver را در مرحله قبل اجرا کردید ، اما برای راه اندازی دسکتاپ Xfce خود برنامه خود را ایجاد می کنید.

از آنجا که قصد دارید نحوه تنظیم سرور VNC را تغییر دهید ، ابتدا نمونه سرور VNC را که در پورت 5901 اجرا می شود با دستور زیر متوقف کنید:

vncserver -kill :1

خروجی به این شکل خواهد بود ، اگرچه PID متفاوتی را مشاهده خواهید کرد:

 

Output

Killing Xtightvnc process ID 17648

قبل از اینکه فایل xstartup را اصلاح کنید ، از نسخه اصلی نسخه پشتیبان تهیه کنید:

mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

حالا یک فایل xstartup جدید ایجاد کنید و آن را در ویرایشگر متن مانند nano باز کنید:

nano ~/.vnc/xstartup

سپس خطوط زیر را به فایل اضافه کنید:

~/.vnc/xstartup

#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

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

اولین فرمان در فایل ، xrdb $ HOME/.Xresources ، به چارچوب GUI VNC می گوید که فایل .Xresources کاربر سرور را بخواند. .Xresources جایی است که کاربر می تواند در تنظیمات خاصی از دسکتاپ گرافیکی ، مانند رنگ های ترمینال ، تم مکان نما و ارائه فونت تغییراتی ایجاد کند. دستور دوم به سرور می گوید که Xfce را راه اندازی کند. هر زمان که سرور VNC را راه اندازی یا راه اندازی مجدد کنید ، این دستورات به طور خودکار اجرا می شوند.

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

برای اطمینان از اینکه سرور VNC قادر خواهد بود از این فایل راه اندازی جدید به درستی استفاده کند ، باید آن را اجرایی کنید:

chmod +x ~/.vnc/xstartup

سپس سرور VNC را راه اندازی مجدد کنید:

vncserver -localhost

توجه داشته باشید که این بار این فرمان شامل گزینه -localhost است که سرور VNC را به رابط loopback سرور شما متصل می کند. این باعث می شود VNC فقط به اتصالات منشاء شده از سروری که روی آن نصب شده است اجازه دهد.

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

خروجی مشابه این را خواهید دید:

 

Output

New 'X' desktop is your_hostname:1

Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log

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

مرحله 3 – اتصال ایمن به دسکتاپ VNC

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

یک اتصال SSH روی رایانه محلی خود ایجاد کنید که به طور ایمن به اتصال localhost برای VNC ارسال می شود. می توانید این کار را از طریق ترمینال در لینوکس یا macOS با دستور ssh زیر انجام دهید:

ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

در اینجا منظور از گزینه های این دستور ssh است:

  • -L 59000: localhost: 5901: سوئیچ -L مشخص می کند که پورت داده شده در رایانه محلی (59000) باید به میزبان و پورت داده شده در سرور مقصد ارسال شود (localhost: 5901 ، یعنی پورت 5901 در سرور مقصد ، به عنوان your_server_ip) تعریف شده است. توجه داشته باشید که پورت محلی که مشخص کرده اید تا حدودی دلخواه است. تا زمانی که پورت قبلاً به سرویس دیگری متصل نشده باشد ، می توانید از آن به عنوان پورت حمل و نقل تونل خود استفاده کنید.
  • -C: این پرچم فشرده سازی را فعال می کند که می تواند به حداقل رساندن مصرف منابع و سرعت بخشیدن به کارها کمک کند.
  • -N: این گزینه به ssh می گوید که نمی خواهید هیچ دستور از راه دور را اجرا کنید. این تنظیم زمانی مفید است که فقط بخواهید پورت ها را به جلو ارسال کنید.
  • -l sammy your_server_ip: سوئیچ -l به شما اجازه می دهد تا زمانی که به سرور متصل می شوید ، کاربری را که می خواهید وارد آن شوید ، مشخص کنید. اطمینان حاصل کنید که نام کاربر غیر ریشه و آدرس IP سرور خود را جایگزین sammy و your_server_ip کنید.

اگر از PuTTY برای اتصال به سرور خود استفاده می کنید ، می توانید با کلیک راست روی نوار بالای پنجره ترمینال و سپس کلیک روی گزینه Change Settings … یک تونل SSH ایجاد کنید:

شاخه Connection را در منوی درخت در سمت چپ پنجره PuTTY Reconfiguration پیدا کنید. شاخه SSH را گسترش دهید و بر روی Tunnels کلیک کنید. در گزینه های کنترل کننده صفحه نمایش حمل و نقل SSH ، 59000 را به عنوان منبع و localhost: 5901 را به عنوان مقصد وارد کنید ، مانند این:

سپس روی دکمه افزودن و سپس روی دکمه اعمال برای پیاده سازی تونل کلیک کنید.

پس از اجرای tunnel ، از یک سرویس گیرنده VNC برای اتصال به localhost استفاده کنید: 59000. از شما خواسته می شود با استفاده از گذرواژه ای که در مرحله 1 تنظیم کرده اید ، احراز هویت کنید.

پس از اتصال ، دسکتاپ پیش فرض Xfce را مشاهده خواهید کرد. باید چیزی شبیه به این باشد:

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

CTRL+C را در local terminal خود فشار دهید تا SSH tunnel متوقف شود و به درخواست خود بازگردید. با این کار جلسه VNC شما نیز قطع می شود.

اکنون می توانید سرور VNC خود را پیکربندی کنید تا به عنوان یک سرویس systemd اجرا شود.

مرحله 4 – اجرای VNC به عنوان سرویس سیستم

با راه اندازی سرور VNC به عنوان سرویس systemd ، می توانید آن را مانند هر سرویس دیگری شروع ، متوقف و راه اندازی مجدد کنید. همچنین می توانید از دستورات مدیریت systemd استفاده کنید تا مطمئن شوید VNC هنگام بوت شدن سرور شما شروع به کار می کند.

ابتدا یک فایل واحد جدید به نام /etc/systemd/system/vncserver@.service ایجاد کنید:

sudo nano /etc/systemd/system/vncserver@.service

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

خطوط زیر را به فایل اضافه کنید. مطمئن شوید که مقدار User، Group ، WorkingDirectory و نام کاربری را در مقدار PIDFILE تغییر دهید تا با نام کاربری شما مطابقت داشته باشد:

/etc/systemd/system/vncserver@.service

[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=sammy
Group=sammy
WorkingDirectory=/home/sammy

PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

دستور ExecStartPre اگر VNC در حال اجرا است متوقف می کند. فرمان ExecStart VNC را راه اندازی می کند و عمق رنگ را با رنگ 24 بیت با وضوح 1280×800 تنظیم می کند. همچنین می توانید این گزینه های راه اندازی را برای رفع نیازهای خود تغییر دهید. همچنین ، توجه داشته باشید که دستور ExecStart مجدداً شامل گزینه -localhost است.

ذخیره کنید و فایل را ببندید.

در مرحله بعد ، سیستم را از فایل واحد جدید آگاه کنید:

sudo systemctl daemon-reload

فایل واحد را فعال کنید:

sudo systemctl enable vncserver@1.service

1 زیر علامت @ نشان می دهد که سرویس باید در کدام صفحه نمایش ظاهر شود ، در این حالت پیش فرض: 1 همانطور که در مرحله 2 مورد بحث قرار گرفت.

اگر سرور VNC هنوز در حال اجرا است ، نمونه فعلی آن را متوقف کنید:

vncserver -kill :1

سپس آن را مانند هر سرویس systemd دیگری شروع کنید:

sudo systemctl start vncserver@1

می توانید تأیید کنید که با این دستور شروع شده است:

sudo systemctl status vncserver@1

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

 

Output

● vncserver@1.service - Start TightVNC server at startup
     Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-05-07 17:23:50 UTC; 6s ago
    Process: 39768 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2)
    Process: 39772 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS)
   Main PID: 39795 (Xtightvnc)
...

سرور VNC شما اکنون آماده استفاده در زمان بالا آمدن سرور شما است و شما می توانید آن را با دستورات systemctl مانند سایر سرویس های systemd مدیریت کنید.

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

ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

سپس با استفاده از نرم افزار سرویس گیرنده VNC خود به localhost یک اتصال جدید ایجاد کنید: 59000 برای اتصال به سرور خود.

نتیجه

شما اکنون یک سرور VNC ایمن دارید که روی سرور اوبونتو 20.04 شما اجرا می شود. اکنون می توانید فایل ها ، نرم افزار و تنظیمات خود را با یک رابط گرافیکی کاربرپسند مدیریت کنید و می توانید نرم افزارهای گرافیکی مانند مرورگرهای وب را از راه دور اجرا کنید.

 

برچسب‌ها:

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه به اشتراک گذاری داده ها بین Docker Container و Host

ورود به سایت

معرفی

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

از حجم های Docker می توان برای اشتراک فایل بین سیستم host و Docker container استفاده کرد. به عنوان مثال ، فرض کنید شما می خواهید از تصویر رسمی Docker Nginx استفاده کنید و یک کپی دائمی از پرونده های log Nginx برای تجزیه و تحلیل بعدی نگه دارید. به طور پیش فرض ، تصویر nginx Docker به پوشه/var/log/nginx داخل Docker Nginx container وارد می شود. به طور معمول از طریق سیستم فایل میزبان قابل دسترسی نیست.

در این آموزش ، نحوه دسترسی داده ها از Docker containers به دستگاه host را بررسی می کنیم.

پیش نیازها

برای پیگیری این مقاله ، به یک سرور اوبونتو 18.04 با موارد زیر نیاز دارید:

  • یک non-root user با امتیازات sudo ، به دنبال راه اندازی سرور اولیه با راهنمای اوبونتو 18.04.
  • Docker با دستورالعمل های مرحله 1 و مرحله 2 نحوه نصب و استفاده از Docker در اوبونتو 18.04 نصب شده است.

اگر با Docker تازه کار هستید ، سری Docker Ecosystem نمای کلی مفاهیم کلیدی را ارائه می دهد.

مرحله 1 – اتصال حجم

دستور زیر یک پوشه به نام nginxlogs در فهرست اصلی کاربر فعلی شما ایجاد کرده و آن را به/var/log/nginx در ظرف متصل می کند:

docker run –name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx

بیایید کمی وقت بگذاریم تا این دستور را با جزئیات بررسی کنیم:

  • –name = nginx ، container را نامگذاری می کند تا بتوانیم راحت تر به آن مراجعه کنیم.
  • -d فرآیند را جدا کرده و در پس زمینه اجرا می کند. در غیر این صورت ، ما فقط یک پیام خالی Nginx را مشاهده می کنیم و تا زمانی که Nginx را نکشیم ، نمی توانیم از این ترمینال استفاده کنیم.
  • v ~/nginxlogs:/var/log/nginx یک حجم bindmount ایجاد می کند که فهرست/var/log/nginx را از داخل ظرف Nginx به فهرست ~/nginxlogs در دستگاه میزبان پیوند می دهد. داکر از a: برای تقسیم مسیر میزبان از مسیر ظرف استفاده می کند و مسیر میزبان همیشه اول است.
  • -p 5000: 80 یک پورت رو به جلو ایجاد می کند. Nginx container به طور پیش فرض روی پورت 80 گوش می دهد. این پرچم پورت ظرف 80 را به پورت 5000 در سیستم میزبان ترسیم می کند.
  • nginx مشخص می کند که container باید از تصویر Nginx ساخته شود ، که دستور nginx -g “daemon off” را برای شروع Nginx صادر می کند.

مرحله 2 – دسترسی به داده ها در میزبان

ما در حال حاضر یک نسخه از Nginx را داریم که در داخل Docker container روی دستگاه ما اجرا می شود و پورت 5000 دستگاه میزبان ما مستقیماً به آن نسخه از پورت 80 Nginx ترسیم می شود.

آدرس را در مرورگر وب با استفاده از آدرس IP یا نام میزبان سرور خود و شماره پورت بارگذاری کنید: http: // your_server_ip: 5000. باید ببینی:

جالبتر اینکه اگر در فهرست ~/nginxlogs در host جستجو کنیم ، access.log ایجاد شده توسط container’s nginx را مشاهده می کنیم که درخواست ما را نشان می دهد:

cat ~/nginxlogs/access.log

این باید چیزی شبیه به این نشان دهد:

 

Output

203.0.113.0 - - [11/Jul/2018:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-"
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"

در صورت ایجاد هرگونه تغییر در پوشه ~/nginxlogs ، می توانید آنها را از داخل Docker container در زمان واقعی نیز مشاهده کنید.

نتیجه

در این آموزش ما نحوه ایجاد یک حجم داده Docker برای به اشتراک گذاری اطلاعات بین یک container و سیستم host file را نشان دادیم. این در محیط های توسعه مفید است ، جایی که برای اشکال زدایی دسترسی به گزارش ها ضروری است. برای کسب اطلاعات بیشتر در مورد به اشتراک گذاری داده های مداوم بین ظروف ، به نحوه اشتراک گذاری داده ها بین Docker Containers نگاه کنید.

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه یک ماژول سفارشی Terraform بسازیم

ورود به سایت

معرفی

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

در این آموزش ، ماژول Terraform را ایجاد می کنید که چندین قطره را در پشت Load Balancer برای افزونگی راه اندازی می کند. شما همچنین از ویژگی های for_each و count حلقه زبان پیکربندی Hashicorp (HCL) برای استقرار چندین نمونه سفارشی ماژول به طور همزمان استفاده خواهید کرد.

ساختار و مزایای ماژول

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

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

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

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

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

سپس ماژول ها را در پروژه های Terraform خود تعریف ، استفاده و سفارشی کنید.

ایجاد یک ماژول

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

ماژول را در دایرکتوری به نام droplet-lb ، در زیر دایرکتوری به نام modules ذخیره می کنید. با فرض اینکه در فهرست راهنمای terraform-modules که به عنوان بخشی از پیش نیازها ایجاد کرده اید هستید ، هر دو را همزمان اجرا کنید:

mkdir -p modules/droplet-lb

آرگومان -p به mkdir دستور می دهد تا همه دایرکتوری ها را در مسیر ارائه شده ایجاد کند.

به آن بروید:

cd modules/droplet-lb

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

متغیرهای تعریف شده در یک ماژول به عنوان ورودی های آن نشان داده می شوند و می توانند در تعاریف منابع برای سفارشی سازی آنها استفاده شوند. ماژولی که ایجاد می کنید دارای دو ورودی است: تعداد Droplets برای ایجاد و نام گروه آنها. ایجاد و باز کردن برای ویرایش فایلی به نام variables.tf که در آن متغیرها را ذخیره می کنید:

nano variables.tf

خطوط زیر را اضافه کنید:

modules/droplet-lb/variables.tf

variable "droplet_count" {}
variable "group_name" {}

ذخیره کنید و فایل را ببندید.

شما تعریف Droplet را در فایلی با نام droplets.tf ذخیره خواهید کرد. ایجاد و باز کردن آن برای ویرایش:

nano droplets.tf

خطوط زیر را اضافه کنید:

modules/droplet-lb/droplets.tf

resource "vpsgol_droplet" "droplets" {
  count  = var.droplet_count
  image  = "ubuntu-20-04-x64"
  name   = "${var.group_name}-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

برای پارامتر count که مشخص می کند چند نمونه از منبع را ایجاد کنید ، از متغیر droplet_count استفاده می کنید. مقدار آن زمانی مشخص می شود که ماژول از کد اصلی پروژه فراخوانی شود. نام هر یک از Droplets های مستقر متفاوت خواهد بود ، که با افزودن فهرست قطره فعلی به نام گروه ارائه شده ، به آن می رسید. استقرار Droplets در منطقه fra1 خواهد بود و اوبونتو 20.04 را اجرا خواهند کرد.

پس از اتمام کار ، فایل را ذخیره و ببندید.

با Droplets که اکنون تعریف شده است ، می توانید به ایجاد Load Balancer بروید. شما تعریف منابع آن را در فایلی با نام lb.tf ذخیره خواهید کرد. با اجرای آن ، آن را برای ویرایش ایجاد کرده و باز کنید:

nano lb.tf

تعریف منابع آن را اضافه کنید:

modules/droplet-lb/lb.tf

resource "vpsgol_loadbalancer" "www-lb" {
  name   = "lb-${var.group_name}"
  region = "fra1"

  forwarding_rule {
    entry_port     = 80
    entry_protocol = "http"

    target_port     = 80
    target_protocol = "http"
  }

  healthcheck {
    port     = 22
    protocol = "tcp"
  }

  droplet_ids = [
    for droplet in vpsgol_droplet.droplets:
      droplet.id
  ]
}

شما Load Balancer را با نام گروه در نام آن تعریف می کنید تا قابل تشخیص باشد. شما آن را به همراه Droplets در منطقه fra1 مستقر می کنید. دو بخش بعدی پورت ها و پروتکل های هدف و نظارت را مشخص می کند.

بلوک droplet_ids برجسته ، شناسه Droplets را که باید توسط Load Balancer مدیریت شود ، می گیرد. از آنجا که چند قطره وجود دارد ، و تعداد آنها از قبل مشخص نیست ، شما از حلقه for برای عبور از مجموعه Droplets (vpsgol_droplet.droplets) و گرفتن شناسه آنها استفاده می کنید. شما حلقه for را با پرانتز ([]) احاطه می کنید تا مجموعه حاصل یک لیست باشد.

اکنون Droplet ، Load Balancer و متغیرها را برای ماژول خود تعریف کرده اید. شما باید الزامات ارائه دهنده را مشخص کنید ، مشخص کنید که ماژول از کدام ارائه دهندگان استفاده می کند ، از جمله نسخه آنها و جایی که آنها واقع شده اند. از آنجا که Terraform 0.13 است ، ماژول ها باید به صراحت منابع ارائه دهندگان غیر Hashicorp مورد استفاده خود را مشخص کنند. این به این دلیل است که آنها آنها را از پروژه اصلی به ارث نمی برند.

الزامات ارائه دهنده را در فایلی با نام provider.tf ذخیره خواهید کرد. با اجرای آن آن را برای ویرایش ایجاد کنید:

nano provider.tf

ماژول ها همچنین از خروجی ها پشتیبانی می کنند که می توانید از آنها برای استخراج اطلاعات داخلی در مورد وضعیت منابع خود استفاده کنید. شما یک خروجی تعریف می کنید که آدرس IP Load Balancer را نشان می دهد و آن را در فایلی با نام outputs.tf ذخیره می کنید. آن را برای ویرایش ایجاد کنید:

nano outputs.tf

تعریف زیر را اضافه کنید:

modules/droplet-lb/outputs.tf

output "lb_ip" {
  value = vpsgol_loadbalancer.www-lb.ip
}

این خروجی آدرس IP Load Balancer را بازیابی می کند. ذخیره کنید و فایل را ببندید.

ماژول droplet-lb از لحاظ عملکردی کامل است و آماده استقرار است. شما آن را از کد اصلی ، که در ریشه پروژه ذخیره می کنید ، صدا می زنید. ابتدا ، با دوبار بالا رفتن از فهرست پرونده خود به آن بروید:

cd ../..

سپس ، برای ویرایش فایلی به نام main.tf ایجاد و باز کنید ، که در آن از ماژول استفاده می کنید:

nano main.tf

خطوط زیر را اضافه کنید:

main.tf

module "groups" {
  source = "./modules/droplet-lb"

  droplet_count = 3
  group_name    = "group1"
}

output "loadbalancer-ip" {
  value = module.groups.lb_ip
}

در این اعلان ماژول droplet-lb را که در فهرست راهنمای تعیین شده به عنوان منبع قرار دارد فرا می خوانید. شما ورودی ارائه شده ، droplet_count و group_name را که روی group1 تنظیم شده است پیکربندی می کنید تا بعداً بتوانید بین نمونه ها تشخیص دهید.

از آنجا که خروجی IP Load Balancer در یک ماژول تعریف شده است ، هنگام اعمال پروژه به طور خودکار نشان داده نمی شود. راه حل این مسئله ایجاد خروجی دیگری است که مقدار آن را بازیابی می کند (loadbalancer_ip). پس از اتمام کار فایل را ذخیره و ببندید.

با راه اندازی اولیه ماژول را راه اندازی کنید:

terraform init

خروجی به صورت زیر خواهد بود:

 

Output

Initializing modules...
- groups in modules/droplet-lb

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of vpsgol/vpsgol from the dependency lock file
- Using previously-installed vpsgol/vpsgol v2.10.1

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

می توانید برنامه ریزی پروژه را امتحان کنید تا ببینید Terraform با اجرای چه اقداماتی انجام می دهد:

terraform plan -var “do_token=${DO_PAT}”

خروجی مشابه این خواهد بود:

 

Output

...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.groups.vpsgol_droplet.droplets[0] will be created
  + resource "vpsgol_droplet" "droplets" {
...
      + name                 = "group1-0"
...
    }

  # module.groups.vpsgol_droplet.droplets[1] will be created
  + resource "vpsgol_droplet" "droplets" {
...
      + name                 = "group1-1"
...
    }

  # module.groups.vpsgol_droplet.droplets[2] will be created
  + resource "vpsgol_droplet" "droplets" {
...
      + name                 = "group1-2"
...
    }

  # module.groups.vpsgol_loadbalancer.www-lb will be created
  + resource "vpsgol_loadbalancer" "www-lb" {
...
      + name                     = "lb-group1"
...
    }

Plan: 4 to add, 0 to change, 0 to destroy.
...

این خروجی نشان می دهد که Terraform سه قطره ایجاد می کند ، به نام های group1-0 ، group1-1 و group1-2 ، و همچنین یک Load Balancer به نام group1-lb ایجاد می کند ، که ترافیک به سه قطره را از و خارج مدیریت می کند.

با اجرای پروژه می توانید پروژه را روی ابر اعمال کنید:

terraform apply -var “do_token=${DO_PAT}”

در صورت درخواست بله را وارد کنید. خروجی تمام اقدامات را نشان می دهد و آدرس IP Load Balancer نیز نشان داده می شود:

 

Output

module.groups.vpsgol_droplet.droplets[1]: Creating...
module.groups.vpsgol_droplet.droplets[0]: Creating...
module.groups.vpsgol_droplet.droplets[2]: Creating...
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Outputs:

loadbalancer-ip = ip_address

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

terraform destroy -var “do_token=${DO_PAT}”

در صورت درخواست بله را وارد کنید. خروجی به این صورت خاتمه می یابد:

 

Output

...
Destroy complete! Resources: 4 destroyed.

در این مرحله ، ماژولی ایجاد کرده اید که شامل تعدادی Droplets و Load Balancer است که به طور خودکار برای مدیریت ترافیک ورودی و خروجی آنها پیکربندی می شود. اکنون می توانید چندین نمونه از یک ماژول را از یک کد با استفاده از for_each و count استفاده کنید.

استقرار موارد متعدد ماژول

در این بخش ، از count و for_each برای استقرار چندین بار ماژول droplet-lb ، با سفارشی سازی استفاده خواهید کرد.

با استفاده از شمارش

یک راه برای استقرار چند نمونه از یک ماژول به طور همزمان این است که تعداد آنها را به پارامتر count منتقل کنید ، که به طور خودکار برای هر ماژول در دسترس است. main.tf را برای ویرایش باز کنید:

nano main.tf

با حذف تعریف خروجی موجود ، آن را به شکل زیر تغییر دهید:

main.tf

module "groups" {
  source = "./modules/droplet-lb"

  count  = 3

  droplet_count = 3
  group_name    = "group1-${count.index}"
}

با تنظیم شمارش روی 3 ، به Terraform دستور می دهید که ماژول را سه بار ، هر کدام با نام گروهی متفاوت ، مستقر کند. پس از اتمام کار ، فایل را ذخیره و ببندید.

برنامه ریزی استقرار با اجرای:

terraform plan -var “do_token=${DO_PAT}”

خروجی طولانی خواهد بود و به شکل زیر خواهد بود:

 

Output

...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.groups[0].vpsgol_droplet.droplets[0] will be created
...
  # module.groups[0].vpsgol_droplet.droplets[1] will be created
...
  # module.groups[0].vpsgol_droplet.droplets[2] will be created
...
  # module.groups[0].vpsgol_loadbalancer.www-lb will be created
...
  # module.groups[1].vpsgol_droplet.droplets[0] will be created
...
  # module.groups[1].vpsgol_droplet.droplets[1] will be created
...
  # module.groups[1].vpsgol_droplet.droplets[2] will be created
...
  # module.groups[1].vpsgol_loadbalancer.www-lb will be created
...
  # module.groups[2].vpsgol_droplet.droplets[0] will be created
...
  # module.groups[2].vpsgol_droplet.droplets[1] will be created
...
  # module.groups[2].vpsgol_droplet.droplets[2] will be created
...
  # module.groups[2].vpsgol_loadbalancer.www-lb will be created
...

Plan: 12 to add, 0 to change, 0 to destroy.
...

Terraform در خروجی توضیح می دهد که هر یک از سه نمونه ماژول دارای سه Droplet و Load Balancer مربوط به آنها خواهد بود.

استفاده از for_each

هنگامی که به سفارشی سازی پیچیده تر نیاز دارید ، یا زمانی که تعداد موارد به داده های شخص ثالث (اغلب به صورت نقشه ارائه می شود) که هنگام نوشتن کد مشخص نیست ، می توانید از for_each برای ماژول ها استفاده کنید.

اکنون نقشه ای را تعریف می کنید که نام گروه ها را با تعداد Droplet جفت می کند و موارد قطره ای-lb را مطابق آن مستقر می کند. main.tf را برای ویرایش با اجرا باز کنید:

nano main.tf

فایل را اصلاح کنید تا به این شکل درآید:

main.tf

variable "group_counts" {
  type    = map
  default = {
    "group1" = 1
    "group2" = 3
  }
}

module "groups" {
  source   = "./modules/droplet-lb"
  for_each = var.group_counts

  droplet_count = each.value
  group_name    = each.key
}

شما ابتدا نقشه ای به نام group_counts تعریف می کنید که حاوی چند قطره است که یک گروه معین باید داشته باشد. سپس ، ماژول droplet-lb را فرا می خوانید ، اما مشخص می کنید که حلقه for_each باید در var.group_counts ، نقشه ای که قبلاً تعریف کرده اید ، عمل کند. droplet_count each.value ، مقدار جفت فعلی ، که تعداد Droplets برای گروه فعلی است را می گیرد. group_name نام گروه را دریافت می کند.

پس از اتمام کار فایل را ذخیره و ببندید.

سعی کنید پیکربندی را با اجرای زیر اعمال کنید:

terraform plan -var “do_token=${DO_PAT}”

در خروجی اقدامات Terraform برای ایجاد دو گروه با Droplets و Load Balancers خود شرح داده می شود:

 

Output

...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.groups["group1"].vpsgol_droplet.droplets[0] will be created
...
  # module.groups["group1"].vpsgol_loadbalancer.www-lb will be created
...
  # module.groups["group2"].vpsgol_droplet.droplets[0] will be created
...
  # module.groups["group2"].vpsgol_droplet.droplets[1] will be created
...
  # module.groups["group2"].vpsgol_droplet.droplets[2] will be created
...
  # module.groups["group2"].vpsgol_loadbalancer.www-lb will be created
...

در این مرحله ، شما از count و for_each برای استقرار چندین نمونه سفارشی از یک ماژول از یک کد استفاده کرده اید.

نتیجه

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از رابط ها در TypeScript

ورود به سایت

معرفی

TypeScript افزونه ای از زبان جاوا اسکریپت است که از زمان اجرای جاوا اسکریپت با یک نوع تایپ کننده زمان کامپایل استفاده می کند.

TypeScript روش های متعددی را برای نمایش اشیاء در کد شما ارائه می دهد که یکی از آنها استفاده از رابط ها است. رابط های موجود در TypeScript دو ​​سناریو استفاده دارند: می توانید قراردادی ایجاد کنید که کلاسها باید از آن پیروی کنند ، مانند اعضایی که آن کلاسها باید اجرا کنند ، و همچنین می توانید انواع را در برنامه خود نشان دهید ، درست مانند اعلان نوع معمولی. (برای اطلاعات بیشتر در مورد انواع ، نحوه استفاده از انواع اصلی در TypeScript و نحوه ایجاد انواع سفارشی در TypeScript را بررسی کنید.)

ممکن است توجه داشته باشید که رابط ها و انواع دارای مجموعه ای از ویژگی های مشابه هستند. در واقع ، تقریباً همیشه می توان یکی را جایگزین دیگری کرد. تفاوت اصلی این است که رابط ها ممکن است بیش از یک اعلان برای یک رابط داشته باشند ، که TypeScript ادغام می شود ، در حالی که انواع را فقط یک بار می توان اعلام کرد. همچنین می توانید از انواع برای ایجاد نام مستعار از انواع اولیه (مانند رشته و بولی) استفاده کنید ، که رابط ها نمی توانند انجام دهند.

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

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

پیش نیازها

برای پیگیری این آموزش ، شما نیاز دارید:

  • محیطی که در آن می توانید برنامه های TypeScript را اجرا کنید تا همراه با مثال ها دنبال کنید. برای تنظیم این دستگاه در دستگاه محلی خود ، به موارد زیر نیاز دارید.
    • هر دو Node و npm (یا نخ) به منظور اجرای یک محیط توسعه که بسته های مربوط به TypeScript را مدیریت می کند ، نصب شده است. این آموزش با Node.js نسخه 14.3.0 و npm نسخه 6.14.5 آزمایش شده است. برای نصب روی macOS یا اوبونتو 18.04 ، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی در macOS یا قسمت Installing using a PPA از نحوه نصب Node.js در اوبونتو 18.04 را دنبال کنید. اگر از زیر سیستم Windows برای Linux (WSL) استفاده می کنید ، این نیز کار می کند.
    • علاوه بر این ، به TypeScript Compiler (tsc) نصب شده بر روی دستگاه خود نیاز دارید.
  • شما به دانش کافی از جاوا اسکریپت ، به ویژه نحو ES6+ ، مانند تخریب ، عملگرهای استراحت و واردات/صادرات نیاز دارید. اگر به اطلاعات بیشتری در مورد این موضوعات نیاز دارید ، خواندن نحوه کدگذاری در سری JavaScript توصیه می شود.
  • این آموزش به جنبه های ویرایشگرهای متنی که از TypeScript پشتیبانی می کنند اشاره می کند و خطاهای خطی را نشان می دهد. این برای استفاده از TypeScript ضروری نیست ، اما از ویژگیهای TypeScript بیشتر استفاده می کند. برای بهره مندی از این موارد ، می توانید از ویرایشگر متنی مانند Visual Studio Code استفاده کنید که از TypeScript پشتیبانی کامل دارد. همچنین می توانید این مزایا را در TypeScript Playground امتحان کنید.

همه نمونه های نشان داده شده در این آموزش با استفاده از TypeScript نسخه 4.2.2 ایجاد شده است.

ایجاد و استفاده از رابط ها در TypeScript

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

رابط ها در TypeScript با استفاده از کلید واژه رابط و سپس نام رابط و سپس یک بلوک {} با بدنه رابط ایجاد می شوند. به عنوان مثال ، در اینجا یک رابط Logger است:

interface Logger {
  log: (message: string) => void;
}

مشابه ایجاد یک نوع معمولی با استفاده از اعلان نوع ، فیلدهای نوع و نوع آنها را در {} مشخص می کنید:

interface Logger {
  log: (message: string) => void;
}

رابط Logger نشان دهنده یک شی است که دارای یک ویژگی واحد به نام log است. این ویژگی یک تابع است که یک پارامتر واحد از نوع string را می پذیرد و void را برمی گرداند.

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

interface Logger {
  log: (message: string) => void;
}

const logger: Logger = {
  log: (message) => console.log(message),
};

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

از آنجا که مقادیر باید از آنچه در رابط اعلام شده است پیروی کنند ، افزودن فیلدهای اضافی باعث خطای کامپایل می شود. به عنوان مثال ، در object literal ، سعی کنید یک ویژگی جدید که در رابط وجود ندارد اضافه کنید:

interface Logger {
  log: (message: string) => void;
}

const logger: Logger = {
  log: (message) => console.log(message),
  otherProp: true,
};

در این حالت ، کامپایلر TypeScript خطای 2322 را منتشر می کند ، زیرا این ویژگی در اعلان رابط Logger وجود ندارد:

 

Output

Type '{ log: (message: string) => void; otherProp: boolean; }' is not assignable to type 'Logger'.
  Object literal may only specify known properties, and 'otherProp' does not exist in type 'Logger'. (2322)

نوع دیگر Extending

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

تصور کنید یک رابط کاربری قابل پاک کردن دارید ، مانند این یکی:

interface Clearable {
  clear: () => void;
}

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

interface Clearable {
  clear: () => void;
}

interface Logger extends Clearable {
  log: (message: string) => void;
}

رابط Logger هم اکنون دارای یک عضو واضح است که یک تابع است که هیچ پارامتری را نمی پذیرد و void را برمی گرداند. این عضو جدید از رابط Clearable به ارث برده شده است. مثل این است که ما این کار را کرده ایم:

interface Logger {
  log: (message: string) => void;
  clear: () => void;
}

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

برای بازگشت به مثال Clearble که قبلاً استفاده شد ، تصور کنید که برنامه شما نیاز به رابط متفاوتی دارد ، مانند رابط StringList زیر ، برای نشان دادن یک ساختار داده که دارای چندین رشته است:

interface StringList {
  push: (value: string) => void;
  get: () => string[];
}

با گسترش این رابط StringList جدید ، رابط Clearable موجود را گسترش می دهید ، شما مشخص می کنید که این رابط همچنین اعضایی را در رابط Clearable تنظیم کرده است و ویژگی روشن را به تعریف نوع رابط StringList اضافه می کند:

interface StringList extends Clearable {
  push: (value: string) => void;
  get: () => string[];
}

رابط ها می توانند از هر نوع شیء مانند رابط ها ، انواع معمولی و حتی کلاس ها گسترش یابند.

رابط هایی با امضای قابل تماس

اگر رابط نیز قابل تماس باشد (یعنی یک تابع نیز باشد) ، می توانید با ایجاد یک امضای قابل تماس ، این اطلاعات را در اعلان رابط منتقل کنید.

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

به عنوان مثال ، یک امضای قابل تماس به رابط Logger خود اضافه کنید ، مانند کد برجسته زیر:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}

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

برای ایجاد مقداری که با رابط Logger شما مطابقت داشته باشد ، باید الزامات رابط را در نظر بگیرید:

  1. باید قابل تماس باشد.
  2. باید دارای یک ویژگی به نام log باشد که یک تابع است که یک پارامتر رشته را قبول می کند.

بیایید متغیری به نام logger ایجاد کنیم که می تواند به نوع رابط Logger شما اختصاص داده شود:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}

const logger: Logger = (message: string) => {
  console.log(message);
}
logger.log = (message: string) => {
  console.log(message);
}

برای مطابقت با رابط Logger ، مقدار باید قابل تماس باشد ، به همین دلیل است که متغیر logger را به یک تابع اختصاص می دهید:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}

const logger: Logger = (message: string) => {
  console.log(message);
}
logger.log = (message: string) => {
  console.log(message);
}

سپس ویژگی log را به تابع logger اضافه می کنید:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}

const logger: Logger = (message: string) => {
  console.log(message);
}
logger.log = (message: string) => {
  console.log(message);
}

این توسط رابط Logger مورد نیاز است. مقادیر متصل به رابط Logger نیز باید دارای ویژگی log باشند که تابعی است که یک پارامتر یک رشته را می پذیرد و void را برمی گرداند.

اگر ویژگی log را وارد نکرده باشید ، کامپایلر TypeScript خطای 2741 را به شما می دهد:

 

Output

Property 'log' is missing in type '(message: string) => void' but required in type 'Logger'. (2741)

اگر ویژگی log در متغیر logger دارای امضای نوع ناسازگار باشد ، مانند تنظیم آن روی true ، خطای مشابهی را منتشر می کند:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}


const logger: Logger = (message: string) => {
  console.log(message);
}
logger.log = true;

در این مورد ، کامپایلر TypeScript خطای 2322 را نشان می دهد:

 

Output

Type 'boolean' is not assignable to type '(message: string) => void'. (2322)

یکی از ویژگیهای خوب تنظیم متغیرها برای داشتن یک نوع خاص ، در این مورد تنظیم متغیر logger برای نوع رابط Logger ، این است که TypeScript اکنون می تواند نوع پارامترهای عملکرد logger و عملکرد در log را استنباط کند. ویژگی.

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

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}


const logger: Logger = (message) => {
  console.log(message);
}
logger.log = (message) => {
  console.log(message);
}

و در هر دو مورد ، ویرایشگر شما هنوز باید بتواند نشان دهد که نوع پارامتر یک رشته است ، زیرا این نوع مورد انتظار رابط Logger است.

رابط با امضای فهرست

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

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

interface DataRecord {
  [key: string]: string;
}

سپس می توانید از رابط DataRecord برای تعیین نوع هر شیئی که دارای پارامترهای متعدد رشته نوع است استفاده کنید:

interface DataRecord {
  [key: string]: string;
}

const data: DataRecord = {
  fieldA: "valueA",
  fieldB: "valueB",
  fieldC: "valueC",
  // ...
};

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

تفاوت بین Types and Interfaces

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

به عنوان مثال ، شما یک رابط Logger ایجاد کرده اید که از یک رابط Clearble توسعه یافته است:

interface Clearable {
  clear: () => void;
}

interface Logger extends Clearable {
  log: (message: string) => void;
}

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

type Clearable = {
  clear: () => void;
}

type Logger = Clearable & {
  log: (message: string) => void;
}

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

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

به عنوان مثال ، اعلان نوع دارای چند ویژگی است که اعلان رابط فاقد آن است ، مانند:

  • انواع اتحادیه
  • انواع نقشه برداری شده
  • نام مستعار به انواع اولیه

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

اعلامیه ادغام

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

رابط های TypeScript را می توان دوباره باز کرد. یعنی چندین اعلان از یک رابط یکسان می توانند ادغام شوند. این زمانی مفید است که می خواهید زمینه های جدیدی را به یک رابط موجود اضافه کنید.

به عنوان مثال ، تصور کنید که یک رابط به نام DatabaseOptions مانند زیر دارید:

interface DatabaseOptions {
  host: string;
  port: number;
  user: string;
  password: string;
}

از این رابط برای انتقال گزینه ها هنگام اتصال به پایگاه داده استفاده می شود.

بعداً در کد ، یک رابط با همان نام اما با یک رشته رشته به نام dsnUrl اعلام می کنید ، مانند این:

interface DatabaseOptions {
  dsnUrl: string;
}

وقتی کامپایلر TypeScript شروع به خواندن کد شما می کند ، تمام اعلانات رابط DatabaseOptions را در یک واحد ادغام می کند. از نظر کامپایلر TypeScript ، DatabaseOptions در حال حاضر:

interface DatabaseOptions {
  host: string;
  port: number;
  user: string;
  password: string;
  dsnUrl: string;
}

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

افزایش ماژول

ادغام بیانیه زمانی مفید است که نیاز به افزایش ماژول های موجود با ویژگی های جدید داشته باشید. یک مورد استفاده برای آن زمانی است که شما فیلدهای بیشتری را به ساختار داده ارائه شده توسط یک کتابخانه اضافه می کنید. این نسبتاً با کتابخانه Node.js به نام express رایج است ، که به شما امکان می دهد سرورهای HTTP ایجاد کنید.

هنگام کار با اکسپرس ، یک درخواست و یک شیء پاسخ به کنترل کننده های درخواست شما ارسال می شود (توابع مسئول ارائه پاسخ به درخواست HTTP). شیء درخواست معمولاً برای ذخیره داده های خاص یک درخواست خاص استفاده می شود. به عنوان مثال ، می توانید از آن برای ذخیره کاربر ثبت شده که درخواست اولیه HTTP کرده است استفاده کنید:

const myRoute = (req: Request, res: Response) => {
  res.json({ user: req.user });
}

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

تعاریف نوع برای رابط درخواست بدون فیلد کاربر است ، بنابراین کد بالا خطای 2339 را نشان می دهد:

Property 'user' does not exist on type 'Request'. (2339)

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

اگر نوع شیء Request را در اعلان نوع express بررسی کنید ، متوجه می شوید که یک رابط اضافه شده در داخل یک فضای نام عمومی به نام Express است ، همانطور که در اسناد مخزن DefinitelyTyped نشان داده شده است:

declare global {
    namespace Express {
        // These open interfaces may be extended in an application-specific manner via declaration merging.
        // See for example method-override.d.ts (https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/method-override/index.d.ts)
        interface Request {}
        interface Response {}
        interface Application {}
    }
}

برای استفاده از افزودن ماژول برای افزودن یک ویژگی جدید به رابط درخواست ، باید همان ساختار را در یک فایل اعلان نوع محلی تکرار کنید. به عنوان مثال ، تصور کنید که شما یک فایل با نام express.d.ts مانند فایل زیر ایجاد کرده اید و سپس آن را به گزینه انواع tsconfig.json خود اضافه کرده اید:

import 'express';

declare global {
  namespace Express {
    interface Request {
      user: {
        name: string;
      }
    }
  }
}

از دیدگاه کامپایلر TypeScript ، رابط درخواست دارای یک ویژگی کاربر است که نوع آنها روی یک شیء تنظیم شده است که دارای یک ویژگی واحد به نام name of type string است. این اتفاق می افتد زیرا همه اعلان ها برای یک رابط یکسان ادغام می شوند.

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

نتیجه

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

 

برچسب‌ها:

 

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه تنظیم vsftpd برای راهنمای کاربر در اوبونتو 20.04

ورود به سایت

معرفی

FTP ، که مخفف عبارت File Transfer Protocol است ، یک پروتکل شبکه است که زمانی برای جابجایی فایل ها بین سرویس گیرنده و سرور به طور گسترده مورد استفاده قرار می گرفت. FTP هنوز برای پشتیبانی از برنامه های قدیمی و گردش کار با نیازهای بسیار خاص استفاده می شود. اگر انتخاب پروتکل دارید ، گزینه های مدرن را در نظر بگیرید که کارآمدتر ، ایمن تر و راحت تر برای تحویل فایل ها هستند. به عنوان مثال ، کاربران اینترنتی که مستقیماً از مرورگر وب خود با https بارگیری می کنند ، و کاربران خط فرمان که از پروتکل های امن مانند scp یا SFTP استفاده می کنند.

 

،FTP daemon،vsftpd بسیار ایمن ، یک سرور FTP برای بسیاری از سیستم های مشابه یونیکس ، از جمله لینوکس است ، و اغلب سرور پیش فرض FTP برای بسیاری از توزیع های لینوکس نیز می باشد. vsftpd برای بهینه سازی امنیت ، عملکرد و ثبات مفید است. همچنین محافظت قوی در برابر مشکلات امنیتی موجود در سایر سرورهای FTP را ارائه می دهد. vsftpd می تواند تنظیمات IPD مجازی ، پشتیبانی از رمزگذاری با ادغام SSL و موارد دیگر را مدیریت کند.

در این آموزش ، vsftpd را طوری پیکربندی می کنید که به کاربر اجازه دهد فایل ها را با استفاده از FTP با اطلاعات ورود به سیستم که توسط SSL/TLS ایمن شده اند ، در فهرست اصلی خود بارگذاری کند. شما همچنین می توانید سرور خود را با استفاده از FileZilla ، یک سرویس گیرنده FTP منبع باز ، برای آزمایش رمزگذاری TLS متصل کنید.

پیش نیازها

برای پیگیری این آموزش به موارد زیر نیاز دارید:

  • اولین چیزی که نیاز دارید یک سرور اوبونتو 20.04 ، یک کاربر غیر روت با امتیازات sudo و یک فایروال فعال است.
  • دومین چیزی که نیاز دارید FileZilla است ، یک سرویس گیرنده FTP منبع باز ، که روی دستگاه محلی شما نصب و پیکربندی شده است. این به شما امکان می دهد آزمایش کنید که آیا سرویس گیرنده می تواند از طریق TLS به سرور شما متصل شود یا خیر.

مرحله 1 – نصب vsftpd

با به روز رسانی لیست بسته های خود شروع کنید:

sudo apt update

بعد ، vsftpd daemon را نصب کنید:

sudo apt install vsftpd

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

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

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

مرحله 2 – باز کردن فایروال

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

وضعیت فایروال را بررسی کنید:

sudo ufw status

این خروجی نشان می دهد که فایروال فعال است و فقط SSH از طریق موارد زیر مجاز است:

 

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

ممکن است قوانین دیگری در نظر گرفته باشید یا اصلاً قوانین فایروال وجود نداشته باشد. از آنجا که فقط ترافیک SSH مجاز است ، باید قوانین مربوط به ترافیک FTP را اضافه کنید.

با باز کردن درگاه های 20 ، 21 و 990 شروع کنید تا وقتی TLS را فعال می کنید آماده شوند:

sudo ufw allow 20,21,990/tcp

سپس ، پورتهای 40000-50000 را برای محدوده پورتهای غیرفعال که در فایل پیکربندی تنظیم می کنید ، باز کنید:

sudo ufw allow 40000:50000/tcp

وضعیت فایروال خود را بررسی کنید:

sudo ufw status

خروجی قوانین فایروال شما باید به صورت زیر ظاهر شود:

 

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
20,21,990/tcp              ALLOW       Anywhere
40000:50000/tcp            ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
20,21,990/tcp (v6)         ALLOW       Anywhere (v6)
40000:50000/tcp (v6)       ALLOW       Anywhere (v6)

با vsftpd نصب شده و پورت های لازم باز شده ، اکنون زمان ایجاد یک کاربر اختصاصی FTP است.

مرحله 3 – تهیه راهنمای کاربر

در این مرحله ، شما یک کاربر FTP اختصاصی ایجاد می کنید. با این حال ، ممکن است قبلاً یک کاربر نیاز به دسترسی به FTP داشته باشید. این راهنما نحوه حفظ دسترسی کاربر فعلی به داده های وی را توضیح می دهد ، اما ، با این وجود ، توصیه می کنیم تا قبل از پیکربندی مجدد هر کاربر موجود ، از یک کاربر اختصاصی FTP جدید استفاده کنید.

با افزودن یک کاربر آزمایشی شروع کنید:

sudo adduser sammy

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

در این مثال ، به جای حذف امتیازهای نوشتن از فهرست اصلی ، یک دایرکتوری ftp ایجاد کنید تا به عنوان chroot و یک فهرست فایلهای قابل نوشتن برای نگهداری فایلهای واقعی باشد.

ایجاد پوشه ftp:

sudo mkdir /home/sammy/ftp

مالکیت آن را تعیین کنید:

sudo chown nobody:nogroup /home/sammy/ftp

حذف مجوزهای نوشتن:

sudo chmod a-w/home/sammy/ftp

مجوزها را تأیید کنید:

sudo ls -la /home/sammy/ftp

 

Output

total 8
dr-xr-xr-x 2 nobody nogroup 4096 Sep 14 20:28 .
drwxr-xr-x 3 sammy sammy  4096 Sep 14 20:28 ..

بعد ، دایرکتوری بارگذاری فایل را ایجاد کنید:

sudo mkdir /home/sammy/ftp/files

سپس مالکیت را به کاربر اختصاص دهید:

sudo chown sammy:sammy /home/sammy/ftp/files

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

sudo ls -la /home/sammy/

 

Output

total 12
dr-xr-xr-x 3 nobody nogroup 4096 Sep 14 20:30 .
drwxr-xr-x 3 sammy sammy  4096 Sep 14 20:28 ..
drwxr-xr-x 2 sammy sammy  4096 Sep 14 20:30 files

در نهایت ، یک فایل test.txt اضافه کنید تا از آن برای آزمایش استفاده کنید:

echo “vsftpd test file” | sudo tee /home/sammy/ftp/files/test.txt

 

Output

vsftpd test file

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

مرحله 4 – پیکربندی دسترسی FTP

در این مرحله ، به یک کاربر واحد با حساب local shell اجازه می دهید تا با FTP ارتباط برقرار کند. دو تنظیم کلیدی برای این مورد از قبل در vsftpd.conf تنظیم شده است. این فایل را با استفاده از ویرایشگر متن دلخواه خود باز کنید. در اینجا ، ما از نانو استفاده می کنیم:

sudo nano /etc/vsftpd.conf

پس از باز کردن فایل ، تأیید کنید که دستورالعمل anonymous_enable روی NO و دستورالعمل local_enable روی YES تنظیم شده است:

/etc/vsftpd.conf

. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .

این تنظیمات از ورود به سیستم ناشناس جلوگیری می کند و به ترتیب اجازه ورود به سیستم محلی را می دهد. به خاطر داشته باشید که فعال کردن ورود به سیستم محلی به این معنی است که از هر کاربر عادی که در فایل /etc /passwd ذکر شده است می توانید برای ورود استفاده کنید.

برخی از دستورات FTP به کاربران امکان می دهد فایلها و فهرستهای موجود در سیستم فایل را اضافه ، تغییر یا حذف کنند. این دستورات را با اظهارنظر درباره تنظیمات write_enable فعال کنید. شما می توانید این کار را با حذف علامت پوند (#) قبل از این دستورالعمل انجام دهید:

/etc/vsftpd.conf

. . .
write_enable=YES
. . .

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

/etc/vsftpd.conf

. . .
user_sub_token=$USER
local_root=/home/$USER/ftp

محدوده پورت هایی را که می توانند برای FTP منفعل استفاده شوند محدود کنید تا مطمئن شوید اتصالات کافی در دسترس هستند:

/etc/vsftpd.conf

. . .
pasv_min_port=40000
pasv_max_port=50000

برای اجازه دسترسی FTP به صورت موردی ، پیکربندی را طوری تنظیم کنید که کاربران فقط زمانی که به صراحت به لیست اضافه می شوند ، دسترسی داشته باشند نه به طور پیش فرض:

/etc/vsftpd.conf

. . .
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

userlist_deny منطق را تغییر می دهد: وقتی روی YES تنظیم شود ، دسترسی کاربران FTP به FTP ممنوع است. وقتی روی NO تنظیم شود ، فقط به کاربران موجود در لیست اجازه دسترسی داده می شود.

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

در نهایت ، کاربر خود را به /etc/vsftpd.userlist اضافه کنید. برای ضمیمه کردن فایل از پرچم -a استفاده کنید:

echo “sammy” | sudo tee -a /etc/vsftpd.userlist

بررسی کنید که طبق انتظار شما اضافه شده است:

cat /etc/vsftpd.userlistcat /etc/vsftpd.userlist

 

Output

sammy

برای بارگیری تغییرات پیکربندی ، daemon را مجدداً راه اندازی کنید:

sudo systemctl restart vsftpd

با پیکربندی موجود ، اکنون می توانید دسترسی FTP را آزمایش کنید.

مرحله 5 – آزمایش دسترسی FTP

ما سرور را طوری پیکربندی کرده ایم که فقط کاربر sammy بتواند از طریق FTP متصل شود. اکنون ما مطمئن می شویم که این کار مطابق انتظار انجام می شود.

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

ftp -p 203.0.113.0

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

 

Output

Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): anonymous
530 Permission denied.
ftp: Login failed.
ft

بستن اتصال:

bye

کاربران غیر از sammy نیز نباید در اتصال متصل شوند. سعی کنید به عنوان کاربر sudo خود متصل شوید. همچنین باید دسترسی آنها به آنها ممنوع شود و این امر باید قبل از اجازه ورود رمز عبور آنها رخ دهد:

ftp -p 203.0.113.0

 

Output

Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>

بستن ارتباط:

bye

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

ftp -p 203.0.113.0

 

Output

Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
331 Please specify the password.
Password: your_user's_password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

اکنون به فهرست پرونده ها تغییر دهید:

cd files

 

Output

250 Directory successfully changed.

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

get test.txt

 

Output

227 Entering Passive Mode (203,0,113,0,169,12).
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
17 bytes received in 0.00 secs (4.5496 kB/s)
ftp>

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

put test.txt upload.txt

 

Output

227 Entering Passive Mode (203,0,113,0,164,71).
150 Ok to send data.
226 Transfer complete.
17 bytes sent in 0.00 secs (5.3227 kB/s)

بستن اتصال:

bye

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

مرحله 6 – ایمن سازی معاملات

از آنجا که FTP هیچ داده ای در حال انتقال ، از جمله اطلاعات کاربری را رمزگذاری نمی کند ، می توانید TLS/SSL را برای ارائه این رمزگذاری فعال کنید. اولین قدم ایجاد گواهینامه های SSL برای استفاده با vsftpd است.

برای ایجاد گواهینامه جدید از openssl استفاده کنید و از پرچم -days برای اعتبار یکساله استفاده کنید. در همان فرمان ، یک کلید RSA خصوصی 2048 بیتی اضافه کنید. با تنظیم هر دو پرچم -keyout و -out بر روی یک مقدار ، کلید خصوصی و گواهی در یک فایل قرار می گیرند:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

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

 

Output

Generating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:NY
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:vpsgol Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: your_server_ip
Email Address []:

برای کسب اطلاعات بیشتر در مورد پرچم های گواهینامه ، OpenSSL Essentials: کار با گواهینامه های SSL ، کلیدهای خصوصی و CSR ها را مطالعه کنید.

پس از ایجاد گواهینامه ها ، فایل پیکربندی vsftpd را دوباره باز کنید:

sudo nano /etc/vsftpd.conf

در انتهای فایل ، دو خط وجود دارد که با rsa_ شروع می شوند. آنها را با هر خط قبلی با علامت پوند (#) کامنت کنید:

/etc/vsftpd.conf

. . .
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
. . .

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

/etc/vsftpd.conf

. . .
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

 

اکنون شما مجبور به استفاده از SSL خواهید شد ، که از اتصال مشتریانی که نمی توانند TLS را اداره کنند جلوگیری می کند. این امر برای اطمینان از رمزگذاری کل ترافیک ضروری است ، اما ممکن است کاربر FTP شما را مجبور به تغییر سرویس گیرنده کند. تغییر ssl_enable به YES:

/etc/vsftpd.conf

. . .
ssl_enable=YES
. . .

در مرحله بعد ، خطوط زیر را برای رد صریح اتصالات ناشناس از طریق SSL اضافه کنید و برای انتقال داده ها و ورودها به SSL نیاز دارید:

/etc/vsftpd.conf

. . .
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
. . .

سپس سرور را برای استفاده از TLS ، جانشین ترجیحی SSL ، با افزودن خطوط زیر پیکربندی کنید:

/etc/vsftpd.conf

. . .
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
. . .

در نهایت ، دو گزینه نهایی را اضافه کنید. مورد اول نیازی به استفاده مجدد از SSL ندارد زیرا می تواند بسیاری از سرویس گیرندگان FTP را خراب کند. مورد دوم به مجموعه های رمزگذاری “بالا” نیاز دارد ، که در حال حاضر به معنی طول کلیدها برابر یا بیشتر از 128 بیت است:

/etc/vsftpd.conf

. . .
require_ssl_reuse=NO
ssl_ciphers=HIGH
. . .

در اینجا نحوه نمایش این بخش از پرونده پس از انجام همه این تغییرات آمده است:

/etc/vsftpd.conf

# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

 

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

سرور را راه اندازی مجدد کنید تا تغییرات اعمال شوند:

sudo systemctl restart vsftpd

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

سرور را راه اندازی مجدد کنید تا تغییرات اعمال شوند:

sudo systemctl restart vsftpd

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

 

Output

ftp -p 203.0.113.0
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
421 Service not available, remote server has closed connection
ftp>

 

بعد ، تأیید کنید که می توانید با استفاده از یک سرویس گیرنده که از TLS پشتیبانی می کند ، مانند FileZilla ، متصل شوید.

مرحله 7 – آزمایش TLS با FileZilla

اکثر سرویس گیرندگان FTP مدرن می توانند پیکربندی شوند تا از رمزگذاری TLS استفاده کنند. برای اهداف خود ، ما نحوه ارتباط با FileZilla را به دلیل پشتیبانی از چندین پلت فرم نشان خواهیم داد. با مستندات سایر مشتریان مشورت کنید.

وقتی FileZilla را برای اولین بار باز می کنید ، نماد مدیر سایت را که در بالای کلمه Host قرار دارد ، سمت چپ ترین نماد در ردیف بالا ، پیدا کنید.

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

در بخش My Sites نماد جدیدی با کلمات New Site ظاهر می شود. اکنون می توانید نام آن را بگذارید یا بعداً برگردید و از دکمه تغییر نام استفاده کنید.

قسمت Host را با نام یا آدرس IP پر کنید. در منوی کشویی Encryption ، Require expplicite FTP over TLS را انتخاب کنید.

برای Logon Type ، Ask for password را انتخاب کنید. کاربر FTP خود را در قسمت User وارد کنید:

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

برای اتصال OK را انتخاب کنید. اکنون باید با رمزگذاری TLS/SSL به سرور خود متصل شوید.

در مرحله بعد ، یک گواهی سرور به شما ارائه می شود

وقتی گواهی نامه را پذیرفتید ، روی پوشه فایلها دوبار کلیک کرده و upload.txt را به سمت چپ بکشید تا تأیید کنید که می توانید فایلها را بارگیری کنید:

پس از انجام این کار ، روی نسخه محلی راست کلیک کنید ، نام آن را به upload-tls.txt تغییر دهید و آن را به سرور بکشید تا تأیید شود که می توانید فایل ها را بارگذاری کنید:

اکنون تأیید کرده اید که می توانید فایل های SSL/TLS را به صورت ایمن و موفقیت آمیز منتقل کنید.

مرحله 8 – غیرفعال کردن دسترسی به پوسته (اختیاری)
اگر به دلیل نیازهای مشتری قادر به استفاده از TLS نیستید ، می توانید با غیرفعال کردن توانایی کاربر FTP برای ورود به هر روش دیگر ، امنیت بیشتری کسب کنید. یکی از راه های جلوگیری از آن ایجاد پوسته سفارشی است. اگرچه این هیچ گونه رمزگذاری را ارائه نمی دهد ، اما ممکن است ارزش این کار را داشته باشد تا دسترسی یک حساب آسیب دیده را به فایل هایی که توسط FTP قابل دسترسی هستند محدود کنید.

ابتدا فایلی به نام ftponly را در فهرست bin باز کنید:

sudo nano /bin/ftponly

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

/bin/ftponly

#!/bin/sh
echo "This account is limited to FTP access only."

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

سپس ، مجوزها را تغییر دهید تا فایل اجرایی شود:

sudo chmod a+x /bin/ftponly

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

sudo nano /etc/shells

در پایین اضافه کنید:

/etc/shells

. . .
/bin/ftponly

پوسته کاربر را با دستور زیر به روز کنید:

sudo usermod sammy -s /bin/ftponly

اکنون ، سعی کنید به عنوان sammy وارد سرور خود شوید:

ssh sammy@your_server_ip

پیام زیر را دریافت خواهید کرد:

 

Output

This account is limited to FTP access only.
Connection to 203.0.113.0 closed.

این تأیید می کند که کاربر دیگر نمی تواند به سرور ssh کند و فقط به دسترسی FTP محدود می شود. لطفاً توجه داشته باشید ، اگر هنگام ورود به سرور خود پیام خطایی دریافت کرده اید ، این می تواند به این معنی باشد که سرور شما احراز هویت رمز عبور را قبول نمی کند. استفاده از احراز هویت مبتنی بر رمز عبور می تواند سرور شما را در برابر حملات آسیب پذیر کند و به همین دلیل است که ممکن است بخواهید احراز هویت رمز عبور را غیرفعال کنید. اگر قبلاً احراز هویت مبتنی بر کلید SSH را پیکربندی کرده اید ، می توانید در مرحله 4 این آموزش درباره نحوه غیرفعال کردن احراز هویت رمز عبور در سرور خود اطلاعات بیشتری کسب کنید.

نتیجه

در این آموزش ، نحوه تنظیم FTP را برای کاربران با حساب محلی توضیح دادیم. اگر نیاز به استفاده از منبع احراز هویت خارجی دارید ، ممکن است بخواهید پشتیبانی vsftpd از کاربران مجازی را بررسی کنید. این مجموعه مجموعه ای غنی از گزینه ها را با استفاده از PAM ، ماژول های احراز هویت Pluggable ارائه می دهد و اگر شما کاربران را در سیستم دیگری مانند LDAP یا Kerberos مدیریت کنید ، انتخاب خوبی است.

 

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه فعال کردن SFTP بدون دسترسی Shell در اوبونتو 20.04

ورود به سایت

معرفی

SFTP مخفف SSH File Transfer Protocol است و راهی مطمئن برای انتقال فایلها بین ماشینها با استفاده از اتصال SSH رمزگذاری شده است. اگرچه از نظر نام مشابه است ، این پروتکل متفاوت از FTP (پروتکل انتقال فایل) است ، اما SFTP به طور گسترده توسط سرویس گیرندگان FTP مدرن پشتیبانی می شود.

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

در این آموزش ، شما SSH daemon را تنظیم می کنید تا دسترسی SFTP را به یک فهرست بدون دسترسی SSH به ازای هر کاربر محدود کند.

برای پیگیری این آموزش ، باید به سرور اوبونتو 20.04 دسترسی داشته باشید. این سرور باید دارای یک کاربر غیر root با امتیازات sudo و همچنین فایروال فعال باشد.

پیش نیازها

برای پیگیری این آموزش ، باید به سرور اوبونتو 20.04 دسترسی داشته باشید. این سرور باید دارای یک کاربر غیر root با امتیازات sudo و همچنین فایروال فعال باشد. برای کمک به تنظیم این ، راهنمای راه اندازی سرور اولیه ما برای اوبونتو 20.04 را دنبال کنید.

مرحله 1 – ایجاد یک کاربر جدید

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

sudo adduser sammyfiles

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

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

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

برای محدود کردن دسترسی SFTP به یک دایرکتوری ، ابتدا باید مطمئن شوید که دایرکتوری با الزامات مجوزهای سرور SSH مطابقت دارد ، که بسیار خاص هستند.

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

روشهای مختلفی برای حل این مشکل مالکیت وجود دارد. در این آموزش ، شما از/var/sftp/uploads به عنوان پوشه بارگذاری هدف استفاده می کنید . /var/sftp متعلق به root است و توسط سایر کاربران قابل نوشتن نخواهد بود. زیر شاخه/var/sftp/uploads متعلق به sammyfiles است ، به طوری که کاربر می تواند فایل ها را در آن بارگذاری کند.

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

sudo mkdir -p /var/sftp/uploads

 /var /sftp را روی root تنظیم کنید:

sudo chown root:root /var/sftp

به همان دایرکتوری مجوز نوشتن root بدهید و به سایر کاربران فقط حق خواندن و اجرا را بدهید:

sudo chmod 755 /var/sftp

مالکیت فهرست بارگذاری ها را به کاربری که به تازگی ایجاد کرده اید تغییر دهید. دستور زیر مجدداً از مثال کاربر و گروه sammyfiles استفاده می کند ، بنابراین اگر نام کاربری دیگر را ایجاد کردید ، این مورد را تغییر دهید:

sudo chown sammyfiles:sammyfiles /var/sftp/uploads

اکنون که ساختار دایرکتوری برقرار است ، می توانید خود سرور SSH را پیکربندی کنید.

مرحله 3 – محدود کردن دسترسی به یک دایرکتوری

در این مرحله ، پیکربندی سرور SSH را تغییر می دهید تا دسترسی ترمینال برای sammyfiles ممنوع شود ، اما اجازه انتقال فایل را می دهد.

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

sudo nano /etc/ssh/sshd_config

به پایین فایل بروید و قطعه پیکربندی زیر را اضافه کنید:

/etc/ssh/sshd_config

Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

در اینجا هر دستورالعمل انجام می دهد:

  • Match User به سرور SSH می گوید دستورات زیر را فقط برای کاربر مشخص شده اعمال کند. در اینجا ، sammyfiles را مشخص می کنیم. مجدداً ، مطمئن شوید که این نام را در صورت متفاوت با نام کاربر خود به روز کنید.
  • ForceCommand داخلی-sftp سرور SSH را مجبور می کند تا سرور SFTP را هنگام ورود اجرا کند و دسترسی به پوسته را ممنوع می کند.
  • PasswordAuthentication بله اجازه احراز هویت رمز عبور را برای این کاربر می دهد.
  • ChrootDirectory/var/sftp/تضمین می کند که کاربر اجازه دسترسی به هر چیزی فراتر از فهرست/var/sftp را نخواهد داشت.
  • AllowAgentForwarding شماره ، AllowTcpForwarding شماره. و X11Forwarding به ترتیب حمل و نقل پورت ، تونل زنی و حمل و نقل X11 را برای این کاربر غیرفعال نمی کند.

این مجموعه دستورات ، با Match User شروع می شود ، می تواند برای کاربران مختلف نیز کپی و تکرار شود. مطمئن شوید که نام کاربری را در خط Match User بر این اساس تغییر دهید.

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

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

sudo systemctl restart sshd

شما اکنون سرور SSH را طوری پیکربندی کرده اید که دسترسی به انتقال فایل را فقط برای sammyfiles محدود کند. آخرین مرحله آزمایش پیکربندی برای اطمینان از عملکرد مناسب آن است.

مرحله 4 – تأیید پیکربندی

اجازه دهید اطمینان حاصل کنیم که کاربر جدید sammyfiles ما فقط می تواند فایل ها را منتقل کند. همانطور که قبلاً ذکر شد ، SFTP برای انتقال فایل بین ماشین ها استفاده می شود. می توانید با آزمایش انتقال بین دستگاه محلی و سرور خود ، این کار را تأیید کنید.

ابتدا سعی کنید به عنوان کاربری که در مرحله 1 ایجاد کرده اید وارد سرور خود شوید زیرا به دلیل تنظیماتی که به فایل پیکربندی SSH اضافه کرده اید ، این امکان پذیر نخواهد بود:

ssh sammyfiles@your_server_ip

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

OutputThis service allows sftp connections only.
Connection to your_server_ip closed.

این بدان معناست که فایل sammyfiles دیگر نمی تواند با استفاده از SSH به پوسته سرور دسترسی پیدا کند.

در مرحله بعد ، بررسی کنید که آیا کاربر می تواند با موفقیت به SFTP برای انتقال فایل دسترسی پیدا کند:

sftp sammyfiles@your_server_ip

به جای پیغام خطا، این دستور یک پیام ورود موفق با یک اعلان تعاملی ایجاد می کند:

Output

OutputConnected to your_server_ip
sftp>

شما می توانید محتویات فهرست را با استفاده از ls در اعلان لیست کنید:

sftp>ls

با این کار پوشه بارگذاری هایی که در مرحله قبل ایجاد شده بود نشان داده می شود و شما را به دستور sftp> بر می گرداند:

 

Output

uploads

برای تأیید اینکه کاربر واقعاً به این فهرست محدود شده است و نمی تواند به هیچ دایرکتوری قبل از آن دسترسی داشته باشد ، می توانید دایرکتوری را به فهرست قبلی تغییر دهید:

sftp>cd ..

این دستور خطایی نمی دهد اما محتویات فهرست را مانند قبل بدون هیچ تغییری لیست می کند و ثابت می کند که کاربر قادر به تغییر در فهرست اصلی نبوده است.

اکنون تأیید کرده اید که پیکربندی محدود همانطور که در نظر گرفته شده عمل می کند. کاربر sammyfiles که تازه ایجاد شده است می تواند تنها با استفاده از پروتکل SFTP برای انتقال فایل به سرور دسترسی داشته باشد و توانایی دسترسی به پوسته کامل را ندارد.

نتیجه

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

سرور SSH طرح های پیکربندی پیچیده تری را امکان پذیر می کند ، از جمله محدود کردن دسترسی به گروه ها یا چندین کاربر به طور همزمان ، یا حتی دسترسی محدود به برخی آدرس های IP.

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از تم ها در Gatsby

ورود به سایت

معرفی

Gatsby 1.0 در سال 2017 منتشر شد و از آن زمان به بعد ویژگی های جدید خود را همچنان حفظ می کند ، در حالی که قابلیت سفارشی سازی بالا را به عنوان یک تولید کننده سایت استاتیک حفظ می کند. ویژگی های افزوده شده به شکل افزونه ها ، API های جدید ، ابزارهای کمکی و گزینه های پیکربندی است. هر یک از این ویژگی ها را می توان به صورت جداگانه استفاده کرد و سفارشی کرد یا با هم ترکیب کرد تا موارد خاص استفاده را اعمال کند. با این حال ، از آنجا که بسیاری از سایت ها از ترکیب ویژگی ها و تنظیمات یکسانی بهره می برند ، Gatsby تم های Gatsby را معرفی کرد.

تم ها در Gatsby به طور خاص به افزونه هایی اشاره می کنند که به عنوان مجموعه ای از گزینه های پیکربندی ، عملکرد و/یا عناصر رابط کاربر (UI) عمل می کنند. تفکیک ویژگی های به اشتراک گذاشته شده در موضوعات حفظ شده باعث می شود سایت شما به روزتر باشد و همچنین به شما اجازه می دهد زمان کمتری را برای پیکربندی سایت خود صرف کنید و زمان بیشتری را برای توسعه محتوا اختصاص دهید.

در این آموزش ، شما تم Gatsby را برای انتشار پست های وبلاگ نصب ، پیکربندی و استفاده می کنید: gatsby-theme-blog. این افزونه چندین ویژگی مانند پشتیبانی از MDX و برجسته سازی کد را در یک بسته مناسب قرار می دهد. در طول دوره آموزشی ، روند استفاده از این موضوع خاص Gatsby را دنبال می کنید ، که می توانید آن را به طور کلی در موضوعات اعمال کنید.

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

پیش نیازها

قبل از شروع کار ، چند مورد را که لازم دارید در اینجا آورده ایم:

  • نصب محلی Node.js برای اجرای Gatsby و ایجاد سایت شما. روش نصب بر اساس سیستم عامل متفاوت است ، اما vpsgol دارای راهنمای Ubuntu 20.04 و macOS است و همیشه می توانید آخرین نسخه را در صفحه بارگیری رسمی Node.js پیدا کنید.
  • آشنایی با جاوا اسکریپت برای کار در Gatsby. زبان جاوا اسکریپت یک مبحث گسترده است ، اما یک نقطه شروع خوب نحوه کدگذاری ما در سری جاوا اسکریپت است.
  • یک پروژه جدید Gatsby ، داربست از gatsby-starter-default. برای ساخت یک پروژه جدید Gatsby از ابتدا ، می توانید به مرحله 1 آموزش نحوه راه اندازی اولین وب سایت Gatsby مراجعه کنید.

این آموزش روی Node.js v14.16.1 ، npm v6.14.12 ، Gatsby v3.11.1 و gatsby-theme-blog v3.0.0 آزمایش شده است.

مرحله 1 – پیدا کردن و نصب یک تم

اگرچه این آموزش با استفاده از یک موضوع خاص ، gatsby-theme-blog ، شما را راهنمایی می کند ، اما هر مرحله به طور کلی در مورد موضوعات Gatsby نیز کاربرد دارد. این امر در مورد اولین مرحله نیز صدق می کند: یافتن موضوعی که می خواهید استفاده کنید و نصب آن با npm.

Gatsby به نویسندگان افزونه و موضوع درباره نحوه انتشار بسته هایGatsby خود راهنمایی می کند ، که پیدا کردن موضوعی متناسب با نیازهای شما را آسان تر می کند. به توسعه دهندگان تم دستور داده می شود که بسته های موضوعی خود را با gatsby و gatsby-theme به عنوان کلمات کلیدی برچسب گذاری کنند ، که سپس توسط رجیسترهای بسته (جایی که فایلها در واقع میزبانی می شوند) اسکن شده و قابل جستجو می شوند.

این آموزش موارد استفاده از ساخت سایت دارای Gatsby با زیر بخش وبلاگ را دنبال می کند. شما به عنوان توسعه دهنده به دنبال موضوعی برای افزودن پشتیبانی از MDX ، برجسته سازی کد و موارد دیگر هستید. گرچه Gatsby مرورگر افزونه خود را دارد ، اما در واقع لیست های خود را از رجیستری npm خارج می کند ، بنابراین اولین قدم شما این است که جستجوی خود را مستقیماً در موتور جستجوی رجیستری npm شروع کنید. با استفاده از ورودی جستجوی کلمات کلیدی وبلاگ: gatsby-theme ، نتایج خود را تنها به آن افزونه هایی که دارای کلمه کلیدی gatsby-theme هستند محدود می کنید ، همانطور که در تصویر زیر نشان داده شده است:

در این آموزش ، شما از gatsby-theme-blog استفاده می کنید ، بنابراین آن بسته را انتخاب کنید. با انتخاب gatsby-theme-blog به عنوان موضوعی که قصد نصب آن را دارید ، قسمت بعدی این مرحله این است که در واقع آن را به همراه وابستگی های آن نصب کنید. به پروژه موجود Gatsby بروید و دستور زیر را در فهرست اجرا کنید:

npm install gatsby-theme-blog

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

 

Output

...
+ gatsby-theme-blog@3.0.0
added 262 packages from 181 contributors and audited 2391 packages in 49.706s

اکنون که تم و وابستگی های آن را در پروژه خود نصب کرده اید ، وقت آن است که به بارگیری و پیکربندی تم در پروژه Gatsby خود بپردازید.

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

اکنون که تم شما نصب شده است ، می توانید از آن در سایت خود استفاده کرده و آن را بر اساس نیاز خود تغییر دهید. در Gatsby ، راه اندازی اولیه و پیکربندی تم اصلی با ویرایش فایل پیکربندی ریشه ، gatsby-config.js انجام می شود. در این مرحله ، فایل پیکربندی را ویرایش می کنید تا در گزینه مورد نظر خود در تم خود بارگذاری شود.

فایل پیکربندی gatsby-config.js را در ویرایشگر دلخواه خود باز کنید ، سپس موارد زیر را اضافه کنید:

gatsby-config.js

module.exports = {
  plugins: [
    ...
    `gatsby-plugin-image`,
    {
      resolve: 'gatsby-theme-blog',
      options: {
        basePath: '/posts',
        contentPath: `md/posts`,
      }
    },
    `gatsby-transformer-sharp`,
    ...
  ]
}

در این کد پیکربندی ، دو تنظیم مهم وجود دارد که از مقادیر سفارشی برای آنها استفاده می کنید. موضوع از گزینه basePath برای تنظیم آدرس وبلاگ استفاده می کند و contentPath به موضوع می گوید که کجا فایلهای Markdown را برای انتشار به عنوان پست وبلاگ پیدا کنید. استفاده از مقدار md/posts برای contentPath به این معنی است که فایلهای Markdown شما باید در فهرست md/posts قرار داشته باشند.

پس از افزودن این کد ، فایل پیکربندی خود را ذخیره کنید.

موضوع gatsby-theme-blog تنظیمات بیشتری را ارائه می دهد ، که در فایل README gatsby-theme-blog ثبت شده است. از آنجا که هر موضوع Gatsby متفاوت است ، مهمترین قسمت این مرحله مراجعه به مستندات موضوع انتخابی شما و پیروی از راهنمایی های دقیق ارائه شده در آن است.

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

مرحله 3 – آزمایش عملکرد

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

شما MDX ، برجسته سازی کد و پشتیبانی پردازش Markdown از gatsby-theme-blog را با یک فایل پست وبلاگ جدید آزمایش خواهید کرد. ابتدا ، شما باید پوشه ای را برای نگهداری فایل ها ایجاد کنید ، که باید با تنظیم محتوای مسیر md/post هایی که در مرحله شماره 2 استفاده کرده اید مطابقت داشته باشد. شما می توانید این فهرست را به صورت دستی در مرورگر فایل خود ایجاد کنید یا با اجرای این دستور در ریشه پروژه Gatsby خود ، آن را در ترمینال خود ایجاد کنید:

mkdir -p ./md/posts

در مرحله بعد ، یک فایل خالی MDX ، my-first-post.mdx ایجاد کنید که حاوی محتوای پست جدید شما باشد. دوباره می توانید این را به صورت دستی یا در ترمینال ایجاد کنید:

touch ./md/posts/my-first-post.mdx

حالا فایل خالی MDX را باز کرده و کد زیر را به آن اضافه کنید:

md/posts/my-first-post.mdx

---
title: Learning Gatsby Themes and Trying MDX
slug: /posts/gatsby-theme-learning
date: 2021-08-16
excerpt: A post about learning Gatsby themes and trying out some MDX.
---

## Welcome!

This is a post where I plan to share my journey learning Gatsby Themes, and to try out some MDX.

## Resources

<ul>
{[
    {
        link: 'https://www.gatsbyjs.com/',
        text: 'Gatsby Website',
        note: 'Official Website for Gatsby'
    },
    {
        link: 'https://www.gatsbyjs.com/docs/themes/',
        text: 'Gatsby Theme Documentation',
        note: 'Documentation for Gatsby Theme usage and development'
    },
    {
        link: 'https://www.vpsgol.com/community/tutorial_series/how-to-create-static-web-sites-with-gatsby-js',
        text: 'vpsgol - "How To Create Static Web Sites with Gatsby.js"',
        note: 'A vpsgol tutorial series on using Gatsby JS'
    }
].map(item => (
    <li key={item.link}>
        <a href={item.link} target="_blank">{item.text}</a>
        <ul>
            <li>{item.note}</li>
        </ul>
    </li>
))}
</ul>

## Code Sample

To try out code highlighting in this theme, here is a snippet of JavaScript code. This code won't run in your browser; it is for visual use only.

در بالای فایل ، قسمتی که توسط — محصور شده است مجموعه ای از جفت های کلید-مقدار است که frontmatter نامیده می شود. همه موضوعات از کلیدهای یکسانی استفاده نمی کنند و آنهایی که در پست خود استفاده می کنید از بین کلیدهای مورد استفاده gatsby-theme-blog با دقت انتخاب شده اند. شما یک عنوان سفارشی ، راه حل (مسیر URL) ، تاریخ انتشار و گزیده ای (پیش نمایش متن برای نمایش در صفحه فهرست پست ها) را تعریف کرده اید.

تمام متنی که از دستور جلو پیروی می کند ، بدنه پست می شود و با خوش آمدید شما شروع می شود! بخش. دو علامت هش (##) قبل از متن عنوان به Markdown می گویند که این یک عنوان سطح 2 است که برای بخش منابع نیز استفاده می شود.

در بخش منابع ، اولین استفاده خود را از آنچه MDX را از Markdown معمولی متمایز می کند ، استفاده می کنید: استفاده از نحو JSX React برای جاسازی اجزای React که با Markdown شما ادغام شده و به یک صفحه واحد تبدیل می شوند. در پست خود ، از JSX برای تبدیل مجموعه ای از منابع درباره Gatsby به لیست پیوندهای HTML استفاده می کنید.

سرانجام ، برای آزمایش ویژگی برجسته سازی نحو کد همراه با gatsby-theme-blog ، یک بلوک Markdown Fidden Code Block در انتهای فایل اضافه کنید:

md/posts/my-first-post.mdx

```js
function saySomething(name) {
    console.log(`Hello ${name}!`);
    console.log(`Isn't learning about Gatsby fun?!`);
}
saySomething('Arthur');
```

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

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

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

npm run develop

پس از آماده شدن ، Gatsby CLI از شما می خواهد که پروژه خود را در مرورگر وب خود باز کنید ، که می توانید با رفتن به localhost: 8000 این کار را انجام دهید. برای مشاهده صفحه فهرست وبلاگ جدید ، از localhost: 8000/posts دیدن کنید و برای مشاهده این پست جدید ، به localhost بروید: 8000/posts/gatsby-theme-learning/. پست وبلاگ به شکل زیر خواهد بود:

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

مرحله 4 – استفاده از سایه (اختیاری)

در این مرحله از آموزش ، شما قبلاً یک تم شخص ثالث را در Gatsby نصب کرده و پیکربندی کرده اید. پیکربندی در gatsby-config.js انجام شد و محدود به گزینه هایی بود که ناشر موضوع برای سفارشی سازی آنها انتخاب کرده بود. اگر نیاز به سفارشی سازی یک موضوع فراتر از این گزینه ها دارید ، از یک مفهوم Gatsby به نام سایه استفاده می کنید ، که در این مرحله این کار را انجام می دهید.

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

با تم های Gatsby ، هر فایلی در کد منبع تم می تواند تحت سایه قرار گیرد ، از روش هایی که بر روی گره Gatsby و ایجاد فایل تأثیر می گذارد تا عناصر و طرح های UI. برای وبلاگ خود ، یک فایل کامپوننت React به نام bio-content.js را تحت سایه قرار دهید تا نحوه نمایش بیوگرافی وبلاگ شما در زیر هر پست سفارشی شود. با سایه انداختن این یک فایل ، بر ظاهر هر پست وبلاگی که از طریق افزونه gatsby-theme-blog می گذرد تأثیر می گذارید.

اولین قدم برای ایجاد سایه این است که یک پوشه در فهرست src خود با نام دقیق افزونه تم مورد نظر خود ایجاد کنید. می توانید این کار را به صورت دستی یا با ترمینال انجام دهید:

mkdir src/gatsby-theme-blog

برای هر فایل خاصی در تم که می خواهید سایه داشته باشد ، مرحله بعدی ایجاد یک پرونده با همان نام و ساختار دایرکتوری مشابه در موضوع است. از آنجا که قصد دارید جزء زیستی موجود را کمی تغییر دهید ، می توانید با کپی کردن فایل موجود به عنوان نقطه شروع ، با دستور cp (copy) در زمان خود صرفه جویی کنید.

mkdir -p src/gatsby-theme-blog/components
cp node_modules/gatsby-theme-blog/src/components/bio-content.js src/gatsby-theme-blog/components/bio-content.js

اکنون فایل تازه کپی شده را باز کرده و تغییرات زیر را انجام دهید:

src/gatsby-theme-blog/components/bio-content.js

import React, { Fragment } from "react"

const BioContent = () => (
  <Fragment>
    <p>Content by vpsgol</p>
    <p>License Info:</p>
    <p
      style={{
        margin: "10px 20px",
        padding: 8,
        backgroundColor: "#0069ff",
        color: "white",
        borderRadius: 12,
      }}
    >
      This work is licensed under a Creative Commons
      Attribution-NonCommercial-ShareAlike 4.0 International License.
    </p>
  </Fragment>
)

export default BioContent

این فایل را ذخیره و ببندید ، زیرا اکنون ویرایش فایل سایه را انجام داده اید.

در این فایل ، شما فایل اصلی bio-content.js را تحت سایه قرار داده اید ، و متن نویسنده را با نام نویسنده و اطلاعات مجوز جایگزین کرده اید. شما این کار را با جایگزینی JSX برگردانده شده توسط کامپوننت BioContent React انجام داده اید. کد style = {{}} نمونه ای از CSS درون خطی است که از آن برای افزودن رنگ و فاصله به فراخوان مجوز استفاده کرده اید.

با اجرای مجدد npm run در ترمینال خود ، سرور توسعه Gatsby را راه اندازی می کنید و می توانید تغییرات را در همه پست های وبلاگ خود پیش نمایش کنید:

با استفاده از سایه زدن Gatsby ، شما فقط یک موضوع شخص ثالث Gatsby را فراتر از پیکربندی استاندارد تغییر داده اید و در لغو و افزونه های سفارشی خود مخلوط شده اید.

نتیجه

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

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

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از نمایه ها در MongoDB

ورود به سایت

معرفی

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

انعطاف پذیری که MongoDB در رابطه با پرس و جوها ارائه می دهد ، می تواند موتور پایگاه داده را پیش بینی کند که چه نوع پرس و جوهایی بیشتر مورد استفاده قرار می گیرد. بدون توجه به اندازه مجموعه باید آماده یافتن اسناد باشد. به همین دلیل ، مقدار داده های موجود در یک مجموعه به طور مستقیم بر عملکرد جستجو تأثیر می گذارد: هرچه مجموعه داده بزرگتر باشد ، پیدا کردن اسناد مطابق با پرس و جو برای MongoDB دشوارتر است.

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

پیش نیازها

برای پیگیری این آموزش ، شما نیاز دارید:

  • سروری با کاربر معمولی و غیر روت با امتیازات sudo و فایروال با UFW پیکربندی شده است. این آموزش با استفاده از سروری که Ubuntu 20.04 را اجرا می کند تأیید شده است و می توانید با دنبال کردن این آموزش راه اندازی اولیه سرور برای اوبونتو 20.04 ، سرور خود را آماده کنید.
  • MongoDB روی سرور شما نصب شده است. برای تنظیم این ، آموزش ما را در مورد نحوه نصب MongoDB در اوبونتو 20.04 دنبال کنید.
  • نمونه MongoDB سرور شما با فعال کردن احراز هویت و ایجاد یک کاربر مدیریتی ایمن می شود. برای ایمن سازی MongoDB مانند این ، آموزش ما را در مورد نحوه ایمن سازی MongoDB در اوبونتو 20.04 دنبال کنید.
  • آشنایی با عملیات MongoDB CRUD و بازیابی اشیاء از مجموعه ها به طور خاص. برای یادگیری نحوه استفاده از پوسته MongoDB برای انجام عملیات CRUD ، آموزش نحوه انجام عملیات CRUD در MongoDB را دنبال کنید.

فهمیدن شاخص ها

به طور معمول ، هنگامی که از پایگاه داده MongoDB برای بازیابی اسناد مطابقت با شرایط خاصی – مانند قله های کوه با ارتفاع بیش از 8000 متر – درخواست می کنید ، پایگاه داده باید اسکن مجموعه ای را برای پیدا کردن آنها انجام دهد. این بدان معناست که هر سند را از مجموعه بازیابی می کند تا بررسی کند که آیا آنها با شرایط مطابقت دارند یا خیر. اگر سندی با شرایط مطابقت داشته باشد ، به لیست اسناد برگشتی اضافه می شود. اگر سندی با شرایط تعیین شده مطابقت نداشته باشد ، MongoDB تا زمانی که اسکن کل مجموعه را به پایان نرساند ، به سراغ اسکن سند بعدی می رود.

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

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

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

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

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

مرحله 1 – آماده سازی پایگاه داده نمونه

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

برای ایجاد این مجموعه نمونه ، به پوسته MongoDB به عنوان کاربر مدیریتی خود متصل شوید. این آموزش از قوانین پیش نیاز آموزش امنیتی MongoDB پیروی می کند و فرض می کند که نام این کاربر مدیریتی AdminSammy و پایگاه داده احراز هویت آن admin است. اطمینان حاصل کنید که این جزئیات را در دستور زیر تغییر دهید تا در صورت متفاوت بودن تنظیمات خود را نشان دهد

mongo -u AdminSammy -p –authenticationDatabase admin

گذرواژه ای را که هنگام نصب برای دسترسی به پوسته تعیین کرده اید وارد کنید. پس از ارائه رمز عبور ، درخواست شما به علامت بزرگتر از (>) تغییر می کند.

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

The Everest document

{
    "name": "Everest",
    "height": 8848,
    "location": ["Nepal", "China"],
    "ascents": {
        "first": {
            "year": 1953,
        },
        "first_winter": {
            "year": 1980,
        },
        "total": 5656,
    }
}

این سند شامل اطلاعات زیر است:

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

روش insertMany () زیر را در پوسته MongoDB اجرا کنید تا همزمان مجموعه ای با نام peaks ایجاد کنید و پنج نمونه سند را در آن وارد کنید. این اسناد پنج بلندترین قله کوه در جهان را توصیف می کند:

db.peaks.insertMany([
{
“name”: “Everest”,
“height”: 8848,
“location”: [“Nepal”, “China”],
“ascents”: {
“first”: {
“year”: 1953
},
“first_winter”: {
“year”: 1980
},
“total”: 5656
}
},
{
“name”: “K2”,
“height”: 8611,
“location”: [“Pakistan”, “China”],
“ascents”: {
“first”: {
“year”: 1954
},
“first_winter”: {
“year”: 1921
},
“total”: 306
}
},
{
“name”: “Kangchenjunga”,
“height”: 8586,
“location”: [“Nepal”, “India”],
“ascents”: {
“first”: {
“year”: 1955
},
“first_winter”: {
“year”: 1986
},
“total”: 283
}
},
{
“name”: “Lhotse”,
“height”: 8516,
“location”: [“Nepal”, “China”],
“ascents”: {
“first”: {
“year”: 1956
},
“first_winter”: {
“year”: 1988
},
“total”: 461
}
},
{
“name”: “Makalu”,
“height”: 8485,
“location”: [“China”, “Nepal”],
“ascents”: {
“first”: {
“year”: 1955
},
“first_winter”: {
“year”: 2009
},
“total”: 361
}
}
])

خروجی شامل لیستی از شناسه های شی است که به اشیاء تازه وارد شده اختصاص داده شده است.

 

Output

{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("61212a8300c8304536a86b2f"),
                ObjectId("61212a8300c8304536a86b30"),
                ObjectId("61212a8300c8304536a86b31"),
                ObjectId("61212a8300c8304536a86b32"),
                ObjectId("61212a8300c8304536a86b33")
        ]
}

با اجرای متد find () بدون آرگومان ، می توانید تأیید کنید که اسناد به درستی وارد شده اند ، که همه اسناد را بازیابی می کند

db.peaks.find()

 

Output

{ "_id" : ObjectId("61212a8300c8304536a86b2f"), "name" : "Everest", "height" : 8848, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1953 }, "first_winter" : { "year" : 1980 }, "total" : 5656 } }

...

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

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

مرحله 2 – ایجاد یک فهرست واحد و ارزیابی استفاده از شاخص

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

برای شروع ، عبارت زیر را اجرا کنید. به طور معمول ، سند پرس و جو {“height”: {$ gt: 8700}} باعث می شود که این پرس و جو هرگونه اسنادی را که قله کوهی با ارزش ارتفاع بیش از 8700 توصیف می کند ، بازیابی کند. با این حال ، این عملیات شامل روش توضیح (executiveStats) ، که باعث می شود پرس و جو در عوض اطلاعات مربوط به نحوه انجام این پرس و جو را برگرداند. از آنجا که هنوز هیچ نمایه ای ایجاد نکرده اید ، این یک معیار در اختیار شما قرار می دهد که می توانید از آن برای مقایسه در برابر پرس و جوهایی که از نمایه استفاده می کنند استفاده کنید:

db.peaks.find(
{ “height”: { $gt: 8700 } }
).explain(“executionStats”)

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

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        . . .
                },
        },
        . . .
        "executionStats" : {
                . . .
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 0,
                "totalDocsExamined" : 5,
                . . .
        },
        . . .
}

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

WinPlan: این سند در بخش queryPlanner نحوه تصمیم گیری MongoDB برای اجرای پرس و جو را توضیح می دهد. بسته به نوع پرس و جو ، ساختار دقیق طرح برنده ممکن است متفاوت باشد ، اما در اینجا نکته اصلی که باید به آن توجه کنید COLLSCAN است. وجود این مقدار بدین معناست که MongoDB برای یافتن اسناد درخواستی نیاز به گذراندن مجموعه کامل بدون هیچ گونه کمکی داشت.
n بازگردانده شده: این مقدار به شما می گوید که چند سند توسط یک پرس و جو معین برگردانده شده است. در اینجا ، فقط یک قله کوه با پرس و جو مطابقت دارد.
ExeTimeMillis: این مقدار نشان دهنده زمان اجرا است. با چنین مجموعه کوچکی ، اهمیت آن ناچیز است. با این حال ، هنگام تجزیه و تحلیل عملکرد پرس و جوها در برابر مجموعه های بزرگتر یا پیچیده تر ، باید معیار مهمی را در نظر داشت.
totalKeysExamined: این به شما می گوید که چند مدخل فهرست را برای پیدا کردن اسناد درخواست شده در MongoDB بررسی کرده است. از آنجا که از اسکن مجموعه استفاده شد و شما هنوز هیچ فهرست ایجاد نکرده اید ، مقدار 0 است.
totalDocsExamined: این مقدار نشان می دهد که چند سند باید MongoDB از مجموعه بخواند. از آنجا که MongoDB یک اسکن مجموعه انجام داد ، مقدار آن 5 ، تعداد کل اسناد موجود در مجموعه است. هرچه مجموعه بزرگتر باشد ، در صورت عدم استفاده از نمایه ها ، مقدار بیشتری در این زمینه وجود دارد.
به تفاوت بین کل اسناد مورد بررسی و تعداد اسناد برگشت داده شده توجه کنید: MongoDB مجبور شد 5 سند را برای بازگرداندن یک سند بازرسی کند.

این آموزش در بخشهای بعدی به این مقادیر اشاره می کند تا نحوه تأثیر نمایه ها بر نحوه اجرای پرس و جوها را تجزیه و تحلیل کند.

برای این منظور ، با استفاده از متد createIndex () ، یک شاخص در قسمت height در مجموعه peaks ایجاد کنید. این روش یک سند JSON را توصیف می کند که نمایه ای را که می خواهید ایجاد کنید توصیف می کند. این مثال یک فهرست زمینه واحد ایجاد می کند ، به این معنی که سند حاوی یک کلید واحد (ارتفاع در این مثال) برای فیلدی است که می خواهیم از آن استفاده کنیم. این کلید 1 یا -1 را به عنوان مقدار می پذیرد. این مقادیر ترتیب مرتب سازی شاخص را نشان می دهند که 1 نشان دهنده صعودی و -1 نشان دهنده نزولی است:

db.peaks.createIndex( { “height”: 1 } )

MongoDB تأییدی را برمی گرداند که نشان می دهد چند شاخص در حال حاضر در مجموعه تعریف شده است و تفاوت آن با حالت قبلی.

Output

 
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

حالا سعی کنید همان پرس و جو را که قبلاً اجرا کرده اید اجرا کنید. هرچند این بار ، اطلاعاتی که با روش توضیح (“exeStatStats”) بازگردانده می شوند ، متفاوت است زیرا نمایه ای در محل وجود دارد:

db.peaks.find(
{ “height”: { $gt: 8700 } }
).explain(“executionStats”)

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        . . .
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "height_1",
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 1,
                "totalDocsExamined" : 1,
                . . .
        },
        . . .
}

توجه کنید که WinPlan دیگر COLLSCAN را نشان نمی دهد. در عوض ، IXSCAN وجود دارد ، نشان می دهد که از ایندکس به عنوان بخشی از اجرای پرس و جو استفاده شده است. MongoDB همچنین به شما اطلاع می دهد که کدام شاخص از طریق مقدار indexName استفاده شده است. به طور پیش فرض ، MongoDB نامهای فهرست را از نامهای فیلدی که فهرست به آنها متصل است و ترتیب اعمال می شود ، می سازد. از {“height”: 1} ، MongoDB به طور خودکار نام height_1 را ایجاد کرد.

مهمترین تغییر در بخش exeStats است. یکبار دیگر ، این پرس و جو فقط یک سند واحد را که با nReturned مشخص شده است ، باز می گرداند. با این حال ، این بار totalDocsExamined فقط 1 است. این بدان معناست که پایگاه داده فقط یک سند را از مجموعه بازیابی کرده تا پرس و جو را برآورده کند. TotalKeysExamined نشان می دهد که شاخص فقط یک بار بررسی شده است زیرا اطلاعات کافی برای جمع آوری نتیجه را ارائه می دهد.

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

مرحله 3 – ایجاد نمایه های منحصر به فرد

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

برای توضیح ، روش createIndex () زیر را اجرا کنید. نحو این دستور مشابه آنچه در مرحله قبل استفاده شد است ، با این تفاوت که این بار یک پارامتر دوم با ایجاد تنظیمات اضافی برای index () به createIndex () منتقل می شود. {“منحصر به فرد”: true} نشان می دهد که شاخص ایجاد شده اطمینان می دهد که مقادیر فیلد (نام) مشخص شده نمی تواند تکرار شود:

db.peaks.createIndex( { “name”: 1 }, { “unique”: true } )

بار دیگر ، MongoDB تأیید می کند که این فهرست با موفقیت ایجاد شده است:

 

Output

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 2,
        "numIndexesAfter" : 3,
        "ok" : 1
}

در مرحله بعد ، بررسی کنید که آیا ایندکس به منظور اصلی خود عمل می کند یا با اجتناب از اسکن مجموعه ، هر گونه پرس و جو را سریعتر با نام کوه اجرا می کند. برای انجام این کار ، عبارت برابری زیر را با روش توضیحی (“executiveStats”) اجرا کنید:

db.peaks.find(
{ “name”: “Everest” }
).explain(“executionStats”)

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

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        . . .
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "name_1",
                                . . .
                        }
                },
                . . .
        },
        . . .
}

در مرحله بعد بررسی کنید که آیا می توانید سند دیگری را که نمایانگر کوه اورست است به مجموعه اضافه کنید ، در حالی که فهرست در جای خود قرار دارد. این کار را با اجرای روش insertOne () زیر انجام دهید:

db.peaks.insertOne({
“name”: “Everest”,
“height”: 9200,
“location”: [“India”],
“ascents”: {
“first”: {
“year”: 2020
},
“first_winter”: {
“year”: 2021
},
“total”: 2
}
})

MongoDB سند را ایجاد نمی کند و در عوض پیغام خطا را برمی گرداند:

 

Output

WriteError({
        "index" : 0,
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: test.peaks index: name_1 dup key: { name: \"Everest\" }",
        "op" : {
            . . .

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

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

مرحله 4 – ایجاد یک فهرست در یک میدان جاسازی شده

هر زمان که از مجموعه ای با استفاده از فیلدی در سند تو در تو که نمایه ای ندارد ، درخواست می کنید ، MongoDB نه تنها باید همه اسناد را از مجموعه بازیابی کند ، بلکه باید از هر سند تو در تو نیز عبور کند.

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

db.peaks.find(
{ “ascents.total”: { $gt: 300 } }
).sort({ “ascents.total”: -1 })

این پرس و جو چهار قله از مجموعه را باز می گرداند ، با کوه اورست قله با بیشترین صعود ، و پس از آن Lhotse ، Makalu و K2:

Output

{ "_id" : ObjectId("61212a8300c8304536a86b2f"), "name" : "Everest", "height" : 8848, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1953 }, "first_winter" : { "year" : 1980 }, "total" : 5656 } }
{ "_id" : ObjectId("61212a8300c8304536a86b32"), "name" : "Lhotse", "height" : 8516, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1956 }, "first_winter" : { "year" : 1988 }, "total" : 461 } }
{ "_id" : ObjectId("61212a8300c8304536a86b33"), "name" : "Makalu", "height" : 8485, "location" : [ "China", "Nepal" ], "ascents" : { "first" : { "year" : 1955 }, "first_winter" : { "year" : 2009 }, "total" : 361 } }
{ "_id" : ObjectId("61212a8300c8304536a86b30"), "name" : "K2", "height" : 8611, "location" : [ "Pakistan", "China" ], "ascents" : { "first" : { "year" : 1954 }, "first_winter" : { "year" : 1921 }, "total" : 306 } }

اکنون همان پرس و جو را اجرا کنید ، اما روش توضیح ((exeStatStats)) را که قبلاً استفاده شده بود ، وارد کنید:

db.peaks.find(
{ “ascents.total”: { $gt: 300 } }
).sort({ “ascents.total”: -1 }).explain(“executionStats”)

همانطور که مقدار COLLSCAN در این بخش از خروجی نشان می دهد ، MongoDB به یک اسکن مجموعه کامل متوسل شد و تمام اسناد مجموعه peaks را مرور کرد تا آنها را با شرایط پرس و جو مقایسه کند:

 

Output

{
        . . .
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        . . .
                },
        . . .
}

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

برای کمک به MongoDB در اجرای این پرس و جو ، بیایید یک فهرست در قسمت کل در سند صعودها ایجاد کنیم. از آنجا که کل میدان درون صعودها قرار گرفته است ، هنگام ایجاد این فهرست نمی توان کل را به عنوان نام فیلد مشخص کرد. در عوض ، MongoDB یک نماد نقطه برای دسترسی به فیلدها در اسناد تو در تو ارائه می دهد. برای ارجاع به فیلد کل داخل سند صعودی ، می توانید از علامت ascents.total ، مانند این استفاده کنید:

db.peaks.createIndex( { “ascents.total”: 1 } )

MongoDB با پیام موفقیت آمیز پاسخ می دهد که به شما اطلاع می دهد که اکنون چهار فهرست تعریف شده دارید.

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 3,
        "numIndexesAfter" : 4,
        "ok" : 1
}

پرس و جو قبلی را یکبار دیگر اجرا کنید تا بررسی کنید که آیا این فهرست به MongoDB کمک کرده است تا از اسکن کامل مجموعه جلوگیری کند:

db.peaks.find(
{ “ascents.total”: { $gt: 300 } }
).sort({ “ascents.total”: -1 }).explain(“executionStats”)

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        . . .
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "ascents.total_-1",
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 4,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 4,
                "totalDocsExamined" : 4,
                . . .
                "direction" : "backward",
                . . .
        },
        . . .
}

توجه داشته باشید که در حال حاضر IXSCAN در برابر شاخص تازه ایجاد شده ascents.total_-1 استفاده می شود و فقط چهار سند مورد بررسی قرار گرفته است. این همان تعداد اسنادی است که در فهرست بازگردانده شده و بررسی شده اند ، بنابراین هیچ سند دیگری برای تکمیل پرس و جو بازیابی نشده است.

جهت ، یک فیلد دیگر در بخش ExeStats ، نشان می دهد که MongoDB در کدام جهت تصمیم گرفته است که از ایندکس عبور کند. از آنجا که این شاخص با استفاده از نحو {“ascents.total”: 1} ایجاد صعودی شد و پرس و جو قله های کوه را به ترتیب نزولی مرتب کرد ، موتور پایگاه داده تصمیم گرفت به عقب برگردد. هنگام بازیابی اسناد به ترتیب خاص بر اساس فیلدی که بخشی از فهرست است ، MongoDB از فهرست برای ارائه سفارش نهایی بدون نیاز به مرتب سازی بیشتر اسناد پس از بازیابی کامل آنها استفاده می کند.

مرحله 5 – ایجاد Compound Field Index

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

هنگامی که یک فهرست میدان واحد در زمینه ارتفاع ایجاد کردید ، از مرحله 2 به یاد بیاورید تا به طور م moreثرتری از مجموعه قله ها برای یافتن بلندترین قله های کوه جستجو کنید. با استفاده از این شاخص ، بیایید تجزیه و تحلیل کنیم که چگونه MongoDB یک پرس و جو مشابه اما کمی پیچیده تر را انجام می دهد. سعی کنید کوه هایی با ارتفاع کمتر از 8600 متر پیدا کنید که اولین صعود زمستانی آنها پس از سال 1990 رخ داده است:

db.peaks.find(
{
“ascents.first_winter.year”: { $gt: 1990 },
“height”: { $lt: 8600 }
}
).sort({ “height”: -1 })

فقط یک کوه واحد – ماکالو – هر دو شرایط زیر را برآورده می کند:

 

Output

{ "_id" : ObjectId("61212a8300c8304536a86b33"), "name" : "Makalu", "height" : 8485, "location" : [ "China", "Nepal" ], "ascents" : { "first" : { "year" : 1955 }, "first_winter" : { "year" : 2009 }, "total" : 361 } }

حالا روش توضیح (“executiveStats”) را اضافه کنید تا نحوه انجام این درخواست توسط MongoDB را بیابید:

db.peaks.find(
{
“ascents.first_winter.year”: { $gt: 1990 },
“height”: { $lt: 8600 }
}
).sort({ “height”: -1 }).explain(“executionStats”)

حتی اگر هیچ شاخصی وجود نداشته باشد که ممکن است بر اولین صعود زمستانی تأثیر بگذارد ، MongoDB به جای انجام یک اسکن کامل مجموعه ، از یک شاخص ایجاد شده قبلی استفاده کرد:

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "height_1",
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 3,
                "totalDocsExamined" : 3,
                . . .
        },
        . . .
}

توجه کنید که این بار ، متفاوت از اعدامهای پرس و جو با نمایه قبلی ، مقدار nReturned که تعداد اسناد برگشتی را نشان می دهد متفاوت از totalKeysExamined و totalDocsExamined است. MongoDB از شاخص میدان واحد در زمینه ارتفاع برای محدود کردن نتایج از 5 به 3 استفاده کرد ، اما سپس مجبور شد اسناد باقی مانده را برای بررسی اولین تاریخ صعود زمستانی اسکن کند.

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

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

تصور کنید که پایگاه داده قله های کوه را مطابق شرایط مطلوب مربوط به اولین صعود و ارتفاع زمستانی آنها به طور منظم جستجو کنید تا به نگرانی عملکرد تبدیل شود و از داشتن یک فهرست سودمند باشد. برای ایجاد یک فهرست بر اساس هر دو زمینه ، روش createIndex (0) زیر را اجرا کنید:

db.peaks.createIndex(
{
“ascents.first_winter.year”: 1,
“height”: -1
}
)

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

MongoDB تصدیق می کند که این فهرست با موفقیت ایجاد شده است:

 

Output

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 4,
        "numIndexesAfter" : 5,
        "ok" : 1
}

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

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

db.peaks.find(
{
“ascents.first_winter.year”: { $gt: 1990 },
“height”: { $lt: 8600 }
}
).sort({ “height”: -1 }).explain(“executionStats”)

این بار پرس و جو دوباره از اسکن فهرست استفاده کرد ، اما شاخص متفاوت است. اکنون ، شاخص ascents.first_winter.year_1_height_-1 که به تازگی ایجاد کرده اید ، بر روی شاخص height_1 که قبلاً استفاده شده بود ، انتخاب می شود:

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "ascents.first_winter.year_1_height_-1",
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 1,
                "totalDocsExamined" : 1,
                . . .
        },
        . . .
}

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

اکنون که نحوه ایجاد فهرست هایی را که شامل بیش از یک زمینه می شود یاد گرفته اید ، می توانید به سراغ یادگیری نمایه های چند کلیدی و نحوه استفاده از آنها بروید.

مرحله 6-ایجاد یک فهرست چند کلیدی

در مثالهای قبلی ، فیلدهای مورد استفاده در فهرستها دارای مقادیر واحد مانند قد ، یک سال یا یک نام در آنها بود. در این موارد ، MongoDB مقدار میدان را مستقیماً به عنوان کلید فهرست ذخیره می کند ، و این شاخص را به سرعت قابل عبور می کند. این مرحله نحوه رفتار MongoDB را نشان می دهد وقتی فیلدی که برای ایجاد ایندکس استفاده می شود ، فیلدی است که مقادیر متعددی مانند آرایه را ذخیره می کند.

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

db.peaks.find(
{ “location”: “Nepal” }
)

چهار قله باز می گردند:

 

Output

{ "_id" : ObjectId("61212a8300c8304536a86b2f"), "name" : "Everest", "height" : 8848, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1953 }, "first_winter" : { "year" : 1980 }, "total" : 5656 } }
{ "_id" : ObjectId("61212a8300c8304536a86b31"), "name" : "Kangchenjunga", "height" : 8586, "location" : [ "Nepal", "India" ], "ascents" : { "first" : { "year" : 1955 }, "first_winter" : { "year" : 1986 }, "total" : 283 } }
{ "_id" : ObjectId("61212a8300c8304536a86b32"), "name" : "Lhotse", "height" : 8516, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1956 }, "first_winter" : { "year" : 1988 }, "total" : 461 } }
{ "_id" : ObjectId("61212a8300c8304536a86b33"), "name" : "Makalu", "height" : 8485, "location" : [ "China", "Nepal" ], "ascents" : { "first" : { "year" : 1955 }, "first_winter" : { "year" : 2009 }, "total" : 361 } }

توجه داشته باشید که هیچ یک از این قله ها فقط در نپال نیستند. هر یک از این چهار قله دارای بیش از یک کشور هستند که توسط فیلدهای مکان آنها مشخص شده است ، که همه آنها مجموعه ای از مقادیر متعدد هستند. علاوه بر این ، این مقادیر می توانند به ترتیب مختلف ظاهر شوند. به عنوان مثال ، لوتسه در [[نپال] ، \ “چین]] ، در حالی که ماکالو در [” چین “،” نپال “] ذکر شده است.

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

db.peaks.createIndex( { “location”: 1 } )

توجه داشته باشید که این نحو با هیچ نمای میدان دیگری متفاوت نیست. MongoDB پیام موفقیت را برمی گرداند و ایندکس اکنون برای استفاده در دسترس است:

 

Output

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 5,
        "numIndexesAfter" : 6,
        "ok" : 1
}

اکنون که یک فهرست برای قسمت مکان ایجاد کرده اید ، پرس و جوی قبلی را مجدداً با متد توضیح (“exeStatStats”) اجرا کنید تا نحوه اجرای آن را درک کنید:

db.peaks.find(
{ “location”: “Nepal” }
).explain(“executionStats”)

خروجی حاصله نشان می دهد که MongoDB از اسکن فهرست بعنوان استراتژی استفاده کرده است و با اشاره به نمای جدید location_1 ایجاد شده است:

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        . . .
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "location_1",
                                "isMultiKey" : true,
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 4,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 4,
                "totalDocsExamined" : 4,
                . . .
        }
        . . .
}

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

به ویژگی isMultiKey که در خروجی true ذکر شده توجه کنید. MongoDB به طور خودکار یک فهرست چند کلیدی برای قسمت مکان ایجاد کرد. اگر یک فهرست برای آرایه های دارای فیلد ایجاد کنید ، MongoDB به طور خودکار تعیین می کند که باید یک فهرست چند کلیدی ایجاد کند و برای هر عنصر از این آرایه ها ورودی های شاخص جداگانه ایجاد می کند.

بنابراین ، برای سندی که دارای فیلد مکان ذخیره آرایه [“چین” ، “نپال”] است ، دو ورودی فهرست جداگانه برای یک سند ، یکی برای چین و دیگری برای نپال ظاهر می شود. به این ترتیب ، MongoDB می تواند از ایندکس به نحو احسن استفاده کند ، حتی اگر query درخواست تطابق جزئی با محتویات آرایه را داشته باشد.

مرحله 7 – فهرست بندی و حذف فهرستها در یک مجموعه

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

برای فهرست بندی تمام نمایه هایی که در مجموعه آموزش در این مجموعه آموزشی تعریف کرده اید ، می توانید از روش getIndexes () استفاده کنید:

db.peaks.getIndexes()

MongoDB فهرست فهرست ها را باز می گرداند ، ماهیت آنها را شرح می دهد و نام آنها را فهرست می کند:

 

Output

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "height" : 1
                },
                "name" : "height_1"
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1"
        },
        {
                "v" : 2,
                "key" : {
                        "ascents.total" : 1
                },
                "name" : "ascents.total_1"
        },
        {
                "v" : 2,
                "key" : {
                        "ascents.first_winter.year" : 1,
                        "height" : -1
                },
                "name" : "ascents.first_winter.year_1_height_-1"
        },
        {
                "v" : 2,
                "key" : {
                        "location" : 1
                },
                "name" : "location_1"
        }
]

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

برای حذف یک فهرست موجود ، می توانید از هر یک از این ویژگی ها با روش dropIndex () استفاده کنید. مثال زیر با استفاده از تعریف محتویات ، شاخص height_1 را حذف می کند:

db.peaks.dropIndex( { “height”: 1 } )

از آنجا که {“height”: 1} با نمای زمینه واحد در ارتفاع به نام height_1 مطابقت دارد ، MongoDB آن فهرست را حذف کرده و با پیامی موفقیت آمیز نشان می دهد که چند شاخص قبل از حذف این مورد وجود داشت:

 

Output

{ "nIndexesWas" : 6, "ok" : 1 }

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

db.peaks.dropIndex(“ascents.first_winter.year_1_height_-1”)

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

 

Output

{ "nIndexesWas" : 5, "ok" : 1 }

با فراخوانی مجدد getIndexes () می توانید تأیید کنید که این دو فهرست در واقع از لیست فهرست مجموعه حذف شده اند:

db.peaks.getIndexes()

این بار ، تنها چهار فهرست باقی مانده فهرست شده است:

 

Output

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1"
        },
        {
                "v" : 2,
                "key" : {
                        "ascents.total" : 1
                },
                "name" : "ascents.total_1"
        },
        {
                "v" : 2,
                "key" : {
                        "location" : 1
                },
                "name" : "location_1"
        }
]

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

نتیجه

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

 

  • behnam gol mohamadi