سرور مجازی

  • ۰
  • ۰

برای بسیاری از برنامه ها در جاوا اسکریپت ، وقتی برنامه نویس کد را به صورت خط به خط می نویسد در همان زمان اجرا می شود. به این کار اجرای همزمان گفته می شود ، زیرا سطرها یکی پس از دیگری، به ترتیبی که نوشته شده اند اجرا می شوند. با این حال ، هر دستورالعملی که شما به رایانه می دهید نیاز به اجرای فوری ندارد. به عنوان مثال ، اگر درخواست شبکه ارسال می کنید ، فرآیند اجرای کد شما باید منتظر بماند تا داده ها قبل از اجرا بر روی آن برگردند. در این حالت ، اگر در حالی که منتظر تکمیل درخواست شبکه هستید ، کد دیگری را اجرا نکند ، وقت تلف می شود. برای حل این مشکل ، توسعه دهندگان از برنامه نویسی ناهمزمان استفاده می کنند ، که در آن خطوط کد به ترتیب متفاوتی از آنچه نوشته شده اند اجرا می شوند. با برنامه نویسی ناهمزمان ، می توانیم در حالی که منتظر هستیم فعالیتهای طولانی مانند درخواست شبکه به پایان برسد، کدهای دیگری را اجرا کنیم.
کد JavaScript در یک فرآیند کامپیوتری بر روی یک رشته واحد اجرا می شود. کد آن به صورت همزمان در این رشته پردازش می شود و فقط یک دستورالعمل در هر زمان اجرا می شود. بنابراین ، اگر ما می خواستیم یک کار طولانی در این رشته انجام دهیم ، تمام کد باقی مانده تا زمان اتمام آن کار مسدود می شد. با اعمال ویژگی های برنامه نویسی ناهمزمان جاوا اسکریپت ، می توان کارهای طولانی مدت را بر روی یک رشته پس زمینه بارگذاری کرد تا از بروز این مشکل جلوگیری شود. پس از اتمام کار ، کدی که برای پردازش داده های کار نیاز داریم بر روی تک رشته اصلی قرار می گیرد.
در این آموزش ، شما می آموزید که چگونه JavaScript با کمک حلقه رویداد وظایف ناهمزمان را مدیریت می کند، به این شکل که وظیفه جدیدی را هنگام انتظار برای کار دیگر انجام می دهد. سپس برنامه ای را ایجاد می کنید که از برنامه نویسی ناهمزمان استفاده می کند تا لیستی از فیلم ها را از یک Studio Ghibli API درخواست کرده و داده ها را در یک فایل CSV ذخیره کنید. کد ناهمزمان به سه روش نوشته خواهد شد: callback ، promise ها ، و با کلمات کلیدی async/await.
توجه: طبق این نوشتار ، برنامه نویسی ناهمزمان دیگر فقط با استفاده از تماسهای برگشتی انجام نمی شود ، اما یادگیری این روش منسوخ می تواند زمینه ای را فراهم کند که نشان دهد چرا جامعه جاوا اسکریپت اکنون از promise ها استفاده میکنند. کلمات کلیدی async / await به ما این امکان را می دهد که از promise ها به روشی کوتاه تر استفاده کنیم ، و به این ترتیب روشی استاندارد برای انجام برنامه نویسی ناهمزمان در جاوا اسکریپت در زمان نوشتن این مقاله میباشد.

پیش نیازها
Node.js بر روی دستگاه توسعه شما نصب شده باشد. در این آموزش از نسخه 10.17.0 استفاده شده است. برای نصب این در macOS یا Ubuntu 18.04 ، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی در macOS یا نصب با استفاده از یک بخش PPA را در راهنمای نحوه نصب Node.js در اوبونتو 18.04 دنبال کنید.
همچنین باید با نصب بسته ها در پروژه خود آشنا باشید. با خواندن راهنمای ما در مورد چگونگی استفاده از ماژول های Node.js با npm و pack.json سریعتر پیش روید.
مهم است که قبل از یادگیری چگونگی استفاده از توابع به صورت ناهمزمان ، برای ایجاد و اجرای توابع در جاوا اسکریپت مشکلی نداشته باشید. اگر به معرفی یا اطلاعات تکمیلی نیاز دارید می توانید راهنمای ما در مورد چگونگی تعریف توابع در JavaScript را بخوانید.
حلقه رویداد
بیایید با مطالعه عملکرد داخلی اجرای عملکرد JavaScript شروع کنیم. درک نحوه این رفتار به شما امکان می دهد تا کدهای ناهمزمان را سنجیده تر بنویسید ، و در آینده به شما در زمینه عیب یابی کد کمک می کند.
از آنجا که مترجم جاوا اسکریپت کد را اجرا می کند ، هر عملکردی که خوانده می شود به call stack در جاوا اضافه می شود. call stack یک ساختار داده لیست مانند است که در آن موارد فقط به بالا می توانند اضافه شوند و از بالا حذف شوند. stack ها از اصل “از آخر وارد شو ، از اول خارج شو” یا LIFO پیروی می کنند. اگر دو مورد را روی stack اضافه کنید ، آخرین مورد اول حذف می شود.
بگذارید با یک مثال با استفاده از call stack ، توضیح دهیم. اگر جاوا اسکریپت با یک تابع functionA () فراخوانی شود ، به call stack اضافه می شود. اگر آن تابع functionA () یکی دیگر از عملکردهای functionB () را فراخوانی کند ، سپس functionB () به قسمت بالای call stack اضافه می شود. همانطور که جاوا اسکریپت اجرای یک عملکرد را کامل می کند ، از call stack حذف می شود. بنابراین جاوا اسکریپت ابتدا functionB () را اجرا می کند ، پس از اتمام آن را از stack جدا میکند و سپس اجرای functionA () را تمام میکند و آن را از call stack حذف میکند. به همین دلیل است که عملکردهای داخلی همیشه قبل از کارکردهای بیرونی آنها اجرا می شوند.
هنگامی که جاوا اسکریپت با یک عمل ناهمزمان مواجه می شود ، مانند نوشتن یک فایل ، آن را به یک جدول در حافظه خود اضافه می کند. این جدول عملکرد را ذخیره میند ، شرط تکمیل اجرای آن و فراخوانی تابغ هنگام اتمام است. با اتمام عمل ، JavaScript عملکرد مرتبط را در صف پیام قرار می دهد. یک صف دیگر ساختار داده لیست مانند است که در آن موارد فقط می توانند به پایین اضافه شوند اما از بالا حذف شوند. در صف پیام ، اگر دو یا چند عملیات ناهمزمان برای اجرای وظایف خود آماده باشد ، عملیات ناهمزمان که ابتدا به اتمام رسیده است ، ابتدا عملکرد خود را برای اجرا مشخص می کند.
توابع در صف پیام منتظرند که به call stack اضافه شوند. این حلقه رویداد یک روند دائمی است که بررسی می کند ایا call stack خالی است یا خیر. اگر اینگونه باشد ، اولین مورد در صف پیام به call stack منتقل می شود. جاوا اسکریپت عملکردهای موجود در صف پیام را بر حسب عملکرد که در کد آن تفسیر می کند، در اولویت بندی قرار می دهد. اثر ترکیبی call stack ، صف پیام و حلقه رویداد اجازه می دهد تا هنگام مدیریت فعالیت های ناهمزمان ، کد JavaScript پردازش شود.
اکنون که درک درستی از حلقه رویداد دارید ، می دانید کد ناهمزمانی که می نویسید چگونه اجرا می شود. با استفاده از این دانش ، اکنون می توانید با سه رویکرد متفاوت ، کد ناهمزمان ایجاد کنید: callback ، promise ها ، و async / await.
برنامه نویسی ناهمزمان با callback
یک عملکرد برگشتی عملکردی است که به عنوان آرگومان به عملکرد دیگر منتقل می شود ، و بعد از اتمام کار دیگر اجرا می شود. ما از callback برای اطمینان از اجرای کد درست بعد از اتمام عملکرد ناهمزمان استفاده می کنیم.
برای مدت ها ، callback رایج ترین مکانیسم برای نوشتن کد ناهمزمان بودند ، اما اکنون اکثرا منسوخ شده اند زیرا می توانند خواندن کد را گیج کننده جلوه دهند. در این مرحله ، نمونه ای از کد ناهمزمان را با استفاده از callback می نویسید تا بتوانید از آن به عنوان مبانی اولیه استفاده کنید تا بهره وری دیگر استراتژی های دیگر را ببینید.
روشهای زیادی برای استفاده از توابع برگشتی در عملکردهای دیگر وجود دارد. به طور کلی ، آنها از این ساختار استفاده می کنند:
function asynchronousFunction([ Function Arguments ], [ Callback Function ]) {
[ Action ]
}

اگرچه برای JavaScript یا Node.js به لحاظ دستوری الزامی نیست که عملکرد callback  را به عنوان آخرین آرگومان عملکرد بیرونی را داشته باشد ، این یک روش معمول است که شناسایی callback  ها را آسان تر می کند. همچنین معمول است که توسعه دهندگان JavaScript از یک عملکرد ناشناس به عنوان callback  استفاده کنند. توابع ناشناس مواردی هستند که بدون نام ایجاد می شوند. معمولاً وقتی یک عملکرد در انتهای لیست آرگومان ها تعریف می شود ، بیشتر قابل خواندن است.
برای توضیح callback ها ، بیایید یک ماژول Node.js ایجاد کنیم که لیستی از فیلم های Studio Ghibli  را در یک فایل می نویسد. ابتدا پوشه ای ایجاد کنید که فایل جاوا اسکریپت و خروجی آن را ذخیره کند:
$ mkdir ghibliMovies
سپس آن پوشه را وارد کنید:
$ cd ghibliMovies
با ایجاد درخواست HTTP به Studio Ghibli API شروع خواهیم کرد که عملکرد callback ما نتایج آن را ثبت می کند. برای این کار ، کتابخانه ای را نصب می کنیم که به ما امکان می دهد به داده های پاسخ HTTP در یک callback دسترسی پیدا کنیم.
در ترمینال خود، npm را آغاز کنید تا بعداً بتوانیم برای بسته های خود مرجع داشته باشیم:
$ npm init -y
سپس ، کتابخانه request را نصب کنید:
$ npm i request –save
اکنون یک فایل جدید با نام callbackMovies.js در یک ویرایشگر متنی مانند nano باز کنید:
$ nano callbackMovies.js
در ویرایشگر متن خود کد زیر را وارد کنید. بیایید با ارسال یک درخواست HTTP با ماژول request  شروع کنیم:
callbackMovies.js
const request = require(‘request’);

request(‘https://ghibliapi.herokuapp.com/films’);

در خط اول ماژول درخواستی را که از طریق npm نصب شده است بارگذاری می کنیم. ماژول تابعی را برمی گرداند که می تواند درخواست HTTP ایجاد کند . سپس آن عملکرد را در request  به صورت ثابت ذخیره می کنیم.
سپس با استفاده از عملکرد request() درخواست HTTP را انجام می دهیم. اکنون بیایید با افزودن تغییرات هایلایت شده ، داده های درخواست HTTP را برای چاپ به کنسول ارسال کنیم:
callbackMovies.js
const request = require(‘request’);

request(‘https://ghibliapi.herokuapp.com/films’, (error, response, body) => {
if (error) {
console.error(`Could not send request to API: ${error.message}`);
return;
}

if (response.statusCode != 200) {
console.error(`Expected status code 200 but received ${response.statusCode}.`);
return;
}

console.log(‘Processing our list of movies’);
movies = JSON.parse(body);
movies.forEach(movie => {
console.log(`${movie[‘title’]}, ${movie[‘release_date’]}`);
});
});

وقتی از تابع request() استفاده می کنیم ، به آن دو پارامتر می دهیم:
آدرس URL وب سایتی که می خواهیم درخواست بدهیم
عملکرد callback که پس از تکمیل درخواست ، خطاها یا پاسخ های موفقیت آمیز را مدیریت می کند
عملکرد callback  ما سه آرگومان دارد: error ، response و body. هنگامی که درخواست HTTP کامل شد ، آرگومان ها بسته به نتیجه به طور خودکار مقادیر میگیرند. اگر درخواست نتواند ارسال شود ، error حاوی یک موضوع است ، اما response و body ، null خواهند بود. اگر درخواست را با موفقیت انجام داد ، پاسخ HTTP در response ذخیره می شود. اگر پاسخ HTTP ما داده ها را برگرداند (در این مثال JSON را دریافت می کنیم) سپس داده ها به صورت body تنظیم می شوند.
عملکرد callback  ما ابتدا بررسی می کند که آیا خطایی دریافت کرده ایم یا خیر. بهترین کار این است که ابتدا خطاها را در یک callback  بررسی کنید تا اجرای callback  با داده های از دست رفته ادامه پیدا نکند. در این حالت خطا و اجرای عملکرد را ثبت می کنیم. سپس کد وضعیت پاسخ را بررسی می کنیم. سرور مجازی ما ممکن است همیشه در دسترس نباشد و API ها می توانند تغییر کنند و باعث نادرست شدن درخواست های معقول شوند. با بررسی اینکه کد وضعیت 200 است ، به این معنی که درخواست “OK” است ، می توانیم اطمینان داشته باشیم که پاسخ ما همان چیزی است که انتظار داریم.
سرانجام ، body پاسخ را به یک Array تجزیه کرده و از طریق هر فیلم حلقه می کنیم تا نام و سال انتشار آن ثبت شود.
پس از ذخیره و خروج از فایل ، این اسکریپت را با دستور زیر اجرا کنید:
$ node callbackMovies.js
خروجی زیر را دریافت خواهید کرد:
Output
Castle in the Sky, 1986
Grave of the Fireflies, 1988
My Neighbor Totoro, 1988
Kiki’s Delivery Service, 1989
Only Yesterday, 1991
Porco Rosso, 1992
Pom Poko, 1994
Whisper of the Heart, 1995
Princess Mononoke, 1997
My Neighbors the Yamadas, 1999
Spirited Away, 2001
The Cat Returns, 2002
Howl’s Moving Castle, 2004
Tales from Earthsea, 2006
Ponyo, 2008
Arrietty, 2010
From Up on Poppy Hill, 2011
The Wind Rises, 2013
The Tale of the Princess Kaguya, 2013
When Marnie Was There, 2014

ما لیستی از فیلمهای Studio Ghibli را با سالی که اکران شدند دریافت کردیم. اکنون بگذارید این برنامه را با نوشتن لیست فیلم هایی که در حال حاضر در فایل هست تکمیل کنیم.
فایل callbackMovies.js را در ویرایشگر متن خود به روز کنید تا کد هایلایت شده زیر را شامل شود ، که یک فایل CSV را با داده های فیلم ما ایجاد می کند:
callbackMovies.js
const request = require(‘request’);
const fs = require(‘fs’);

request(‘https://ghibliapi.herokuapp.com/films’, (error, response, body) => {
if (error) {
console.error(`Could not send request to API: ${error.message}`);
return;
}

if (response.statusCode != 200) {
console.error(`Expected status code 200 but received ${response.statusCode}.`);
return;
}

console.log(‘Processing our list of movies’);
movies = JSON.parse(body);
let movieList = ”;
movies.forEach(movie => {
movieList += `${movie[‘title’]}, ${movie[‘release_date’]}\n`;
});

fs.writeFile(‘callbackMovies.csv’, movieList, (error) => {
if (error) {
console.error(`Could not save the Ghibli movies to a file: ${error}`);
return;
}

console.log(‘Saved our list of movies to callbackMovies.csv’);;
});
});

با دقت به تغییرات هایلایت شده ، می بینیم که ماژول fs را وارد کردیم. این ماژول در تمام نصب های Node.js استاندارد است و شامل روش writeFile () است که می تواند به صورت غیر همزمان در یک فایل بنویسد.
به جای اینکه داده ها را به کنسول وارد کنیم ، اکنون آن را به یک متغیر رشته ای movieList اضافه می کنیم. سپس از writeFile() برای ذخیره محتوای movieList در یک فایل جدید به نام callbackMovies.csv استفاده می کنیم. سرانجام ، برای تابع writeFile () یک callback ارائه می دهیم که یک آرگومان دارد: erorr. این به ما امکان می دهد مواردی را کنترل کنیم که قادر به نوشتن روی یک فایل نیستیم ، به عنوان مثال وقتی کاربری که فرآیند node را در آن اجرا می کنیم ، آن مجوزها را ندارد.
فایل را ذخیره کرده و این برنامه Node.js را بار دیگر با دستور زیر اجرا کنید:
$ node callbackMovies.js
در پوشه ghibliMovies ، callbackMovies.csv را مشاهده خواهید کرد که دارای محتوای زیر است:
callbackMovies.csv
Castle in the Sky, 1986
Grave of the Fireflies, 1988
My Neighbor Totoro, 1988
Kiki’s Delivery Service, 1989
Only Yesterday, 1991
Porco Rosso, 1992
Pom Poko, 1994
Whisper of the Heart, 1995
Princess Mononoke, 1997
My Neighbors the Yamadas, 1999
Spirited Away, 2001
The Cat Returns, 2002
Howl’s Moving Castle, 2004
Tales from Earthsea, 2006
Ponyo, 2008
Arrietty, 2010
From Up on Poppy Hill, 2011
The Wind Rises, 2013
The Tale of the Princess Kaguya, 2013
When Marnie Was There, 2014

توجه به این نکته مهم است که ما در پاسخ به درخواست HTTP در فایل CSV خود می نویسیم. هنگامی که کد در عملکرد callback قرار دارد ، تنها پس از تکمیل درخواست HTTP برای فایل نوشته خواهد شد. اگر می خواستیم بعد از نوشتن فایل CSV خود با یک بانک اطلاعاتی ارتباط برقرار کنیم ، عملکرد غیر ناهمزمان دیگری را ایجاد می کردیم که در پاسخ به writeFile () فراخوانی می شد. هرچه کد غیر ناهمزمان بیشتری داشته باشیم ، عملکردهای callback بیشتری باید سکنی گزیده شوند.
بیایید تصور کنیم که می خواهیم پنج عملیات ناهمزمان را انجام دهیم ، هر کدام فقط در صورت کامل شدن دیگری قادر به اجرا هستند. اگر ما این را کدگذاری می کردیم ، چیزی شبیه به این داشتیم:
doSomething1(() => {
doSomething2(() => {
doSomething3(() => {
doSomething4(() => {
doSomething5(() => {
// final action
});
});
});
});
});

هنگامی که callback های تو در تو خطوط زیادی برای اجرای کد دارند ، بسیار پیچیده تر و غیرقابل خواندن می شوند. هرچه اندازه و پیچیدگی پروژه جاوا اسکریپت بزرگ تر شود ، تا زمانی که نهایتا قابل کنترل نباشد ، این اثر برجسته تر می شود. به همین دلیل ، توسعه دهندگان دیگر از callback برای انجام عملیات غیر همزمان استفاده نمی کنند. برای بهبود دستورات کد ناهمزمان ، می توانیم به جای آن از promise ها استفاده کنیم.
استفاده از promise ها برای برنامه نویسی ناهمزمان مختصر
یک promise یک موضوع JavaScript است که در آینده مقداری را به شما باز می گرداند. توابع ناهمزمان میتوانند به جای مقادیر در هم تنیده، موضوعات promise را برگردانند. اگر در آینده مقداری را دریافت کنیم ، می گوییم این promise تحقق یافته است. اگر در آینده با ارور مواجه شویم ، می گوییم این promise رد شده است. در غیر این صورت ، این promise هنوز در حالت معلق در حال کار است.
promise ها به طور کلی شکل زیر را دارند:
promiseFunction()
.then([ Callback Function for Fulfilled Promise ])
.catch([ Callback Function for Rejected Promise ])

همانطور که در این الگو نشان داده شده است ، promise ها همچنین از توابع callback استفاده می کنند. ما یک تابع callback برای متد then () داریم که وقتی یک promise برآورده می شود اجرا می شود. ما همچنین یک تابع callback برای روش catch() داریم تا خطایی را که هنگام اجرای promise اجرا می شود ، برطرف کنیم.
بیایید با بازنویسی برنامه Studio Ghibli برای استفاده از promise ها ، اولین تجربه را با promise ها بدست آوریم.
Axios یک سرویس دهنده HTTP مبتنی بر promise برای JavaScript است ، بنابراین بیایید ادامه دهیم و آن را نصب کنیم:
$ npm i axios –save
اکنون ، با ویرایشگر متن مورد نظر خود ، یک فایل جدید premMovies.js ایجاد کنید:
$ nano promiseMovies.js
برنامه ما درخواست HTTP را با axios انجام می دهد و سپس از نسخه ویژه promise داده شده مبتنی بر fs برای ذخیره در فایل جدید CSV استفاده می کند.
این کد را در premMovies.js تایپ کنید تا بتوانیم Axios را بارگذاری کنیم و یک درخواست HTTP را به فیلم API ارسال کنیم:
promiseMovies.js
const axios = require(‘axios’);

axios.get(‘https://ghibliapi.herokuapp.com/films’);

در خط اول ماژول axios را بارگذاری می کنیم ، عملکرد برگشتی را در فایل ثابت به نام axios ذخیره می کنیم. سپس از روش axios.get () برای ارسال درخواست HTTP به API استفاده می کنیم.
روش axios.get () ، promise را بر می گرداند. بگذارید این promise را زنجیره ای کنیم تا بتوانیم لیست فیلمهای Ghibli را روی کنسول چاپ کنیم:
promiseMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

axios.get(‘https://ghibliapi.herokuapp.com/films’)
.then((response) => {
console.log(‘Successfully retrieved our list of movies’);
response.data.forEach(movie => {
console.log(`${movie[‘title’]}, ${movie[‘release_date’]}`);
});
})

بگذارید آنچه را که اتفاق می افتد تجزیه کنیم. پس از درخواست HTTP GET با axios.get () ، ما از تابع then() استفاده می کنیم ، که فقط در صورت تحقق promise اجرا می شود. در این حالت ، فیلم ها را مانند مثال callbacks روی صفحه نمایش چاپ می کنیم.
برای بهبود این برنامه ، کد هایلایت شده را برای نوشتن داده های HTTP به یک فایل اضافه کنید:
promiseMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

axios.get(‘https://ghibliapi.herokuapp.com/films’)
.then((response) => {
console.log(‘Successfully retrieved our list of movies’);
let movieList = ”;
response.data.forEach(movie => {
movieList += `${movie[‘title’]}, ${movie[‘release_date’]}\n`;
});

return fs.writeFile(‘promiseMovies.csv’, movieList);
})
.then(() => {
console.log(‘Saved our list of movies to promiseMovies.csv’);
})

ما علاوه بر این ماژول fs را بار دیگر وارد می کنیم. توجه داشته باشید که پس از وارد کردن fs چگونه promise داریم. Node.js شامل نسخه مبتنی بر promise از کتابخانه fs مبتنی بر callback است، بنابراین سازگاری رو به عقب در پروژه های بعدی از بین نمیرود.
اولین عملکرد then() که پردازش درخواست HTTP را انجام می دهد ، اکنون به جای چاپ برای کنسول ، fs.writeFile () را فراخوانی می کند. از آنجا که ما نسخه fs مبتنی بر promise را وارد کردیم ، عملکرد writeFile() ما promise دیگری را برمی گرداند. به این ترتیب ، ما عملکرد then() دیگری را برای زمان تحقق promise writeFile()ایجاد می کنیم.
یک promise می تواند یک promise جدید را برگرداند و به ما امکان می دهد promise های خود را یکی پس از دیگری اجرا کنیم. این امر مسیری را برای ما فراهم می کند که چندین عملیات ناهمزمان را انجام دهیم. به این عمل، زنجیره promise گفته می شود و شبیه به callbackهای تو در تو است. then() دوم فقط پس از آنکه فایل را با موفقیت نوشتیم فراخوانی می شود.
توجه: در این مثال ، ما کد وضعیت HTTP را مانند آنچه در مثال callback انجام دادیم ، بررسی نکردیم. به طور پیش فرض ، axios در صورت دریافت کد وضعیت نشانگر خطا ، به promise خود عمل نمی کند. به همین ترتیب ، دیگر نیازی به اعتبار سنجی آن نداریم.

برای تکمیل این برنامه ، promise را با عملکرد catch() مانند چیزی که در شکل زیر هایلاین شده است زنجیر کنید:
promiseMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

axios.get(‘https://ghibliapi.herokuapp.com/films’)
.then((response) => {
console.log(‘Successfully retrieved our list of movies’);
let movieList = ”;
response.data.forEach(movie => {
movieList += `${movie[‘title’]}, ${movie[‘release_date’]}\n`;
});

return fs.writeFile(‘promiseMovies.csv’, movieList);
})
.then(() => {
console.log(‘Saved our list of movies to promiseMovies.csv’);
})
.catch((error) => {
console.error(`Could not save the Ghibli movies to a file: ${error}`);
});

اگر در زنجیره ی promise ها هیچ یک از promiseها عملی نشد، JavaScript به طور خودکار به تابع catch() می رود. به همین دلیل ما فقط یک شرط catch() داریم حتی اگر دو عملیات ناهمزمان داشته باشیم.
با اجرای دستور زیر بیایید تأیید کنیم که برنامه ما همان خروجی را تولید می کند:
$ node promiseMovies.js
در پوشه ghibliMovies ، فایل sozdaMovies.csv را مشاهده خواهید کرد که شامل موارد زیر است:
promiseMovies.csv
Castle in the Sky, 1986
Grave of the Fireflies, 1988
My Neighbor Totoro, 1988
Kiki’s Delivery Service, 1989
Only Yesterday, 1991
Porco Rosso, 1992
Pom Poko, 1994
Whisper of the Heart, 1995
Princess Mononoke, 1997
My Neighbors the Yamadas, 1999
Spirited Away, 2001
The Cat Returns, 2002
Howl’s Moving Castle, 2004
Tales from Earthsea, 2006
Ponyo, 2008
Arrietty, 2010
From Up on Poppy Hill, 2011
The Wind Rises, 2013
The Tale of the Princess Kaguya, 2013
When Marnie Was There, 2014

با promise ها ، می توانیم کد مختصرتری نسبت به callback صرف بنویسیم. زنجیره promise برای callbackها گزینه ای شفاف تر نسبت به لانه گزینی callbackها است. با این حال ، هنگامی که ما تماس های غیر همزمان برقرار میکنیم ، زنجیره promise ما طولانی تر و حفظ آن سخت تر می شود.
صریح بودن callbackها و promise ها ناشی از نیاز به ایجاد توابعی است که نتیجه کار غیر ناهمزمان را داشته باشیم. تجربه بهتر، انتظار برای نتیجه ناهمزمان و قرار دادن آن در متغیری خارج از تابع است. به این ترتیب ، می توانیم از نتایج در متغیرها استفاده کنیم بدون اینکه تابعی داشته باشیم. ما می توانیم با کلمات کلیدی async و await به این هدف برسیم.
نوشتن JavaScript با async / await
کلمات کلیدی async / await در هنگام کار با promise ها دستور دیگری را ارائه می دهند. به جای اینکه نتیجه یک promise موجود در روش then() را داشته باشیم ، نتیجه به عنوان یک مقدار مانند هر تابع دیگر بازگردانده می شود. ما یک تابع را با کلمه کلیدی async تعریف می کنیم تا به JavaScript بگوییم که این یک عملکرد ناهمزمان است که promise را برمی گرداند. از کلمه کلیدی await استفاده می کنیم تا به JavaScript بگوییم که به جای بازگرداندن خود promise هنگام اجرا ، نتایج promise را برگرداند.
به طور کلی ، استفاده از async/await این چنین است:
async function() {
await [Asynchronous Action]
}

بیایید ببینیم که چگونه استفاده از async / await می تواند برنامه Studio Ghibli ما را بهبود ببخشد. از ویرایشگر متن خود برای ایجاد و باز کردن فایل جدید asyncAwaitMovies.js استفاده کنید:
$ nano asyncAwaitMovies.js
در فایل JavaScript که به تازگی باز شده است ، بیایید با وارد کردن همان ماژول هایی که در مثال promise خود استفاده کرده ایم، شروع کنیم:
asyncAwaitMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

ورودی ها همانند premMovies.js است زیرا async / await از promise ها استفاده می کند.
اکنون ما از کلمه کلیدی async برای ایجاد تابعی با کد ناهمزمان استفاده می کنیم:
asyncAwaitMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

async function saveMovies() {}

ما یک تابع جدید به نام saveMovies () ایجاد می کنیم اما async را در ابتدای تعریف آن قرار می دهیم. این مسئله از این جهت مهم است که ما فقط می توانیم از کلمه کلیدی await در یک عملکرد غیرهمزمان استفاده کنیم.
از کلمه کلیدی await استفاده کنید تا یک درخواست HTTP ایجاد کنید که لیست فیلم ها را از Ghibli API دریافت می کند:
asyncAwaitMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

async function saveMovies() {
let response = await axios.get(‘https://ghibliapi.herokuapp.com/films’);
let movieList = ”;
response.data.forEach(movie => {
movieList += `${movie[‘title’]}, ${movie[‘release_date’]}\n`;
});
}

در عملکرد saveMovies () ما مانند گذشته درخواست HTTP را با axios.get () انجام می دهیم. این بار ، ما آن را با یک تابع then() زنجیر نمی کنیم. در عوض ، قبل از اینکه فراخوانی شود ، await را اضافه می کنیم. هنگامی که جاوا اسکریپت await را می بیند ، تنها پس از اتمام axios.get ()کد باقی مانده تابع را اجرا می کند و متغیر response را تنظیم می کند. کد دیگر داده های فیلم را ذخیره می کند بنابراین می توانیم در یک فایل بنویسیم.
بگذارید داده های فیلم را در یک فایل بنویسیم:
asyncAwaitMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

async function saveMovies() {
let response = await axios.get(‘https://ghibliapi.herokuapp.com/films’);
let movieList = ”;
response.data.forEach(movie => {
movieList += `${movie[‘title’]}, ${movie[‘release_date’]}\n`;
});
await fs.writeFile(‘asyncAwaitMovies.csv’, movieList);
}

همچنین وقتی با fs.writeFile ()در فایل مینوسیم از کلمه کلیدی await استفاده می کنیم.
برای تکمیل این عملکرد ، باید خطاهایی را پیدا کنیم که promise های ما می توانند ایجاد کنند. بیایید این کار را با کپسوله کردن کد خود در یک محفظه try/catch انجام دهیم:
asyncAwaitMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

async function saveMovies() {
try {
let response = await axios.get(‘https://ghibliapi.herokuapp.com/films’);
let movieList = ”;
response.data.forEach(movie => {
movieList += `${movie[‘title’]}, ${movie[‘release_date’]}\n`;
});
await fs.writeFile(‘asyncAwaitMovies.csv’, movieList);
} catch (error) {
console.error(`Could not save the Ghibli movies to a file: ${error}`);
}
}

از آنجا که promise ها می توانند با شکست مواجه شوند ، ما کد ناهمزمان خود را با یک عبارت try/catch رمزگذاری می کنیم. با این کار در صورت عدم موفقیت درخواست HTTP یا عملیات نوشتن فایل ، هر گونه خطایی یافت میشود.
در آخر ، بیایید تابع ناهمزمان saveMovies() را فراخوانی کنیم ، تا وقتی برنامه را با node اجرا می کنیم ، عملی شود
asyncAwaitMovies.js
const axios = require(‘axios’);
const fs = require(‘fs’).promises;

async function saveMovies() {
try {
let response = await axios.get(‘https://ghibliapi.herokuapp.com/films’);
let movieList = ”;
response.data.forEach(movie => {
movieList += `${movie[‘title’]}, ${movie[‘release_date’]}\n`;
});
await fs.writeFile(‘asyncAwaitMovies.csv’, movieList);
} catch (error) {
console.error(`Could not save the Ghibli movies to a file: ${error}`);
}
}

saveMovies();

در یک نگاه ، مانند یک بلوک کد همزمان JavaScript به نظر می رسد. عملکردهای کمتری در اطراف آن منتقل می شود که کمی ساده تر به نظر می رسد. این ترفندهای کوچک باعث می شود کد ناهمزمان با async/await راحت تر حفظ شود.
با وارد کردن این قسمت در ترمینال خود ، این تکرار برنامه را امتحان کنید:
$ node asyncAwaitMovies.js
در پوشه ghibliMovies ، فایل جدید asyncAwaitMovies.csv با محتوای زیر ایجاد می شود:
asyncAwaitMovies.csv
Castle in the Sky, 1986
Grave of the Fireflies, 1988
My Neighbor Totoro, 1988
Kiki’s Delivery Service, 1989
Only Yesterday, 1991
Porco Rosso, 1992
Pom Poko, 1994
Whisper of the Heart, 1995
Princess Mononoke, 1997
My Neighbors the Yamadas, 1999
Spirited Away, 2001
The Cat Returns, 2002
Howl’s Moving Castle, 2004
Tales from Earthsea, 2006
Ponyo, 2008
Arrietty, 2010
From Up on Poppy Hill, 2011
The Wind Rises, 2013
The Tale of the Princess Kaguya, 2013
When Marnie Was There, 2014

اکنون برای مدیریت کد ناهمزمان از ویژگیهای async/await در JavaScript استفاده کرده ایم.
نتیجه
در این آموزش ، شما یاد گرفتید که چگونه JavaScript توابع اجرایی و مدیریت عملیات ناهمزمان را با حلقه رویداد کنترل می کند. سپس برنامه هایی را نوشتید که پس از درخواست HTTP برای داده های فیلم با استفاده از تکنیک های مختلف برنامه نویسی ناهمگام ، فایل CSV ایجاد کرده اند. ابتدا ، از رویکرد منسوخ بر اساس callback استفاده کردید. سپس از promise ها ، و در نهایت async/await استفاده کردید که ترکیب promise را خلاصه تر میکند.
با درک کنونی خود از کد ناهمزمان با Node.js ، می توانید برنامه هایی را تهیه کنید که از برنامه نویسی ناهمزمان بهره مند میشوند ، مانند برنامه هایی که به تماس های API وابسته اند. به این لیست از API های عمومی نگاهی بیندازید. برای استفاده از آنها ، شما باید درخواستهای HTTP ناهمزمان مانند آنچه در این آموزش انجام دادیم را ایجاد کنید. برای مطالعه بیشتر ، سعی کنید برنامه ای بسازید که از این API ها استفاده کند تا تکنیک هایی را که در اینجا آموخته اید تمرین کنید.

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

Cron یک برنامه زمانبندی شغلی مبتنی بر زمان است که در سیستم عاملهای یونیکس مانند، از جمله توزیع های لینوکس یافت می شود. Cron در پس زمینه اجرا می شود و کارهای برنامه ریزی شده با Cron ، که به صورت “cron jobs” شناخته میشوند به طور خودکار انجام می گردند ، و باعث می شود cron برای اتوماسیون کارهای مربوط به تعمیر و نگهداری مفید باشد.
این راهنما مروری بر نحوه برنامه ریزی کارها با استفاده از دستور ویژه cron ارائه می دهد. همچنین به چندین میانبر می رود که می توان برای نوشتن و فهم جدول کارها از آنها استفاده کرد.
پیش نیازها
برای تکمیل این راهنما ، به رایانه ای نیاز دارید که CentOS 8 در آن در حال اجرا باشد. این کامپیوتر می تواند دستگاه محلی شما ، یک ماشین مجازی یا یک سرور مجازی خصوصی مجازی باشد.
صرف نظر از این که از چه نوع رایانه ای برای دنبال کردن این راهنما استفاده می کنید ، باید یک کاربر غیر ریشه با امتیازات ادمین و پیکربندی شده داشته باشد. برای انجام این کار ، راهنمای راه اندازی سرور مجازی اولیه ما را برای CentOS 8 دنبال کنید.
نصب Cron
تقریباً هر توزیع لینوکس به صورت پیش فرض شکلی از cron را به صورت نصب شده دارد. اما ، اگر از دستگاه CentOS 8 استفاده می کنید که cron در آن نصب نشده است ، می توانید آن را با استفاده از dnfنصب کنید.
قبل از نصب cron در دستگاه CentOS 8 ، ایندکس پکیج محلی کامپیوتر را به روز کنید:
$ sudo dnf update

سپس cron را با دستور زیر نصب کنید:
$ sudo dnf install crontabs
این دستور اعلانی صادر میکند که از شما میخواهد تأیید کنید که می خواهید بسته crontabs و متعلقات آن را نصب کنید یا خیر. با فشار دادن y و سپس ENTER این کار را انجام دهید.

با این کار cron روی سیستم شما نصب می شود ، اما لازم است که Daemon را بصورت دستی شروع کنید. همچنین باید اطمینان داشته باشید که هر زمان که سرور مجازی بوت شود ، برای اجرا تنظیم شده است. می توانید هر دو این کارها را با دستور systemctl انجام دهید.

برای شروع cron daemon ، دستور زیر را اجرا کنید:
$ sudo systemctl start crond.service

برای تنظیم cron جهت اجرا هنگام شروع کار سرور مجازی، دستور زیر را تایپ کنید:
$ sudo systemctl enable crond.service

پس از آن ، cron بر روی سیستم شما نصب می شود و برای شروع برنامه ریزی کارها برای شما آماده است.
درک نحوه کار Cron
وظایف cron در یک فایل ویژه به اسم crontab ثبت و مدیریت می شوند. هر پروفایل کاربر در سیستم می تواند crontab مخصوص به خود را داشته باشد تا بتواند کارهایی را ترتیب دهد ، که تحت / var / spool / cron ذخیره می شود.
برای برنامه ریزی یک عملکرد ، فقط کافی است crontab خود را برای ویرایش باز کنید و یک کار نوشته شده در قالب یک cron expression را اضافه کنید. ترکیب عبارات cron را می توان به دو عنصر تقسیم کرد: برنامه ریزی و دستور برای اجرا.
این دستور می تواند تقریباً هر دستوری باشد که معمولاً در خط فرمان اجرا می کنید. مولفه برنامه ریزی دستور به 5 قسمت مختلف تقسیم می شود که به ترتیب زیر نوشته می شوند:
زمان مقادیر مجاز
دقیقه 0-59
ساعت 0-23
روزی از ماه 1-31
ماه 1-12 or JAN-DEC
روز هفته 0-6 or SUN-SAT

وظایفی که با هم در یک crontab برنامه ریزی شده اند به صورت زیر ساختار یافته اند:
minute hour day_of_month month day_of_week command_to_run

در اینجا یک مثال کاربردی از یک عبارت cron آورده شده است. این عبارت هر سه شنبه ساعت 5:30 دقیقه بعد از ظهر فرمان http://www.google.com را اجرا می کند:
30 17 * * 2 curl http://www.google.com
همچنین چند کاراکتر ویژه وجود دارد که می توانید در جزء برنامه یک عبارت Cron درج کنید تا برنامه ریزی ساده تر شود:
*: در عبارات Cron ، ستاره یک متغیر عام است که “all” را نشان می دهد. بنابراین ، یک کار که با * * * * * … برنامه ریزی شده هر دقیقه از هر ساعت از هر روز از هر ماه است.
،: کاما مقادیر برنامه ریزی را برای تشکیل لیست می شکنند. اگر می خواهید یک کار در ابتدا و اواسط هر ساعت انجام شود، به جای نوشتن دو وظیفه جداگانه (به عنوان مثال ، 0 * * * * … و 30 * * * * …) ، می توانید همان عملکرد مشابه را با یک کار یعنی (0,30 * * * * …) به دست آورید.
-: یک خط فاصله طیف وسیعی از مقادیر را در قسمت برنامه نمایش می دهد. به جای داشتن 30 کار برنامه ریزی شده جداگانه برای یک فرمان ،که می خواهید 30 دقیقه اول هر ساعت اجرا شود (مانند 0 * * * * …، 1 * * * * … ، 2 * * * * … ، و غیره) ، می توانید فقط آن را به عنوان 0-29 * * * * … برنامه ریزی کنید …
/: برای بیان یک مقدار مرحله می توانید از فوروارد اسلش با ستاره استفاده کنید. به عنوان مثال ، به جای نوشتن 8 وظیفه جداگانه برای اجرای یک فرمان هر سه ساعت یک بار (مانند 0 ، 0 * * * * … ، 0 3 * * * … ، 0 6 * * * * … ، و غیره) ، می توانید آن را به صورت برنامه ریزی 0 */3 * * * …. کنید .
توجه: شما نمی توانید مقادیر گام را به صورت اختیاری بیان کنید. فقط می توانید از اعداد صحیح استفاده کنید که به طور مساوی در محدوده مجاز از قسمت مورد نظر تقسیم شوند. به عنوان مثال ، در قسمت “ساعت” فقط می توانید یک فوروارد اسلش را با 1 ، 2 ، 3 ، 4 ، 6 ، 8 یا 12 دنبال کنید.
در اینجا چند نمونه دیگر از نحوه استفاده از مؤلفه برنامه ریزی cron آورده شده است:
* * * * – فرمان را هر دقیقه اجرا کنید.
12 * * * * – دستور را 12 دقیقه بعد از هر ساعت اجرا کنید.
0,15,30,45 * * * * – فرمان را هر 15 دقیقه یک بار اجرا کنید.
/ 15 * * * * – دستور را هر 15 دقیقه یک بار اجرا کنید.
0 4 * * * – دستور را هر روز در ساعت 4 صبح اجرا کنید.
0 4 * * 2-4 – فرمان را هر سه شنبه ، چهارشنبه و پنجشنبه ساعت 4:00 صبح اجرا کنید.
20,40 */8 * 7-12 * – فرمان را در 20 و 40 دقیقه هر ساعت 8 هر روز از 6 ماه گذشته سال اجرا کنید.
اگر هر یک از این موارد برای شما گیج کننده ها بود یا برای برنامه ریزی برای کارهای مهم خود کمک میخواهید ، Cronitor یک ویرایشگر برنامه مفید Cron به نام “Crontab Guru” را ارائه می دهد که می توانید برای بررسی صحت برنامه های cron خود استفاده کنید.
مدیریت Crontabs
وقتی برنامه خود را تنظیم کردید و کاری را که می خواهید اجرا کنید، تعیین نمودید، باید آن را در جایی قرار دهید که Daemon شما قادر به خواندن آن باشد.
همانطور که قبلاً ذکر شد ، crontab یک فایل ویژه است که زمان بندی کارها را اجرا می کند. اما ، این کارها به طور مستقیم ویرایش نمیشوند. بلکه ، توصیه می شود از دستور crontab استفاده کنید. این کار به شما امکان می دهد crontab پروفایل کاربر خود را بدون تغییر امتیازات خود با sudo ، ویرایش کنید. دستور crontab همچنین در مورد خطاهای دستوری که در crontab دارید به شما اطلاع می دهد ، در حالی که ویرایش مستقیم آن این کار را نمیکند.
شما می توانید crontab خود را با دستور زیر ویرایش کنید:
$ crontab -e
با این کار ، crontab را در ویرایشگر متن پیش فرض پروفایل کاربرتان باز می کنید.
توجه: در سرور مجازی های جدید CentOS 8 ، دستور crontab -e به طور پیش فرض crontab کاربر شما را با vi باز می کند. vi یک ویرایشگر متن بسیار قدرتمند و قابل انعطاف است ، اما می تواند برای کاربرانی که تجربه کار با آن را ندارند ، کمی خسته کننده باشد.
اگر مایل به استفاده از ویرایشگر متن قابل دسترس تر به عنوان ویرایشگر پیش فرض crontab خود هستید ، می توانید nano را به همین ترتیب نصب و پیکربندی کنید.
برای این کار ، nano را با dnf نصب کنید:
$ sudo dnf install nano

وقتی از شما خواسته شد ، y و سپس ENTER را فشار دهید تا تأیید کنید که می خواهید nano نصب کنید.
برای تنظیم نانو به عنوان ویرایشگر تصویری پیش فرض پروفایل کاربر ، فایل .bash_profile را برای ویرایش باز کنید. اکنون که آن را نصب کرده اید ، می توانید این کار را با nano انجام دهید:
$ nano ~/.bash_profile
در انتهای فایل، خط زیر را اضافه کنید:
~/.bash_profile
. . .
export VISUAL=”nano”

این کار متغیر محیط visual را روی nano تنظیم میکند. visual یک متغیر محیط یونیکس است که بسیاری از برنامه ها از جمله crontab را برای ویراشگر فایل به کار میگیرد. پس از افزودن این خط، فایل را با فشردن CTRL + X، y و سپس enter ذخیره کنید و ببندید.
سپس را .bash_profile دوباره لود کنید تا shell تغییر جدید را دریافت کند:
$ . ~/.bash_profile

هنگامی که در ویرایشگر هستید ، می توانید برنامه خود را با تعریف هر کار در یک خط جدید وارد کنید. در غیر این صورت ، می توانید فعلا crontab را ذخیره کنید و ببندید. اگر crontab خود را با vi ، ویرایشگر پیش فرض CentOS 8 باز کردید ، می توانید این کار را با فشار دادن ESC انجام دهید تا مطمئن شوید در حالت فرمان vi هستید ، سپس x را تایپ کنید و ENTER را فشار دهید.
توجه داشته باشید که در سیستم های لینوکس ، crontab دیگری وجود دارد که تحت دایرکتوری / etc / ذخیره شده است. این crontab یک نوع سیستم گسترده است که دارای یک فیلد اضافی است که برای آن باید مشخصات کاربری هر کار cron تحت آن اجرا شود. این آموزش بر روی crontab های اختصاصی کاربر تمرکز دارد ، اما اگر می خواهید crontab سیستم گسترده را ویرایش کنید ، می توانید با دستور زیر این کار را انجام دهید:
$ sudo nano /etc/crontab
اگر می خواهید محتوای crontab خود را مشاهده کنید ، اما آن را ویرایش نکنید ، می توانید از دستور زیر استفاده کنید:
$ crontab -l
می توانید crontab خود را با دستور زیر پاک کنید:
هشدار: دستور زیر از شما نمی خواهد تأیید کنید که می خواهید crontab خود را پاک کنید یا خیر. فقط در صورتی آن را اجرا کنید که مطمئن هستید می خواهید آن را پاک کنید .
$ crontab -r
این دستور بلافاصله crontab کاربر را حذف می کند. با این وجود، می توانید از فلگ -i استفاده کنید تا این فرمان از شما تأیید بخواهد که آیا واقعاً می خواهید crontab کاربر را حذف کنید:
$ crontab -r -i
Output
crontab: really delete sammy’s crontab?

هنگامی که از شما این تایید خواسته شد ، باید y را وارد کنید تا crontab حذف شود یا n را وارد کنید تا کنسل شود.
مدیریت خروجی عملکرد Cron
از آنجا که کارهای Cron در پس زمینه اجرا می شوند ، همیشه مشخص نیست که آیا با موفقیت اجرا میشوند یا خیر. اکنون که می دانید چگونه از دستور crontab استفاده کنید و چگونه یک کار cron را برنامه ریزی نمایید، می توانید با روش های مختلف هدایت مجدد خروجی کارهای cron شروع به آزمایش کنید تا به شما در ردیابی موفقیت آمیز بودن آنها کمک کند.
اگر یک  mail transfer agent – مانند Sendmail – در سرور مجازی خود نصب و به درستی پیکربندی کرده اید ، می توانید خروجی کارهای cron را به آدرس ایمیل مرتبط با پروفایل کاربر لینوکس خود ارسال کنید. همچنین می توانید با ارائه تنظیمات MAILTO در بالای crontab ، آدرس ایمیل را به صورت دستی مشخص کنید.
به عنوان مثال ، می توانید خطوط زیر را به crontab اضافه کنید. این خطوط شامل عبارت MAILTO به همراه یک آدرس ایمیل مثال میباشد، و همچنین یک دستورالعمل SHELL که به shell میگوید اجرا شود ( در این مثال bash ) ، یک دستورالعمل HOME با اشاره به مسیری که در آن می توانید جستجوی باینری cron را انجام دهید، و یک کار تکی cron :
. . .

MAILTO=”example@vpsgol.net”
SHELL=/bin/bash
HOME=/

* * * * * echo ‘Run this command every minute’

این کار خاص، دستور “هر دقیقه این دستور را اجرا کن” را به همراه دارد و آن خروجی هر دقیقه به آدرس ایمیل مشخص شده پس از دستورالعمل MAILTO ارسال می شود.
همچنین می توانید برای جلوگیری از دریافت ایمیل با خروجی ، خروجی یک کار cron را به یک فایل log یا به یک مکان خالی هدایت کنید.
برای افزودن خروجی یک دستور برنامه ریزی شده در یک فایل log ، >> را به انتهای فرمان اضافه کنید که به دنبال آن نام و مکان یک فایل log به انتخاب شما قرار میگیرد ، مانند این:
* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log

بهتر است بگوییم شما می خواهید از cron برای اجرای یک اسکریپت استفاده کنید اما آن را در پس زمینه اجرا کنید. برای این کار ، می توانید خروجی اسکریپت را به یک مکان خالی ، مانند / dev / null هدایت کنید که بلافاصله تمام داده های نوشته شده برای آن را حذف می کند. به عنوان مثال ، کار cron زیر یک اسکریپت PHP را اجرا می کند و آن را در پس زمینه اجرا می کند:
* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

این کار cron همچنین خطای استاندارد را – که با 2 نمایش داده میشود- به خروجی استاندارد( >&1) هدایت می کند. از آنجا که خروجی استاندارد در حال حاضر به / dev / null هدایت می شود ، اساساً به اسکریپت اجازه می دهد تا بی صدا اجرا شود. حتی اگر crontab حاوی جمله MAILTO باشد ، خروجی این فرمان به آدرس ایمیل مشخص شده ارسال نمی شود.
محدود کردن دسترسی
شما می توانید کاربران مجاز به استفاده از دستور crontab را با فایل های cron.allow و cron.deny مدیریت کنید، که هر دو در فهرست / etc / ذخیره شده اند. اگر فایل cron.deny وجود داشته باشد ، هر کاربر ذکر شده در آن از ویرایش crontab خود منع خواهد شد. اگر cron.allow وجود داشته باشد ، فقط کاربران ذکر شده در آن قادر به ویرایش crontab های خود هستند. اگر هر دو فایل وجود داشته باشد و در هر یک از کاربران یکسان قرار داشته باشد ، فایل cron.allow بر cron.deny غلبه می کند و کاربر قادر به ویرایش crontab خود خواهد بود.
به عنوان مثال ، برای رد دسترسی برای همه کاربران و سپس دسترسی به کاربر ishmael ، می توانید از ترتیب دستور زیر استفاده کنید:
$ sudo echo ALL >>/etc/cron.deny

$ sudo echo ishmael >>/etc/cron.allow
ابتدا، با افزودن ALL به فایل cron.deny ، کلیه کاربران را قفل می کنیم. سپس با اضافه کردن نام کاربری به فایل cron.allow ، به پروفایل کاربر ishmael برای اجرای کارهای cron دسترسی می دهیم.
توجه داشته باشید که اگر یک کاربر دارای امتیازات sudo است ، می تواند crontab کاربر دیگری را با دستور زیر ویرایش کند:
$ sudo crontab -u user -e
با این حال ، اگر cron.deny وجود داشته باشد و کاربرها در آن لیست شده باشند و در cron.allow ذکر نشده باشند ، پس از اجرای دستور قبلی ، خطای زیر را دریافت خواهید کرد:
Output
The user user cannot use this program (crontab)

به صورت پیش فرض، بیشتر cron daemon ها فرض خواهند کرد که همه کاربران به cron دسترسی دارند مگر اینکه cron.allow یا cron.deny وجود داشته باشد.
دستور ویژه
فرمان های کوتاه متعددی وجود دارند که می توانید در فایل crontab خود استفاده کنید تا به ساده سازی برنامه ریزی کاری کمک کند. آنها در اصل میانبرهایی هستند برای برنامه ریزی عددی معادل که به صورت زیر مشخص شده:
Shortcut Shorthand for
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

توجه: همه cron daemon ها (به ویژه نسخه های قدیمی) نمی توانند این ترکیب را تجزیه کنند ، بنابراین قبل از اعتماد به آن ، دوبار بررسی کنید.
علاوه بر این، هر زمان که سرور مجازی شروع به کار کند، @reboot همه فرمان های بعد از خود را اجرا می کند:
@reboot echo “System start up”

استفاده از این میانبرها در هر زمان ممکن می تواند به تفسیر برنامه کارها در crontab شما کمک کند.
نتیجه
Cron یک ابزار انعطاف پذیر و قدرتمند است که می تواند بار بسیاری از وظایف مرتبط با مدیریت سیستم را کاهش دهد. هنگامی که با اسکریپت های shell ترکیب شود ، می توانید کارهایی را که معمولاً خسته کننده یا پیچیده هستند ، به طور خودکار انجام دهید.

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

Eclipse Theia یک Cloud IDE قابل توسعه است که بر روی یک سرور مجازی از راه دور اجرا میشود و از یک مرورگر وب قابل دسترسی است. از لحاظ بصری ، به گونه ای طراحی شده است که به طور مشابه با Microsoft Visual Studio Code دیده شود و با آن کار شود. آنچه Eclipse Theia را از دیگر نرم افزارهای cloud IDE جدا می کند قابلیت توسعه آن است. می توان آن را با استفاده از افزونه های سفارشی اصلاح کرد ، که به شما امکان می دهد یک Cloud IDE متناسب با نیازهای خود تهیه کنید.
در این آموزش ،Eclipse Theia را با استفاده از Docker Compose ، به سرور مجازی Ubuntu 18.04 خود منتقل خواهید کرد. با استفاده از nginx-proxy ، یک سیستم خودکار برای Docker ، آن را در دامنه خود قرار می دهید و با استفاده از یک گواهی نامه Let Encrypt TLS ، که با استفاده از افزونه تخصصی آن تهیه می کنید ، آن را ایمن خواهید کرد. برای مشاهده نسخه جزیی تر این آموزش به راهنمای نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE روی اوبونتو 18.04 مراجعه کنید.
پیش نیازها
⦁ یک سرور مجازی Ubuntu 18.04 با امتیازات اصلی و یک حساب ثانویه و غیر ریشه طبق راهنمای تنظیم اولیه سرور مجازی ما برای Ubuntu 18.04
⦁ Docker نصب شده روی سرور مجازی تان. مرحله 1 و مرحله 2 نحوه نصب Docker را در اوبونتو 18.04 دنبال کنید.
⦁ Docker Compose که روی سرور مجازی شما نصب باشد. مرحله 1 نحوه نصب Docker Compose را در اوبونتو 18.04 دنبال کنید.
⦁ نام دامنه کاملاً ثبت شده. در این آموزش کلا از theia.your_domain استفاده می شود.
⦁ یک ثبت A DNS با theia.your_domain که به آدرس IP عمومی سرور مجازی شما اشاره میکند. برای جزئیات بیشتر در مورد چگونگی اضافه کردن آنها می توانید این معرفی را در DigitalOcean DNS دنبال کنید.
مرحله 1 – استفاده از پروکسی nginx با Let’s Encrypt
دیرکتوری برای ذخیره داده ها برای Eclipse Theia ایجاد کنید
$ mkdir ~/eclipse-theia
به آن مراجعه کنید:
⦁ $ cd ~/eclipse-theia
nginx-proxy-compose.yaml را برای ذخیره پیکربندی Docker Compose برای nginx-proxy ایجاد کنید:
⦁ $ nano nginx-proxy-compose.yaml

خطوط زیر را اضافه کنید:
~/eclipse-theia/nginx-proxy-compose.yaml
version: ‘2’

services:
nginx-proxy:
restart: always
image: jwilder/nginx-proxy
ports:
– “80:80”
– “443:443”
volumes:
– “/etc/nginx/htpasswd:/etc/nginx/htpasswd”
– “/etc/nginx/vhost.d”
– “/usr/share/nginx/html”
– “/var/run/docker.sock:/tmp/docker.sock:ro”
– “/etc/nginx/certs”

letsencrypt-nginx-proxy-companion:
restart: always
image: jrcs/letsencrypt-nginx-proxy-companion
volumes:
– “/var/run/docker.sock:/var/run/docker.sock:ro”
volumes_from:
– “nginx-proxy”

در اینجا شما دو سرویس را تعریف می کنید که Docker Compose اجرا خواهد کرد ، nginx-proxy و همراه آن Let’s Encrypt. برای پروکسی ، jwilder / nginx-proxy را به عنوان تصویر مشخص میکنید، پورت های HTTP و HTTPS را نقشه برداری می کنید ، و حجم هایی را تعریف می کنید که در زمان اجرا در دسترس باشند.
فایل را ذخیره کنید و ببندید.
پیکربندی را به کار بگیرید:
⦁ docker-compose -f nginx-proxy-compose.yaml up -d

خروجی نهایی اینگونه خواهد بود:
Output
Creating network “eclipse-theia_default” with the default driver
Pulling nginx-proxy (jwilder/nginx-proxy:)…
latest: Pulling from jwilder/nginx-proxy
8d691f585fa8: Pull complete
5b07f4e08ad0: Pull complete

Digest: sha256:dfc0666b9747a6fc851f5fb9b03e65e957b34c95d9635b4b5d1d6b01104bde28
Status: Downloaded newer image for jwilder/nginx-proxy:latest
Pulling letsencrypt-nginx-proxy-companion (jrcs/letsencrypt-nginx-proxy-companion:)…
latest: Pulling from jrcs/letsencrypt-nginx-proxy-companion
89d9c30c1d48: Pull complete
668840c175f8: Pull complete

Digest: sha256:a8d369d84079a923fdec8ce2f85827917a15022b0dae9be73e6a0db03be95b5a
Status: Downloaded newer image for jrcs/letsencrypt-nginx-proxy-companion:latest
Creating eclipse-theia_nginx-proxy_1 … done
Creating eclipse-theia_letsencrypt-nginx-proxy-companion_1 … done

مرحله 2 – به کارگیری Eclipse Theia دوکرایز شده
nginx-proxy انتظار دارد که ترکیب های ورود به سیستم در فایلی پس از دامنه نمایش داده شده ، با فرمت htpasswd قرار بگیرند و در زیر فهرست / etc / nginx / htpasswd در کانتینر ذخیره شوند.
نصب htpasswd:
⦁ $ sudo apt install apache2-utils
بسته apache2-utils حاوی برنامه htpasswd است.
دیرکتوری / etc / nginx / htpasswd را ایجاد کنید:
⦁ $ sudo mkdir -p /etc/nginx/htpasswd
یک فایل برای ذخیره ورودها به سیستم برای دامنه خود ایجاد کنید:
⦁ $ sudo touch /etc/nginx/htpasswd/theia.your-domain
دستور زیر را با نام کاربری و رمز عبور اجرا کنید:
⦁ $ sudo htpasswd /etc/nginx/htpasswd/theia.your-domain username
htpasswd در انتهای فایل ، نام کاربری و جفت رمز عبور را اضافه می کند.
پیکربندی را برای استقرار Eclipse Theia ایجاد کنید:
⦁ $ nano eclipse-theia-compose.yaml
خطوط زیر را اضافه کنید:
~/eclipse-theia/eclipse-theia-compose.yaml
version: ‘2.2’

services:
eclipse-theia:
restart: always
image: theiaide/theia:next
init: true
environment:
– VIRTUAL_HOST=theia.your-domain
– LETSENCRYPT_HOST=theia.your-domain

شما یک سرویس واحد به نام eclipse-theia را با restart تنظیم شده روی always و theiaide/theia:next به عنوان تصویر کانتینر تعریف می کنید. همچنین init را روی true تنظیم میکنید. سپس دو متغیر محیط را در بخش environment مشخص می کنید: VIRTUAL_HOST و LETSENCRYPT_HOST.
فایل را ذخیره کنید و ببندید.
اکنون با اجرای دستور زیر Eclipse Theia را به کار بگیرید:
⦁ $ docker-compose -f eclipse-theia-compose.yaml up -d
خروجی نهایی مشابه زیر خواهد بود:
Output

Pulling eclipse-theia (theiaide/theia:next)…
next: Pulling from theiaide/theia
63bc94deeb28: Pull complete
100db3e2539d: Pull complete

Digest: sha256:c36dff04e250f1ac52d13f6d6e15ab3e9b8cad9ad68aba0208312e0788ecb109
Status: Downloaded newer image for theiaide/theia:next
Creating eclipse-theia_eclipse-theia_1 … done

به دامنه مورد استفاده برای Eclipse Theia بروید. مرورگر شما اعلانی را به شما نشان می دهد که از شما خواسته می شود وارد شوید. Eclipse Theia را وارد کرده و GUI ویرایشگر آن را مشاهده خواهید کرد. همچنین یک پدلاک را مشاهده خواهید کرد که نشان می دهد اتصال امن است.

نتیجه
اکنون Eclipse Theia ، یک cloud IDE همه کاره را با استفاده از Docker Compose و nginx-proxy بر روی سرور مجازی Ubuntu 18.04 خود نصب کرده اید. شما آن را با مجوز رایگان Let’s Encrypt TLS ایمن کرده اید و نمونه ای را تنظیم کرده اید تا نیاز به اعتبار ورود به سیستم از طرف کاربر داشته باشید. می توانید به صورت جداگانه روی کد منبع خود و مطالب آن کار کنید و یا با تیم خود همکاری کنید. در صورت نیاز به قابلیت های بیشتر ، می توانید نسخه دیگری از Eclipse Theia خود را نیز ایجاد کنید. برای کسب اطلاعات بیشتر در مورد چگونگی انجام این کار ، به مطالب Theia مراجعه نمایید

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

در JavaScript ، توسعه دهندگان اغلب وقت زیادی را صرف تصمیم گیری در مورد ساختار صحیح داده برای استفاده از آن ها می کنند. این امر به این دلیل است که انتخاب ساختار داده صحیح می تواند بعداً دستکاری آن داده ها را آسانتر کند ، باعث صرفه جویی در وقت و تفسیر آسان تر کد میشود. دو ساختار داده غالب برای ذخیره سازی مجموعه داده ها Objects و Arrays (نوعی Object) هستند. توسعه دهندگان برای ذخیره لیست های فهرست بندی شده از Objects استفاده می کنند. با این حال ، برای ارائه انعطاف پذیری بیشتر به توسعه دهندگان ، مشخصات ECMAScript 2015 دو نوع جدید از Objects قابل تکرار را معرفی کرد: maps ، که به آنها مجموعه ای از جفت های کلید / مقدار سفارش داده می شود ، و sets ، که مجموعه ای از مقادیر منحصر به فرد هستند.
در این مقاله به سراغ مباحث Map و Set می رویم ، چه چیزی آنها را به Objects و Arrays شبیه یا متفاوت می کند ، ویژگی ها و روش های در دسترس برای آنها ، و نمونه هایی از کاربردهای عملی.
maps
Map مجموعه ای از جفت کلیدها / مقدارهایی است که می تواند از هر نوع داده به عنوان کلید استفاده کند و می تواند ترتیب ورودی های آن را حفظ کند. Mapها هم عناصر Objects (یک مجموعه جفت کلید /مقدار منحصر به فرد) و هم Arrays (یک مجموعه مرتب شده) را دارند ، اما از نظر مفهومی بیشتر به Objectها شباهت دارند. دلیل این است که ، گرچه اندازه و ترتیب ورودی ها مانند یک Array حفظ می شود ، اما خود ورودی ها دارای جفت کلیدها و مقدار مانند Objects هستند.
Map ها را می توان با دستور new Map() مقدار اولیه داد:
const map = new Map()

این یک map خالی به ما می دهد:
Output
Map(0) {}

افزودن مقادیر به یک map
با روش set() می توانید مقادیر را به map اضافه کنید. اولین آرگومان کلید خواهد بود ، و آرگومان دوم مقدار خواهد بود.
در زیر سه جفت کلید / مقدار به map اضافه می شود:
map.set(‘firstName’, ‘Luke’)
map.set(‘lastName’, ‘Skywalker’)
map.set(‘occupation’, ‘Jedi Knight’)

در اینجا می بینیم که چگونه Maps عناصری از Objects و Arrays را دارند. مانند یک Array ، یک مجموعه دارای فهرست صفر داریم و همچنین می توانیم بطور پیش فرض تعداد موارد موجود در map را مشاهده کنیم. map ها از علامت => syntax برای نشان دادن جفت های کلید / مقدار به صورت key => value استفاده می کنند:
Output
Map(3)
0: {“firstName” => “Luke”}
1: {“lastName” => “Skywalker”}
2: {“occupation” => “Jedi Knight”}

این مثال شبیه به یک object معمولی با کلیدهای مبتنی بر رشته به نظر میرسد ، اما می توانیم از هر نوع داده به عنوان کلید با map استفاده کنیم.
علاوه بر تنظیم دستی مقادیر روی map ، می توانیم به map مقدار اولیه نیز بدهیم . این کار را با استفاده از یک آرایه ای از آرایه ها که حاوی دو عنصر است نیز میتوان انجام دهیم که هر یک جفت کلید / مقدار هستند و شبیه زیر خواهد بود :
[ [ ‘key1’, ‘value1’], [‘key2’, ‘value2’] ]
Copy

با استفاده از دستور زیر می توانیم همان map را دوباره ایجاد کنیم:
const map = new Map([
[‘firstName’, ‘Luke’],
[‘lastName’, ‘Skywalker’],
[‘occupation’, ‘Jedi Knight’],
])

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

اتفاقاً ، این ترکیب همان نتیجه فراخوانی Object.entries () در یک Object است. همانطور که در بلوک کد زیر نشان داده شده ، روشی آماده برای تبدیل یک object به map فراهم می کند:
const luke = {
firstName: ‘Luke’,
lastName: ‘Skywalker’,
occupation: ‘Jedi Knight’,
}

const map = new Map(Object.entries(luke))

از طرف دیگر ، می توانید یک map را با یک خط کد به یک object یا یک آرایه برگردانید.
دستور زیر map را به یک object تبدیل می کند:
const obj = Object.fromEntries(map)
Copy

به مقدار obj زیر منجر می شود:
Output
{firstName: “Luke”, lastName: “Skywalker”, occupation: “Jedi Knight”}

اکنون ، بیایید یک map را به یک آرایه تبدیل کنیم:
const arr = Array.from(map)
Copy

این دستور منجر به آرایه زیر برای arr خواهد شد:
Output
[ [‘firstName’, ‘Luke’],
[‘lastName’, ‘Skywalker’],
[‘occupation’, ‘Jedi Knight’] ]

کلیدهای map
map ها هر نوع داده را به عنوان یک کلید قبول می کنند ، و اجازه نمی دهند مقادیر کلیدی کپی شوند. ما می توانیم با ایجاد یک map و استفاده از مقادیر غیر رشته ای به عنوان کلید ، و همچنین تنظیم دو مقدار روی یک کلید ، این عمل را نشان دهیم.
ابتدا ، بگذارید یک map را با کلیدهای بدون رشته تنظیم کنیم:
const map = new Map()

map.set(‘1’, ‘String one’)
map.set(1, ‘This will be overwritten’)
map.set(1, ‘Number one’)
map.set(true, ‘A Boolean’)

این مثال ، کلید اول 1 را با کلید بعدی لغو خواهد شد و رشته “1” و عدد 1 را به عنوان کلیدهای منحصر به فرد در نظر میگیرد:
Output
0: {“1” => “String one”}
1: {1 => “Number one”}
2: {true => “A Boolean”}

اگرچه این عقیده رایج است که یک Object معمولی JavaScript می تواند شماره ها ، بولین ها (متغیرهای دوبایتی) و سایر انواع داده های ابتدایی را به عنوان کلید مدیرت کند ، اما در واقع اینگونه نیست ، زیرا objectها همه کلیدها را به رشته تغییر می دهند.
به عنوان نمونه ، یک Object را با یک کلید عددی تنظیم کنید و مقدار یک کلید عددی 1 و یک کلید رشته ای “1” را با هم مقایسه کنید:
// Initialize an object with a numerical key
const obj = { 1: ‘One’ }

// The key is actually a string
obj[1] === obj[‘1’] // true

به همین دلیل اگر سعی کنید از یک Object به عنوان کلید استفاده کنید ، در عوض رشته object Object را چاپ می کند.
به عنوان نمونه ، یک Object ایجاد کنید و سپس آن را به عنوان کلید یک Object دیگر استفاده کنید:
// Create an object
const objAsKey = { foo: ‘bar’ }

// Use this object as the key of another object
const obj = {
[objAsKey]: ‘What will happen?’
}

منجر به خروجی زیر میشود:
Output
{[object Object]: “What will happen?”}

که شبیه حالت Map نیست. سعی کنید یک Object ایجاد کنید و آن را به عنوان کلید map تعیین کنید:
// Create an object
const objAsKey = { foo: ‘bar’ }

const map = new Map()

// Set this object as the key of a Map
map.set(objAsKey, ‘What will happen?’)

کلید عنصر Map اکنون Object ای است که ما ایجاد کرده ایم.
Output
key: {foo: “bar”}
value: “What will happen?”

نکته مهم در مورد استفاده از یک Object یا Array به عنوان یک کلید این است: map از مرجع Object برای مقایسه برابری استفاده ، نه مقدار واقعی Object . در JavaScript، {} === {} خروجی false را باز می گرداند ، زیرا دو Object با وجود یک مقدار (خالی) یکسان نیستند.
این بدان معنی است که با اضافه کردن دو Object منحصر به فرد با یک مقدار مشابه ، map ای با دو ورودی ایجاد می کنید:
// Add two unique but similar objects as keys to a Map
map.set({}, ‘One’)
map.set({}, ‘Two’)

خروجی زیر را به دست میدهد:
Output
Map(2) {{…} => “One”, {…} => “Two”}

اما با استفاده از همان مرجع Object دو بار map را با یک ورودی ایجاد می کنید.
// Add the same exact object twice as keys to a Map
const obj = {}

map.set(obj, ‘One’)
map.set(obj, ‘Two’)

که منجر به خروجی زیر خواهد شد:
Output
Map(1) {{…} => “Two”}

set() دوم ابتدا همان کلید دقیقا مشابه را به روزرسانی میکند، بنابراین ما به یک map می رسیم که فقط یک مقدار دارد.
دریافت و حذف آیتم ها از map
یکی از مضرات کار با Objects اینست که شمارش آنها یا کار با همه کلیدها یا مقادیر دشوار است. در عوض ، ساختار Map دارای ویژگی های داخلی زیادی است که کار با عناصر آنها را مستقیم تر می کند.
ما می توانیم یک map جدید را برای نشان دادن روشها و خصوصیات زیر مقداردهی کنیم: delete(), has(), get(), و  size
// Initialize a new Map
const map = new Map([
[‘animal’, ‘otter’],
[‘shape’, ‘triangle’],
[‘city’, ‘New York’],
[‘country’, ‘Bulgaria’],
])

برای بررسی وجود یک مورد در map از روش has () استفاده کنید. has() یک متغیر بولین را برمی گرداند.
// Check if a key exists in a Map
map.has(‘shark’) // false
map.has(‘country’) // true

برای بازیابی مقدار با کلید از روش get () استفاده کنید.
// Get an item from a Map
map.get(‘animal’) // “otter”

یکی از مزایای خاص Maps نسبت به objects ، این است که می توانید اندازه یک map را ، مانند یک آرایه در هر زمان پیدا کنید. می توانید تعداد آیتم ها را در یک map با ویژگی size  دریافت کنید. این کار شامل مراحل کمتری نسبت به تبدیل یک object به یک آرایه برای یافتن طول خواهد بود.
// Get the count of items in a Map
map.size // 4

برای حذف یک مورد از map با کلید از روش delete() استفاده کنید. اگر یک مورد وجود داشته باشد و حذف شود ، این روش یک حالت بولین true را بازمیگرداند و اگر با هیچ مورد مطابقت نداشته باشد ، false را نمایش میدهد.
// Delete an item from a Map by key
map.delete(‘city’) // true

این دستور منجر به map زیر خواهد شد:
Output
Map(3) {“animal” => “otter”, “shape” => “triangle”, “country” => “Bulgaria”}

سرانجام ، تمام مقادیر یک map با کل map.clear()حذف میشود.
// Empty a Map
map.clear()

این خروجی را خواهید گرفت:
Output
Map(0) {}

کلیدها ، مقادیر و ورودی ها برای map ها
Object ها می توانند با استفاده از ویژگی های سازنده Object ، کلیدها ، مقادیر و ورودی ها را بازیابی کنند. از طرف دیگر map ها دارای نمونه های اولیه هستند که به ما امکان می دهند مستقیماً کلیدها ، مقادیر و ورودی های نمونه map را بدست آوریم.
روش هایkeys(), values(),  entries() همه MapIterator را برمی گردانند ، که شبیه به یک Array است که می توانید در آن از for…of برای ایجاد حلقه بین مقادیر استفاده کنید.
در اینجا مثال دیگری از Map وجود دارد که می توانیم برای نشان دادن این روشها استفاده کنیم:
const map = new Map([
[1970, ‘bell bottoms’],
[1980, ‘leg warmers’],
[1990, ‘flannel’],
])

روش keys() کلیدها را برمی گرداند:
map.keys()
Output
MapIterator {1970, 1980, 1990}

روش values() مقادیر را برمی گرداند:
map.values()
Output
MapIterator {“bell bottoms”, “leg warmers”, “flannel”}

روش entries() آرایه ای از جفت کلید ها/ مقدار را برمی گرداند:
map.entries()
Output
MapIterator {1970 => “bell bottoms”, 1980 => “leg warmers”, 1990 => “flannel”}

تکرار با map
map دارای یک روش داخلی forEach  ، شبیه به یک Array ، برای تکرار داخلی است. با این حال ، تفاوتی در چیزی که تکرار می کنند وجود دارد. callback برای هر forEach در map حول value ، key و خود map تکرار انجام میدهد ، در حالی که نسخه Array در خود item ، index و خود array  تکرار می شود.
// Map
Map.prototype.forEach((value, key, map) = () => {})

// Array
Array.prototype.forEach((item, index, array) = () => {})

این یک مزیت بزرگ برای Maps نسبت به Objects است ، زیرا Objects باید با keys(), values(), یا entries() تبدیل شوند و یک روش ساده برای بازیابی ویژگی های یک Object بدون تبدیل آن وجود ندارد.
برای نشان دادن این مسئله ، اجازه دهید از طریق map خود تکرار انجام دهیم و زوج های کلید / مقدار را در کنسول ثبت کنیم:
// Log the keys and values of the Map with forEach
map.forEach((value, key) => {
console.log(`${key}: ${value}`)
})

خروجی زیر را می دهد:
Output
1970: bell bottoms
1980: leg warmers
1990: flannel

از آنجا که حلقه for…of برای تکرار مواردی مانند map و Array وجود دارد ، می توانیم با تجزیه آرایه آیتم های map نتیجه مشابه را بدست آوریم:
// Destructure the key and value out of the Map item
for (const [key, value] of map) {
// Log the keys and values of the Map with for…of
console.log(`${key}: ${value}`)
}

ویژگی ها و روش های map
جدول زیر لیستی از ویژگی ها و روشهای map برای ارجاع سریع را نشان میدهد:
ویژگی ها/روشها توصیف خروجی
set(key, value) یک جفت کلید/مقدار را به map وارد میکند Map Object
delete(key) یک جفت کلید/مقدار را از map حذف میکند Boolean
get(key) یک مقدار را با کلید برمیگرداند مقدار
has(key) با کلید وجود یک عنصر در map را بررسی میکند داده دو بایتی
clear() تمام آیتم ها را از map حذف میکند N/A
keys() تمام کلیدها در map را بازمیگرداند MapIterator object
values() تمام مقادیر در map را بازمیگرداند MapIterator object
entries() تمام کلیدها و مقادیر در map را به صورت [key, value] بازمیگرداند MapIterator object
forEach() به ترتیب الحاقی در map تکرار میشود N/A
size تعداد آیتم ها در map را بازمیگرداند عدد

چه موقع از map استفاده کنیم
به طور خلاصه ، map ها از نظر جفت های کلید و مقدار مانند objectها هستند ، اما map ها چندین مزیت نسبت به objectها دارند:
اندازه – map ها یک ویژگی size  دارند ، در حالی که objectها برای بازیابی اندازه خود روش داخلی ندارند.
تکرار- map ها مستقیماً قابل تکرار هستند ، در حالی که objectها اینگونه نیستند.
انعطاف پذیری – map ها می توانند از هر نوع داده (اولیه یا object) به عنوان کلید یک مقدار برخوردار باشند ، در حالی که object ها فقط می توانند دارای رشته باشند.
ترتیب – map ها ترتیب درج خود را حفظ می کنند ، در حالی که object ها نظم تضمینی ندارند.
با توجه به این عوامل ، map ها یک ساختار داده قدرتمند هستند که باید مورد توجه قرار گیرند. با این حال ، object ها نیز برخی مزایای مهم دارند:
JSON – objectها بی پروا با JSON.parse () و JSON.stringify () کار می کنند ، دو عملکرد اساسی برای کار با JSON ، یک فرمت داده مشترک که بسیاری از REST APIها با آن سر و کار دارند.
کار با یک عنصر واحد – هنگام کار با یک مقدار شناخته شده در Object ، بدون نیاز به استفاده از یک روش ، مانند ویژگی get() در Map ، می توانید مستقیماً به آن دسترسی داشته باشید.
این لیست به شما کمک می کند تصمیم بگیرید که یک Map یا Object ساختار داده مناسب برای مورد استفاده شما باشد.
set
set مجموعه ای از مقادیر منحصر به فرد است. بر خلاف map ، یک set از نظر مفهومی بیشتر شبیه به یک Array است تا یک Object ، زیرا لیستی از مقادیر است و نه جفت کلید / مقدار. با این حال ، set جایگزینی برای Arrays نیست ، بلکه یک مکمل برای ارائه پشتیبانی بیشتر برای کار با داده های کپی شده میباشد.
می توانید set ها را با ترکیب new Set() مقدار دهی کنید.
const set = new Set()

این set خالی به ما می دهد:
Output
Set(0) {}

با استفاده از روش add () موارد را می توان به set اضافه کرد. (نباید این را با روش set() موجود در map اشتباه گرفت ، اگرچه مشابه هستند).
// Add items to a Set
set.add(‘Beethoven’)
set.add(‘Mozart’)
set.add(‘Chopin’)

از آنجا که set ها فقط می توانند حاوی مقادیر منحصر به فرد باشند ، هرگونه تلاش برای افزودن مقداری که از قبل وجود دارد ، نادیده گرفته می شوند.
set.add(‘Chopin’) // Set will still contain 3 unique values

توجه: همان مقایسه برابری که برای کلیدهای Map کاربرد دارد برای موارد set نیز اعمال می شود. دو object که دارای مقدار یکسانی هستند اما دارای یک مرجع یکسان نیستند برابر نخواهند بود.

همچنین می توانید set ها را با یک آرایه از مقادیر مقداردهی کنید. اگر مقادیر تکراری در آرایه وجود داشته باشد ، آنها از set حذف می شوند.
// Initialize a Set from an Array
const set = new Set([‘Beethoven’, ‘Mozart’, ‘Chopin’, ‘Chopin’])
Output
Set(3) {“Beethoven”, “Mozart”, “Chopin”}

در مقابل ، یک set را می توان با یک خط کد به یک آرایه تبدیل کرد:
const arr = […set]
Output
(3) [“Beethoven”, “Mozart”, “Chopin”]

set بسیاری از روشها و خصوصیات مشابه map را دارد ، از جمله delete()،  has()،  clear()، و  size.
// Delete an item
set.delete(‘Beethoven’) // true

// Check for the existence of an item
set.has(‘Beethoven’) // false

// Clear a Set
set.clear()

// Check the size of a Set
set.size // 0

توجه داشته باشید که Set راهی برای دستیابی به یک مقدار توسط یک کلید یا فهرست مانند Map.get(key) یا arr[index] ندارد.
کلیدها ، مقادیر و ورودی ها برای set ها
map و set هر دو دارای eys(), values(), و entries() هستند که یک تکرار کننده را برمی گرداند. با این حال ، در حالی که هر یک از این روشها دارای یک هدف مشخص در Map هستند ، Setها دارای کلید نیستند ، و بنابراین کلیدها یک اسم مستعار برای مقادیر هستند. این بدان معنی است که keys() و values() هر دو همان تکرار کننده ها را برمی گردانند ، و entries() مقدار را دو برابر باز می گردانند. منطقی ترین کار این است که را فقط از values() با set استفاده شود ، زیرا دو روش دیگر برای تناسب و سازگاری متقابل با Map هستند.
const set = new Set([1, 2, 3])
// Get the values of a set
set.values()
Output
SetIterator {1, 2, 3}

تکرار با set
مانند Map ، Set یک متد داخلی forEach() دارد. از آنجا که Setها کلید ندارند ، اولین و دومین پارامتر callback برای forEach() همان مقدار یکسان را برمیگرداند ، بنابراین هیچ مورد استفاده ای خارج از سازگاری با Map وجود ندارد. پارامترهای forEach () عبارتند از (value, key, set)
هم forEach() و هم for…of می توانند در set استفاده شوند. ابتدا ، تکرار forEach() را مشاهده کنیم:
const set = new Set([‘hi’, ‘hello’, ‘good day’])

// Iterate a Set with forEach
set.forEach((value) => console.log(value))

سپس می توانیم نسخه for…of را بنویسیم:
// Iterate a Set with for…of
for (const value of set) {
console.log(value);
}

هر دو روش خروجی زیر را به دست میدهد:
Output
hi
hello
good day

ویژگی ها و روش های set
در جدول زیر لیستی از ویژگی ها و روش های set برای ارجاع سریع نشان داده شده است:
ویژگی ها/روش ها توصیف خروجی
add(value) آیتم جدیدی را به Set وارد میکند Set Object
delete(value) آیتم مشخصی را از Set حذف میکند Boolean
has() وجود آیتمی را در Set بررسی میکند Boolean
clear() تمام آیتم ها را از Set حذف میکند N/A
keys() تمام مقادیر را به set بازمیگرداند مشابه values() SetIterator object
values() تمام مقادیر را به set برمیگرداند مشابه keys() SetIterator object
entries() تمام مقادیر را به صورت [value, value] به set برمیگرداند SetIterator object
forEach() به ترتیب ورود در set تکرار میشود N/A
size تعداد آیتم ها در set را میدهد Number
زمان استفاده از set
set افزونه مفیدی برای ابزار JavaScript است ، به خصوص برای کار با مقادیر تکراری در داده ها.
در یک خط واحد ، می توانیم یک Array جدید بدون مقادیر تکراری از یک Array ایجاد کنیم که دارای مقادیر تکراری باشد.
const uniqueArray = [ …new Set([1, 1, 2, 2, 2, 3])] // (3) [1, 2, 3]
Copy

خروجی زیر را می دهد:
Output
(3) [1, 2, 3]

set می تواند برای یافتن اجماع ، فصل مشترک و تفاوت بین دو مجموعه داده استفاده شود. با این وجود ، آرایه ها به دلیل داشتن روشهای sort(), map(), filter(), و reduce() و همچنین سازگاری مستقیم با روشهای JSON از مزیت قابل توجهی نسبت به Sets برای دستکاری بیشتر داده ها برخوردار هستند.
نتیجه
در این مقاله ، شما آموختید که یک map مجموعه ای از جفت کلید / مقدار سفارشی است ، و set مجموعه ای از مقادیر منحصر به فرد میباشد. هر دوی این ساختارهای داده قابلیت های بیشتری را به JavaScript اضافه می کنند و به ترتیب کارهای ساده ای مانند یافتن طول مجموعه جفت کلید / مقدار و حذف موارد تکراری از یک مجموعه داده را ساده می کنند. از طرف دیگر ، Objects و Arrays به طور معمول برای ذخیره سازی داده ها و دستکاری در JavaScript مورد استفاده قرار گرفته اند ، و سازگاری مستقیمی با JSON دارند که همچنان آنها را به اساسی ترین ساختار داده ها ، به ویژه برای کار با REST API ها تبدیل می کند. map ها و set ها در درجه اول به عنوان ساختارهای پشتیبانی داده برای Objects و Arrays مفید هستند.
اگر می خواهید در مورد جاوا اسکریپت بیشتر بدانید ، از صفحه اصلی کددهی در مجموعه JavaScript دیدن کنید ، یا به مقاله های مربوط به کد دهی در Node.js مراجعه کنید.

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

اگرچه نصب پیش فرض یک سرور مجازی Apache HTTP در حال حاضر ایمن است ، اما پیکربندی آن با چند اصلاح جزیی قابل بهبود می شود. برای مثال می توانید مکانیزم های امنیتی موجود را با تنظیم محافظت حول کوکی ها و هدرها تکمیل کنید ، بنابراین کانکشن ها در سطح مشتری تحت تاثیر قرار نمیگیرند. با انجام این کار می توانید چندین روش حمله احتمالی مانند حملات اسکریپت Cross-Site (که به عنوان XSS نیز شناخته می شود) را به طرز چشمگیری کاهش دهید. همچنین می توانید از حملات دیگر ، مانند جعل درخواست Cross-Site یا ربودن بخش ها و همچنین حملات رد سرویس جلوگیری کنید.
در این آموزش برخی از مراحل توصیه شده را برای کاهش میزان در معرض قرار گرفتن سرور مجازی خود اجرا خواهید کرد. لیست های دایرکتوری را تأیید می کنید و نمایه سازی را غیرفعال می کنید تا دسترسی به منابع را بررسی کنید. همچنین می توانید مقدار پیش فرض دیرکتیو timeout را تغییر دهید تا به کاهش حملات رد خدمات کمک کنید. علاوه بر این شما روش TRACE را غیرفعال می کنید تا بخش ها قابل برگشت و ربودن نباشند. سرانجام هدرها و کوکی ها را ایمن خواهید کرد.
بیشتر تنظیمات پیکربندی روی فایل اصلی پیکربندی Apache HTTP اعمال می شود که در /usr/local/etc/apache24/httpd.conf وجود دارد.
پیش نیازها
قبل از شروع این راهنما به موارد زیر نیاز خواهید داشت:
سرور مجازی FreeBSD 12 که با پیروی از راهنمای چگونگی شروع با FreeBSD تنظیم شده باشد.
یک فایروال که طبق بخش پیکربندی فایروال در مقاله مراحل پیشنهادی برای سرور مجازی های جدید FreeBSD 12.0 ، راه‌اندازی شده باشد.
یک استک کامل FAMP که با دنبال کردن آموزش نحوه نصب استک Apache ، MySQL و PHP (FAMP) در FreeBSD 12.0 نصب شده باشد.
گواهی Let’s Encrypt که با پیروی از آموزش نحوه ایمن سازی Apache با Let’s Encrypt در FreeBSD ، نصب شده باشد.
با داشتن پیش نیازهای موجود ، شما یک سیستم FreeBSD دارید که دارای استکی است که می تواند با استفاده از هر آنچه که در PHP نوشته شده است ، مانند نرم افزارهای اصلی CMS ، محتوای وب را ارائه دهد. علاوه بر این ، شما اتصالات ایمن را از طریق Let ‘Encrypt رمزگذاری کرده اید.
کاهش اطلاعات سرور مجازی
بنر سیستم عامل روشی است که توسط رایانه ها ، سرور مجازی ها و دستگاه های مختلف مورد استفاده قرار می گیرد تا خود را در شبکه ها نشان دهند. کاربران مخرب می توانند از این اطلاعات برای سوء استفاده از سیستم های مربوطه استفاده کنند. در این بخش می توانید میزان اطلاعات منتشر شده توسط این بنر را کاهش دهید.
مجموعه ای از بخشنامه ها نحوه نمایش این اطلاعات را کنترل می کنند. برای این منظور دستورالعمل ServerTokens مهم میباشد. بصورت پیش فرض تمام جزئیات مربوط به سیستم عامل و ماژول های کامپایل شده را به مشتری که به آن متصل است نمایش می دهد.
شما می توانید از ابزاری برای اسکن شبکه استفاده کنید تا بررسی کنید که قبل از اعمال هرگونه تغییر ، چه اطلاعاتی را نشان می دهد. برای نصب nmap دستور زیر را اجرا کنید:
$ sudo pkg install nmap
برای به دست آوردن آدرس IP سرور مجازی خود ، می توانید دستور زیر را اجرا کنید:
$ ifconfig vtnet0 | awk ‘/inet / {print $2}’
با استفاده از دستور زیر می توانید پاسخ سرور مجازی وب را بررسی کنید:
$ nmap -sV -p 80 your-server-ip
برای ایجاد اسکن (و در نتیجه فلگ s) nmap را به کار میگیرید ، تا نسخه (فلگ –V) را روی پورت 80 (فلگ –p) در IP یا دامنه داده شده نمایش دهید.
اطلاعاتی درباره سرور مجازی وب خود دریافت خواهید کرد ، که مشابه زیر است:
Output
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:30 CET
Nmap scan report for 206.189.123.232
Host is up (0.054s latency).

PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.41 ((FreeBSD) OpenSSL/1.1.1d-freebsd

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds

این خروجی نشان می دهد که اطلاعاتی از قبیل سیستم عامل ، نسخه Apache HTTP و OpenSSL قابل مشاهده هستند. این می تواند برای حمله کنندگان مفید باشد تا اطلاعاتی در مورد سرور مجازی کسب کنند و ابزارهای مناسبی را برای سوء استفاده از آنها انتخاب کنند ، به عنوان مثال یافت آسیب پذیری در نرم افزاری که روی سرور مجازی کار می کند.
دستورالعمل ServerTokens را در فایل اصلی تنظیمات قرار خواهید داد زیرا به طور پیش فرض پیکربندی نشده است. نبود این پیکربندی باعث می شود که Apache HTTP تمام اطلاعات مربوط به سرور مجازی را همانطور که اسناد بیان می کند نمایش دهد. برای محدود کردن اطلاعاتی که درباره سرور مجازی و پیکربندی شما نشان داده شده است ، دستورالعمل ServerTokens را درون فایل اصلی تنظیمات قرار دهید.
شما این دستورالعمل را پس از ورود ServerNameی در فایل پیکربندی قرار می دهید. دستور زیر را برای یافتن دیرکتیو اجرا کنید
$ grep -n ‘ServerName’ /usr/local/etc/apache24/httpd.conf
شماره خطی را پیدا می کنید که می توانید بعد از آن از طریق vi جستجو کنید:
Output226 #ServerName www.example.com:80

دستور زیر را اجرا کنید:
$ sudo vi +226 /usr/local/etc/apache24/httpd.conf

خط هایلایت شده زیر را اضافه کنید:
/usr/local/etc/apache24/httpd.conf
. . .
#ServerName www.example.com:80
ServerTokens Prod

فایل را ذخیره کنید و از آن خارج شوید: wq و ENTER.
تنظیم دستورالعمل ServerTokens روی Prod باعث می شود که فقط نشان دهد این یک سرور مجازی وب Apache میباشد.
برای این کار ، سرور مجازی Apache HTTP را مجدداً راه اندازی کنید:
$ sudo apachectl restart
برای آزمایش تغییرات ، دستور زیر را اجرا کنید:
$ nmap -sV -p 80 your-server-ip
با حداقل اطلاعات در مورد وب سرور مجازی Apache خود ، خروجی مشابه با موارد زیر را مشاهده خواهید کرد:
Output
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:58 CET
Nmap scan report for WPressBSD (206.189.123.232)
Host is up (0.056s latency).

PORT STATE SERVICE VERSION
80/tcp open http Apache httpd

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds

مشاهده کردید که سرور مجازی قبل از تغییر چه اطلاعاتی را اعلام می کرد و اکنون این میزان را به حداقل رسانده اید. با این کار سرنخ های کمتری را برای یک کاربر بیرونی ارائه می دهید. در مرحله بعد لیست دیرکتوری ها را برای سرور مجازی وب خود مدیریت خواهید کرد.
مدیریت لیست های دایرکتوری
در این مرحله اطمینان حاصل می کنید که لیست دیرکتوری به درستی پیکربندی شده است ، بنابراین قسمت های مناسب سیستم طبق برنامه در دسترس عموم است ، در حالی که بقیه بخش ها محافظت می شوند.
توجه: وقتی یک آرگومان اعلام میشود فعال است ، اما + می تواند از لحاظ بصری آن را تقویت کند که در واقع فعال شده است وقتی یک علامت منفی – قرار داده می شود ، آرگومان رد می شود ، برای مثال Options –Indexes.
آرگومان های دارای + و / یا – نمی توانند با هم مخلوط شوند ، این مسئله در Apache HTTP یک ترکیب بد تلقی می شود و ممکن است در هنگام راه اندازی رد شود.
با افزودن عبارت Options -Indexes محتوای داخل مسیر داده /usr/local/www/apache24/data تنظیم می شود تا در صورت وجود یک فایل .html به طور خودکار ایندکس نشود (فهرست شده بخواند) و نشان نمی دهد که آیا URL این دیرکتوری را نقشه برداری می کند یا خیر. این امکان همچنین در هنگام استفاده از تنظیمات هاست مجازی مانند نمونه مورد استفاده برای آموزش پیش نیاز گواهی Let’s Encrypt اعمال می شود.
شما دستورالعمل Options را با آرگومان -Indexes و با دستورالعمل + FollowSymLinks تنظیم می کنید ، که به شما امکان پیگیری پیوندهای نمادین را می دهد. برای مطابقت با قراردادهای HTTP Apache ، از نماد + استفاده خواهید کرد.
دستور زیر را پیدا کنید تا خط را برای ویرایش در فایل پیکربندی پیدا کنید:
$ grep -n ‘Options Indexes FollowSymLinks’ /usr/local/etc/apache24/httpd.conf
خروجی مشابه موارد زیر را مشاهده خواهید کرد:
Output
263 : Options Indexes FollowSymLinks

این دستور را اجرا کنید تا برای ویرایش مستقیماً به خط دسترسی پیدا کنید:
$ sudo vi +263 /usr/local/etc/apache24/httpd.conf

اکنون خط را در هر پیکربندی ویرایش کنید:
/usr/local/etc/apache24/httpd.conf
. . .
#
Options -Indexes +FollowSymLinks

#
. . .

فایل را ذخیره کنید و از آن خارج شوید: wq و ENTER.
Apache HTTP را برای اجرای این تغییرات مجدد راه اندازی کنید:
$ sudo apachectl restart
در دامنه خود در مرورگر ، یک پیام دسترسی ممنوعه مشاهده خواهید کرد ،که به عنوان خطای 403 نیز شناخته می شود. این به دلیل تغییراتی است که شما اعمال کرده اید. قرار دادن -Indexes در بخشنامه options ، امکان ایندکس شدن خودکار Apache HTTP را غیرفعال کرده است ، بنابراین هیچ فایل index.html در مسیر داده وجود ندارد.
می توانید با قرار دادن فایل index.html در داخل VirtualHost که در آموزش مقدماتی گواهی Let’s Encrypt فعال کرده اید ، آن را برطرف کنید. می توانید از بلوک پیش فرض در Apache HTTP استفاده کنید و آن را در همان پوشه DocumentRootthat خود در هاست مجازی قرار دهید.
/usr/local/etc/apache24/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin your_email@your_domain.com
DocumentRoot “/usr/local/www/apache24/data/your_domain.com”
ServerName your_domain.com
ServerAlias www.your_domain.com
ErrorLog “/var/log/your_domain.com-error_log”
CustomLog “/var/log/your_domain.com-access_log” common
</VirtualHost>

برای انجام این کار از دستور زیر استفاده کنید:
$ sudo cp /usr/local/www/apache24/data/index.html /usr/local/www/apache24/data/your_domain.com/index.html
اکنون هنگام بازدید از دامنه خود پیام it works را مشاهده خواهید کرد.
در این بخش شما محدودیت هایی را در دستورالعمل ایندکس ها قرار داده اید تا به طور خودکار محتوای دیگری را به غیر از آنچه شما میخواهید لیست نکند و نمایش ندهد. اکنون اگر یک فایل index.html در مسیر داده وجود نداشته باشد ، Apache HTTP به طور خودکار فهرستی از مطالب ایجاد نمی کند. در مرحله بعد شما فراتر از اطلاعات مبهم پیش می روید و دستورالعمل های مختلف را سفارشی می کنید.
کاهش میزان دستور وقفه (Timeout)
دستورالعمل Timeout محدودیت زمانی را تعیین می کند که Apache HTTP قبل از عدم موفقیت در اتصال ، منتظر ورودی / خروجی جدید باشد. این شکست می تواند به دلیل شرایط مختلف مانند بسته هایی که به سرور مجازی نمی رسند یا داده های دریافتی که توسط مشتری تأیید نمیشوند، رخ دهد.
به طور پیش فرض ، زمان وقفه 60 ثانیه تنظیم میشود. در محیط هایی که سرویس اینترنت کند است ، ممکن است این مقدار پیش فرض معقول باشد ، اما یک دقیقه زمان نسبتا طولانی است ، خصوصاً اگر سرور مجازی با سرویس اینترنت سریعتری دسته ای از کابران را پوشش دهد. علاوه بر این ، زمانی که سرور مجازی اتصال را نمی بندد ، می تواند برای انجام حملات رد سرویس (DoS) مورد سوء استفاده قرار گیرد. در صورت وقوع هجمه ای از این اتصالات مخرب ، سرور مجازی دچار مشکل می شود و احتمالاً اشباع و دچار اخلال می شود.
برای تغییر مقدار ، ورودی های Timeout را در فایل httpd-default.conf پیدا خواهید کرد:
$ grep -n ‘Timeout’ /usr/local/etc/apache24/extra/httpd-default.conf
خروجی مشابه زیر را مشاهده خواهید کرد:
Output
8 # Timeout: The number of seconds before receives and sends time out.
10 Timeout 60
26 # KeepAliveTimeout: Number of seconds to wait for the next request from the
29 KeepAliveTimeout 5
89 RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

در خط خروجی 10 مقدار دستورالعمل Timeout را تعیین می شود. برای دسترسی مستقیم به این خط ، دستور زیر را اجرا کنید:
$ sudo vi +10 /usr/local/etc/apache24/extra/httpd-default.conf
برای مثال ، آن را به 30 ثانیه تغییر می دهید ، مانند زیر:
/usr/local/etc/apache24/extra/httpd-default.conf
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 30

فایل را ذخیره کنید و از آن خارج شوید: wq و ENTER.
مقدار دستورالعمل Timeout باید یک محدوده زمانی را برای آن رویدادها به اندازه کافی بزرگ بگیرد تا ارتباط مستقیم و موفقی برقرار شود ، اما به اندازه کافی هم کوتاه باشد که از تلاشهای غیر مطلوب برای اتصال جلوگیری شود.
توجه: حملات رد سرویس می تواند منابع سرور مجازی را کاملاً تخلیه کند. یک اقدام مکمل و بسیار کارآمد استفاده از MPM رشته ای برای به دست آوردن بهترین عملکرد از نحوه مدیریت اتصالات و پردازش ها توسط Apache HTTP میباشد. در این آموزش یعنی راهنمای چگونگی پیکربندی Apache HTTP با MPM و PHP-FPM در FreeBSD 12.0 ، مراحل ایجاد این قابلیت وجود دارد.

برای این کار ، سرور مجازی Apache HTTP را مجدداً راه اندازی کنید:
$ sudo apachectl restart
شما به منظور کاهش جزئی حملات DoS ، مقدار پیش فرض دستور Timeout را تغییر داده اید.
غیرفعال کردن روش TRACE
پروتکل انتقال Hypertext به دنبال یک مدل کلاینت-سرور مجازی ایجاد شد و به همین ترتیب ، پروتکل متدهای درخواستی برای بازیابی یا قرار دادن اطلاعات از / به سرور مجازی را دارد. سرور مجازی باید این مجموعه روشها و تعامل بین آنها را درک کند. در این مرحله شما حداقل روش های لازم را پیکربندی خواهید کرد.
روش TRACE ، که بی ضرر قلمداد می شد ، برای انجام حملات Cross Site Tracing استفاده میشد. این نوع حملات به کاربران مخرب اجازه می دهد بخش های کاربری را از طریق آن روش سرقت کنند. این سرور مجازی با هدف بازگرداندن همان درخواستی که ابتدا توسط مشتری ارسال شده بود برای اهداف اشکال زدایی طراحی شده است. از آنجا که کوکی از بخش مرورگر به سرور مجازی ارسال می شود ، دوباره ارسال خواهد شد. با این حال ، به طور بالقوه می تواند توسط یک کاربر مخرب متوقف شود ، که می تواند اتصال یک مرورگر را به یک سایت کنترل خود هدایت کند و به سرور مجازی اصلی نرسد.
به خاطر احتمال سوء استفاده از روش TRACE ، استفاده از آن فقط برای اشکال زدایی و نه در تولید توصیه می شود. در این بخش این روش را غیرفعال می کنید.
فایل httpd.conf را با دستور زیر ویرایش کنید و سپس G را فشار دهید تا به انتهای فایل برسید:
$ sudo vi /usr/local/etc/apache24/httpd.conf
مسیر ورودی زیر را در انتهای فایل اضافه کنید:
/usr/local/etc/apache24/httpd.conf
. . .
TraceEnable off

یک عمل خوب این است که فقط روشهایی را مشخص کنید که در سرور مجازی وب Apache HTTP خود استفاده خواهید کرد. این به محدود کردن نقاط ورودی احتمالی کاربران مخرب کمک می کند.
LimitExcept می تواند برای این منظور مفید باشد زیرا هیچ روش دیگری غیر از روش های اعلام شده در خود را اجازه نمی دهد. به عنوان مثال پیکربندی می تواند مانند این ایجاد شود:
/usr/local/etc/apache24/httpd.conf
DocumentRoot “/usr/local/www/apache24/data”
<Directory “/usr/local/www/apache24/data”>
Options -Indexes +FollowSymLinks -Includes
AllowOverride none
<LimitExcept GET POST HEAD>
deny from all
</LimitExcept>
Require all granted
</Directory>

همانطور که در دستورالعمل LimitExcept اعلام شده است ، فقط روش های GET ، POST و HEAD در پیکربندی مجاز هستند.
روش GET بخشی از پروتکل HTTP است و از آن برای بازیابی داده استفاده می شود.
روش POST نیز بخشی از پروتکل HTTP است و برای ارسال داده به سرور مجازی استفاده می شود.
روش HEAD شبیه به GET است ، اما بدنه پاسخ ندارد.
شما از دستور زیر استفاده کرده و بلوک LimitExcept را درون فایل قرار می دهید:
sudo vi +272 /usr/local/etc/apache24/httpd.conf
برای تنظیم این پیکربندی ، بلوک زیر را در ورودی بخشنامه DocumentRoot قرار دهید که از آن مطالب ، به ویژه در قسمت ورودی دایرکتوری خوانده می شود:
/usr/local/etc/apache24/httpd.conf
. . .
<LimitExcept GET POST HEAD>
deny from all
</LimitExcept>
. . .

برای اعمال تغییرات ، Apache HTTP را مجدد راه اندازی کنید:
$ sudo apachectl restart
بخشنامه جدید AllowedMethods عملکردی مشابه را ارائه می کند ، اگرچه وضعیت آن هنوز هم تجربی است.
مشاهده کردید که روشهای HTTP چگونه اند، کاربرد آنها و محافظت آنها در برابر فعالیت های مخرب را با استفاده از روش TRACE و همچنین نحوه اعلام روش های قابل استفاده را آموختید. در مرحله بعد با محافظت های بعدی اختصاص داده شده به هدرها و کوکی های HTTP کار خواهید کرد.
ایمن کردن هدرها و کوکی ها
در این مرحله دستورالعمل های خاصی برای محافظت از بخش هایی که ماشین های کلاینت هنگام بازدید از سرور مجازی وب Apache HTTP شما باز می کنند ، تنظیم خواهید کرد. به این روش سرور شما محتوای ناخواسته را بارگذاری نمی کند ، رمزگذاری تنزل نمی یابد ، و از جاسوسی محتوا جلوگیری خواهید کرد.
هدرها مؤلفه های روش های درخواست هستند. برای تنظیم تایید هویت ، ارتباط بین سرور مجازی و کلاینت ، ذخیره سازی ، مذاکره محتوا و غیره، هدرهایی وجود دارد.
کوکی ها اطلاعاتی هستند که توسط سرور مجازی به مرورگر ارسال می شود. این بیت ها به سرور مجازی اجازه می دهد مرورگر کلاینت را از یک رایانه به رایانه دیگر تشخیص دهد. آنها همچنین به سرورها امکان می دهند بخش های کاربر را تشخیص دهند. به عنوان مثال ، می توانند سبد خرید یک کاربر وارد شده ، اطلاعات پرداخت ، تاریخچه و موارد دیگر را پیگیری کنند. کوکی ها در مرورگر وب کلاینت استفاده و حفظ می شوند زیرا HTTP یک پروتکل بدون وضعیت و هویت است ، به این معنی که با بسته شدن اتصال، سرور درخواست ارسال شده توسط یک کلاینت یا یک کاربر دیگر را به خاطر نمی آورد.
محافظت از هدرها و همچنین کوکی ها بسیار مهم است زیرا آنها بین کلاینت مرورگر وب و سرور مجازی وب ارتباط برقرار می کنند.
ماژول headers  به طور پیش فرض فعال می شود. برای بررسی اینکه بارگذاری شده است ، از دستور زیر استفاده خواهید کرد:
$ sudo apachectl -M | grep ‘headers’
خروجی زیر را مشاهده خواهید کرد:
Output
headers_module (shared)

اگر هیچ خروجی مشاهده نمی کنید ، بررسی کنید که آیا ماژول در فایل httpd.conf در Apache فعال شده است:
$ grep -n ‘mod_headers’ /usr/local/etc/apache24/httpd.conf
به عنوان خروجی ، یک خط بدون شرح را مشاهده می کنید که به ماژول مخصوص برای هدر ها اشاره می کند:
/usr/local/etc/apache24/httpd.conf
. . .
122 LoadModule headers_module libexec/apache24/mod_headers.so
. . .

در صورت وجود ، هشتگ را در ابتدای خط mod_headers.so حذف کنید تا دستورالعمل فعال شود.
با استفاده از دستورالعمل های زیر Apache HTTP ، از هدر ها و کوکی ها در برابر فعالیت مخرب محافظت می کنید تا خطرات مربوط به کلاینت و سرور مجازی ها کاهش یابد.
اکنون شما می توانید محافظت از هدر را تنظیم کنید. تمام این مقادیر هدر را در یک بلوک قرار می دهید. می توانید این مقادیر را طبق دلخواه خود انتخاب کنید ، اما همگی توصیه می شوند.
فایل httpd.conf را با دستور زیر ویرایش کنید و سپس G را فشار دهید تا به انتهای فایل برسید:
$ sudo vi /usr/local/etc/apache24/httpd.conf
بلوک زیر را در انتهای فایل قرار دهید:
/usr/local/etc/apache24/httpd.conf
. . .
<IfModule mod_headers.c>
# Add security and privacy related headers
Header set Content-Security-Policy “default-src ‘self’; upgrade-insecure-requests;”
Header set Strict-Transport-Security “max-age=31536000; includeSubDomains”
Header always edit Set-Cookie (.*) “$1; HttpOnly; Secure”
Header set X-Content-Type-Options “nosniff”
Header set X-XSS-Protection “1; mode=block”
Header set Referrer-Policy “strict-origin”
Header set X-Frame-Options: “deny”
SetEnv modHeadersAvailable true
</IfModule>

Header set Strict-Transport-Security “max-age=31536000; includeSubDomains”: امنیت محکم انتقال HTTP (HTSTS) مکانیزی است برای سرور مجازی های وب و کلاینت ها (به طور عمده مرورگرها) برای برقراری ارتباطات فقط با استفاده از HTTPS . با اجرای این کار شما از حملات واسطه ای جلوگیری می کنید ، که در آن شخص سومی در بین ارتباطات، به طور بالقوه می تواند به بیت دسترسی پیدا کند ، و همچنین آنها را دستکاری کند.
Header always edit Set-Cookie (.*) “$1; HttpOnly; Secure”: فلگ های HttpOnly و Secure در هدرها به جلوگیری از حملات اسکریپتی درون سایت ، که به XSS شناخته میشوند، کمک می کنند. ممکن است کوکی ها توسط حمله کنندگان مورد سوءاستفاده قرار گیرند تا به عنوان بازدید کننده های قانونی که خود را به عنوان شخص دیگری معرفی می کنند ظاهر شوند (سرقت هویت) یا دستکاری انجام دهند.
Header set Referrer-Policy “strict-origin” : عنوان Referrer-Policy تعیین می کند که چه اطلاعاتی به عنوان اطلاعات ارجاع دهنده در قسمت هدر درج شده است.
Header set Content-Security-Policy “default-src ‘self’; upgrade-insecure-requests;” : هدر Content-Security-Policy (CSP) به طور کامل از بارگذاری مطالب مشخص نشده در پارامترها جلوگیری می کند ، که برای جلوگیری ازحملات برنامه نویسی cross-site (XSS) مفید است . پارامترهای ممکن زیادی برای پیکربندی رویکرد این هدر وجود دارد. خط انتهایی پیکربندی آن برای بارگذاری محتوا از همان سایت و به روزرسانی هر محتوا با منبع HTTP است.
Header set X-XSS-Protection “1; mode=block”: این دستور از مرورگرهای قدیمی پشتیبانی می کند که با هدرهای Content-Security-Policy تعامل ندارند. عنوان” X-XSS-Protection ” در برابر حملات اسکریپتینگ Cross-Site محافظت می کند. شما نیازی به تنظیم این هدر ندارید مگر اینکه بخواهدی از نسخه های مرورگر قدیمی ، که نادر است، پشتیبانی کنید.
Header set X-Frame-Options: “deny” : این خط مانع از حملات کلیکی می شود. عنوان “X-Frame-Options” به مرورگر می گوید چه صفحه ای را می توان در <frame> ، <iframe> ، <embed> یا <object> رندر گرفت. به این ترتیب محتوا از سایتهای دیگر نمی تواند در سایتی قرار داده شود و از حملات کلیکی جلوگیری می کند. در اینجا شما همه رندر فریم ها را رد می کنید ، بنابراین صفحه وب نمی تواند در هیچ جای دیگر ، حتی در داخل همان وب سایت ، قرار داده شود. اگر به عنوان مثال ، مجبور به ارائه اجازه رندرگیری برخی صفحات شدید، می توانید این مورد را با نیازهای خود تطبیق دهید ، زیرا تبلیغات یا همکاری با وب سایتهای خاص وجود دارند.
X-Content-Type” Header set X-Content-Type-Options “nosniff”:هدر ‘X-Content-Type-Options’ انواع MIME را کنترل می کند ، بنابراین تغییر نمیکنند و دنبال نمی شوند. انواع MIME استانداردهای فرمت فایل هستند که برای متن ، صدا ، فیلم ، تصویر و غیره کار می کنند. این هدر کاربران مخرب را از سرقت محتوای آن فایل ها و تلاش برای تغییر انواع فایل ها باز می دارد.
اکنون Apache را دوباره راه اندازی کنید تا تغییرات به مرحله اجرا درآیند:
$ sudo apachectl restart
برای بررسی سطح امنیتی تنظیمات پیکربندی خود ، به وب سایت هدرهای امنیتی مراجعه کنید. پس از طی کردن مراحل این آموزش ، دامنه شما نمره A خواهد گرفت.
توجه: اگر با مراجعه به https://securityheaders.com/ ، هدرهای خود را بررسی کردید و درجه F دریافت کردید ، می تواند به این دلیل باشد که هیچ index.html در DocumentRoot سایت شما وجود ندارد ، همانطور که ​​در انتهای مرحله 2 توضیح داده شده است. اگر بررسی هدرهای شما یک درجه متفاوت از A یا F دریافت کرد ، هر خط مجموعه هدر را بررسی کنید و به دنبال هر اشتباهی باشید که ممکن است باعث کاهش رتبه شده باشد.

در این مرحله شما با حداکثر هفت تنظیم کار کرده اید تا امنیت هدرها و کوکی های خود را بهبود بخشید. اینها به جلوگیری از cross-site scripting، clickjacking و انواع دیگر حملات کمک می کند.
نتیجه
در این آموزش با چندین جنبه امنیتی ، از افشای اطلاعات ، تا محافظت از بخش ها ، از طریق تنظیمات پیکربندی جایگزین برای عملکردهای مهم ، آشنا شدید.
برای منابع بیشتر در مورد ایمنی Apache ، در اینجا منابع دیگری ذکر شده است:
نکات امنیتی HTTP Apache
دستورالعمل های امنیتی موزیلا
مرکز توصیه های ممیزی امنیت اینترنتی برای Apache HTTP
ابزارهای بیشتر جهت محافظت از Apache HTTP:
mod_evasive ابزاری مفید برای کمک به کاهش حملات DoS است. می توانید جزئیات بیشتری را در نحوه محافظت در برابر DoS و DDoS با mod_evasive برای آموزش Apache بیابید.
fail2ban یک نرم افزار پیشگیری از نفوذ که برای جلوگیری از تلاش های مکرر ورود به سیستم توسط کاربران غیر مجاز مفید است. می توانید اطلاعات بیشتر را در آموزش نحوه محافظت از سرور مجازی Apache با Fail2Ban دریافت کنید.
ModSecurance یک فایروال برنامه وب (یا WAF) است و به همین ترتیب طیف گسترده ای از امکانات را بر اساس قوانین از پیش تعریف شده که توسط SpyderLabs و اعضای انجمن نوشته شده اند، فراهم می کند. می توانید اطلاعات بیشتر در این مورد را در آموزش نحوه تنظیم ModSecurity با آموزش Apache بخوانید.

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

در این آموزش ، یک پشته LEMP را روی یک سرور مجازی CentOS 8 نصب خواهید کرد. اگرچه MySQL از منابع پیش فرض در CentOS 8 در دسترس است ، این راهنما روند تنظیم پشته LEMP با MariaDB را به عنوان سیستم مدیریت پایگاه داده بیان می کند.
برای یک نسخه کامل تر از این آموزش ، با توضیحات بیشتر در مورد هر مرحله ، لطفاً به نحوه نصب پشته Linux، Nginx، MySQL، PHP (LEMP) در CentOS 8 مراجعه کنید.
پیش نیازها
برای دنبال کردن این راهنما ، باید به عنوان کاربر sudo به یک سرور مجازی CentOS 8 دسترسی داشته باشید.
مرحله 1 – Nginx را نصب کنید
از آنجا که این اولین بار است که از dnf برای این بخش استفاده می کنیم ، با به روزرسانی فهرست بسته سرور مجازی خود شروع به کار کنید. پس از آن ، بسته nginx را نصب کنید:
⦁ $ sudo dnf update

⦁ $ sudo dnf install nginx
پس از اتمام نصب ، دستور زیر را اجرا کنید تا سرور مجازی را فعال و راه اندازی کنید:
⦁ $ sudo systemctl start nginx

اگر firewalld فعال است ، باید دستور زیر را اجرا کنید تا دسترسی خارجی به پورت 80 (HTTP) داده شود:
⦁ $ sudo firewall-cmd –permanent –add-service=http

پیکربندی فایروال را مجدد لود کنید تا تغییرات اعمال شوند:
⦁ $ sudo firewall-cmd –reload
با افزودن قانون فایروال جدید ، می توانید با دسترسی به آدرس IP عمومی یا نام دامنه از مرورگر وب خود ، به روز و فعال بودن سرور مجازی را بررسی کنید. صفحه ای را به این شکل مشاهده خواهید کرد:

مرحله 2 – MariaDB را نصب کنید
اکنون MariaDB ، یک فورک (انشعاب) توسعه یافته از سرور مجازی اصلی MySQL را توسط Oracle نصب خواهیم کرد. برای نصب این نرم افزار ، دستور زیر اجرا کنید:
⦁ $ sudo dnf install mariadb-server
پس از اتمام نصب ، سرور مجازی MariaDB را فعال و راه اندازی کنید:
⦁ $ sudo systemctl start mariadb
برای بهبود امنیت سرور مجازی پایگاه داده خود ، توصیه می شود اسکریپت امنیتی را اجرا کنید که همراه با MariaDB از قبل نصب شده باشد. اسکریپت تعاملی را با این دستور شروع کنید:
⦁ $ sudo mysql_secure_installation
اولین اعلان از شما می خواهد رمز ورود root پایگاه داده فعلی را وارد کنید. از آنجا که شما به تازگی MariaDB را نصب کرده اید و هنوز تغییری در پیکربندی ایجاد نکرده اید ، این گذرواژه خالی خواهد بود ، بنابراین کافی است ENTER را فشار دهید.
اعلان بعدی از شما سؤال می کند که آیا می خواهید رمزعبور ریشه دیتابیس را تنظیم کنید یا خیر. از آنجا که MariaDB از یک روش تأیید هویت ویژه برای کاربر اصلی استفاده می کند که به طور معمول از استفاده از رمز عبور ایمن تر است ، دیگر نیازی به تنظیم آن ندارید. N را تایپ کرده و ENTER را فشار دهید.
از آنجا ، می توانید Y و سپس ENTER را فشار دهید تا پیش فرض برای همه سؤالات بعدی را بپذیرید.
پس از اتمام کار ، با تایپ کردن دستور زیر به کنسول MariaDB وارد شوید:
⦁ $ sudo mysql
این کار به سرور مجازی MariaDB به عنوان ریشه کاربر ادمین پایگاه داده متصل می شود ، که با استفاده از sudo هنگام اجرای این دستور ارجاع داده می شود. باید خروجی مشابه زیر را مشاهده کنید:
Output
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.17-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

MariaDB [(none)]>

برای ایجاد یک پایگاه داده جدید ، دستور زیر را از کنسول MariaDB خود اجرا کنید:
⦁ MariaDB [(none)] CREATE DATABASE example_database;
اکنون می توانید یک کاربر جدید ایجاد کنید و به آنها امتیازات کاملی را در بانک اطلاعاتی سفارشی که اخیراً ایجاد کرده اید ، اعطا کنید:
⦁ MariaDB [(none)] GRANT ALL ON example_database.* TO ‘example_user’@’localhost’ IDENTIFIED BY ‘password’ WITH GRANT OPTION;
برای اطمینان از ذخیره و در دسترس بودن آنها در بخش کنونی ، امتیازات را فلاش کنید:
⦁ MariaDB [(none)] FLUSH PRIVILEGES;
پس از این ، از پوسته MariaDB خارج شوید:
⦁ MariaDB [(none)] exit
مرحله 3 – PHP-FPM را نصب کنید
برای نصب بسته های php-fpm و php-mysql ، دستور زیر اجرا کنید:
⦁ $ sudo dnf install php-fpm php-mysqlnd

پس از اتمام نصب ، برای ایجاد برخی تنظیمات ، باید فایل /etc/php-fpm.d/www.conf را ویرایش کنید. ما برای تسهیل ویرایش این فایل ها nano را نصب خواهیم کرد:
⦁ $ sudo dnf install nano

اکنون فایل پیکربندی /etc/php-fpm.d/www.conf را با استفاده از nano یا ویرایشگر مورد نظر خود باز کنید:
⦁ $ sudo nano /etc/php-fpm.d/www.conf

به دنبال راهنمای user و group باشید. اگر از nano استفاده می کنید ، می توانید CTRL + W را زده تا این عبارات را در فایل باز شده جستجو کنید. مطمئن شوید که هر دو مقدار را از apache به nginx تغییر داده اید:
/etc/php-fpm.d/www.conf

; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

پس از ویرایش ، فایل را ذخیره کنیدو ببندید.
برای فعال سازی و شروع سرویس php-fpm ، دستور زیر را اجرا کنید:
⦁ $ sudo systemctl start php-fpm
در آخر ، سرور مجازی وب Nginx را مجدداً راه اندازی کنید تا فایلهای پیکربندی ایجاد شده توسط نصب php-fpm لود شود:
⦁ $ sudo systemctl restart nginx

مرحله 4 – PHP را با Nginx تست کنید
در CentOS 8 ، نصب پیش فرض php-fpm بطور خودکار فایلهای پیکربندی ایجاد می کند که به سرور مجازی وب Nginx شما امکان می دهد تا فایل های .php را در ریشه سند پیش فرض واقع در / usr / share / nginx / html مدیریت کند. برای اینکه PHP بطور صحیح در سرور مجازی وب کار کند ، نیازی به تغییر در تنظیمات Nginx ندارید.
فقط باید مالک و گروه پیش فرض موجود در ریشه سند Nginx را اصلاح کنید تا بتوانید با استفاده از کاربر معمولی سیستم غیر ریشه خود ، در آن مکان فایل ایجاد کرده و آن را اصلاح کنید:
⦁ $ sudo chown -R sammy.sammy /usr/share/nginx/html/

یک فایل PHP جدید با نام info.php در دیرکتوری / usr / share / nginx / html ایجاد کنید:
⦁ $ nano /usr/share/nginx/html/info.php

کد PHP زیر اطلاعات مربوط به محیط PHP فعلی را که روی سرور مجازی در حال اجرا است نمایش می دهد:
/usr/share/nginx/html/info.php
<?php

phpinfo();

این محتوا را در فایل info.php خود کپی کنید و فراموش نکنید که پس از اتمام آن را ذخیره کنید.
اکنون می توانیم آزمایش کنیم که آیا سرور مجازی وب ما می تواند محتوای تولید شده توسط یک اسکریپت PHP را به درستی نمایش دهد یا خیر. به مرورگر خود بروید و به نام هاست یا آدرس IP سرور مجازی خود به همراه /info.php دسترسی پیدا کنید:
http: //server_host_or_IP/info.php
صفحه ای شبیه به این را مشاهده خواهید کرد:

آموزشهای مرتبط
در اینجا پیوندهایی با راهنماهای دقیق تر مربوط به این آموزش وجود دارد:
⦁ راه اندازی اولیه سرور مجازی در CentOS 8
⦁ نحوه نصب پشته Linux، Nginx، MySQL، PHP (LEMP) در CentOS 8
⦁ مدیریت سوابق DNS در vpsgol

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

مقدمه
پشته نرم افزار LEMP گروهی از نرم افزارهاست که می تواند برای ارائه صفحات پویای وب و برنامه های وب که به زبان PHP نوشته شده اند ، مورد استفاده قرار گیرد. نام “LEMP” مخفف است که به طور معمول یک سیستم عامل لینوکس با سرور مجازی Nginx (بخ صورت Engine-X تلفظ میشود) را توصیف میکند. داده های بکاپ گرفته در یک پایگاه داده MySQL ذخیره می شوند و پردازش پویا توسط PHP انجام می شود.
لایه پایگاه داده در یک پشته (استک) LEMP به طور معمول یک سرور مجازی پایگاه داده MySQL است ، اما قبل از انتشار CentOS 8 ، MySQL از منابع پیش فرض CentOS در دسترس نبود. به همین دلیل ، MariaDB ، یک فورک (انشعاب) برای MySQL ، به جایگزینی برای MySQL به عنوان سیستم دیتابیس پیش فرض برای پشته های LEMP در دستگاه های CentOS ، تبدیل شد. MariaDB به عنوان یک جایگزین درج تصادفی برای سرور مجازی اصلی MySQL کار می کند ، که در عمل به این معنی است که می توانید بدون نیاز به ایجاد پیکربندی یا تغییر کد در برنامه خود ، به MariaDB سوییچ کنید.

در این راهنما ، یک پشته LEMP را روی یک سرور مجازی CentOS 8 نصب خواهید کرد. اگرچه MySQL از منابع پیش فرض در CentOS 8 در دسترس است ، این راهنما روند تنظیم پشته LEMP با MariaDB را به عنوان سیستم مدیریت پایگاه داده بیان می کند.
پیش نیازها
برای دنبال کردن این راهنما ، به دسترسی به یک سرور مجازی CentOS 8به عنوان کاربر غیر ریشه با امتیازات sudo و یک فایروال فعال روی سرور مجازی خود نیاز خواهید داشت. برای این کار ، می توانید راهنمای تنظیم اولیه سرور مجازی ما برای CentOS 8 را دنبال کنید.
مرحله 1 – نصب سرور مجازی وب Nginx
به منظور نمایش صفحات وب برای بازدید کنندگان سایت ، قصد داریم از Nginx ، سرور مجازی وب با کارایی بالا استفاده کنیم. ما برای نصب این نرم افزار از پکیج منیجر dnf ، که منیجر جدید پیش فرض در CentOS 8 است ، استفاده خواهیم کرد.
با دستور زیر بسته nginx را نصب کنید:
⦁ $ sudo dnf install nginx
هنگامی که از شما خواسته شد ، y را وارد کنید تا تأیید کنید که می خواهید nginx را نصب کنید.
پس از اتمام نصب ، دستور زیر را اجرا کنید تا سرور مجازی را فعال و راه اندازی کنید:
⦁ $ sudo systemctl start nginx
در صورت فعال کردن فایروال firewalld طبق دستورالعمل اولیه تنظیم سرور مجازی ما ، باید به Nginx اجازه اتصال دهید. دستور زیر اتصالات HTTP را که بطور پیش فرض روی پورت 80 اجرا می شود به طور دائم فعال می کند:
⦁ $ sudo firewall-cmd –permanent –add-service=http
برای تأیید اینکه تغییر اعمال شده است ، می توانید دستور زیر را اجرا کنید:
⦁ $ sudo firewall-cmd –permanent –list-all
خروجی مانند این را خواهید دید:
Output
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

باید پیکربندی فایروال را مجدد لود کنید تا تغییرات به مرحله اجرا درآیند:
⦁ $ sudo firewall-cmd –reload
با افزودن قانون فایروال جدید ، می توانید با دسترسی به آدرس IP عمومی یا نام دامنه از مرورگر وب خود ، بررسی کنید آیا سرور مجازی به روز و فعال است یا خیر.
توجه: در صورت استفاده از vpsgol به عنوان ارائه دهنده هاست DNS ، می توانید مطالب محصول ما را برای راهنمایی های دقیق در مورد چگونگی تنظیم نام دامنه جدید بررسی کنید و آن را به سرور مجازی خود نشان دهید.

اگر نام دامنه ای ندارید که به سرور مجازی خود نشان دهید و آدرس IP عمومی سرور مجازی خود را نمی شناسید ، می توانید با اجرای دستور زیر آن را پیدا کنید:
⦁ $ ip addr show eth0 | grep inet | awk ‘{ print $2; }’ | sed ‘s/\/.*$//’
با این کار چند آدرس IP چاپ می شود. می توانید به نوبت هر یک از آنها را در مرورگر وب خود امتحان کنید.
به عنوان یک گزینه جایگزین ، می توانید بررسی کنید که کدام آدرس IP قابل دسترسی است ، همانطور که از سایر مکان ها در اینترنت مشاهده می شود:
⦁ $ curl -4 icanhazip.com
آدرسی را که در مرورگر وب خود دریافت می کنید تایپ کنید و شما را به صفحه اول پیش فرض Nginx می برد:

اگر این صفحه را مشاهده کردید ، اکنون سرور مجازی وب شما به درستی نصب شده است.
مرحله 2 – نصب MariaDB
اکنون که وب سرور مجازی خود را فعال کرده اید ، باید یک سیستم پایگاه داده نصب کنید تا بتوانید داده های سایت خود را ذخیره و مدیریت کنید. ما MariaDB ، یک فورک توسعه یافته در جامعه از سرور مجازی اصلی MySQL را توسط Oracle نصب خواهیم کرد.
برای نصب این نرم افزار ، دستور زیر را اجرا کنید:
⦁ $ sudo dnf install mariadb-server
پس از اتمام نصب ، می توانید سرور مجازی MariaDB را فعال کرده و راه اندازی کنید:
⦁ $ sudo systemctl start mariadb
برای بهبود امنیت سرور مجازی پایگاه داده خود ، توصیه می شود اسکریپت امنیتی را اجرا کنید که همراه با MariaDB از قبل نصب شده باشد. این اسکریپت برخی از تنظیمات پیش فرض ناامن را حذف کرده و دسترسی به سیستم پایگاه داده شما را قفل می کند. اسکریپت تعاملی را با اجرا شروع کنید:
⦁ $ sudo mysql_secure_installation
این اسکریپت مجموعه ای از درخواست ها را به شما می آموزد که می توانید در تنظیمات MariaDB خود تغییراتی ایجاد کنید. اولین دستور از شما می خواهد رمز ورود root پایگاه داده فعلی را وارد کنید. این رمز نباید با کاربر root سیستم اشتباه گرفته می شود. کاربر root بانک اطلاعاتی، یک کاربر ادمین با امتیازات کامل نسبت به سیستم دیتابیس است. از آنجا که شما به تازگی MariaDB را نصب کرده اید و هنوز تغییری در پیکربندی ایجاد نکرده اید ، این گذرواژه خالی خواهد بود ، بنابراین کافی است سریعاً ENTER را فشار دهید.
اعلان بعدی از شما میپرسد که آیا می خواهید رمزعبور ریشه دیتابیس را تنظیم کنید یا خیر. از آنجا که MariaDB از یک روش تأیید هویت ویژه برای کاربر اصلی استفاده می کند که به طور معمول از استفاده از رمز عبور ایمن تر است ، دیگر نیازی به تنظیم آن ندارید. N را تایپ کرده و ENTER را فشار دهید.
از آنجا به بعد، می توانید Y و سپس ENTER را فشار دهید تا پیش فرض برای همه سؤالات بعدی را بپذیرید. با این کار کاربران ناشناس و پایگاه داده آزمایشی حذف می شوند ، ورود به سیستم از راه دور را غیرفعال می شود و این قوانین جدید را بارگذاری می کنید تا سرور مجازی بلافاصله تغییراتی که شما انجام داده اید را بشناسد.
پس از اتمام، با تایپ کردن دستور زیر به کنسول MariaDB وارد شوید:
⦁ $ sudo mysql
این کار به سرور مجازی MariaDB به عنوان کاربر root پایگاه داده ادمین متصل می شود ، که با استفاده از sudo هنگام اجرای این دستور به آن اشاره میشود. باید خروجی مشابه زیر را مشاهده کنید:
Output
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.17-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

MariaDB [(none)]>

توجه کنید که برای اتصال به عنوان کاربر اصلی نیازی به گذرواژه ندارید. این امر به این دلیل کار می کند که روش احراز هویت پیش فرض برای کاربر اداری MariaDB به جای password ، unix_socket است. اگرچه ممکن است در ابتدا یک نگرانی امنیتی به نظر برسد ، باعث می شود سرور مجازی پایگاه داده ایمن تر شود زیرا تنها کاربرانی اجازه ورود به عنوان کاربر اصلی MariaDB را دارند که کاربران سیستم با امتیازات sudo باشند و از کنسول یا از طریق برنامه ای که همان امتیازات را دارد، وارد سیستم می شوند. از لحاظ عملی ، این بدان معناست که شما قادر نخواهید بود از کاربر ریشه بانک اطلاعاتی ادمین برای اتصال به برنامه PHP خود استفاده کنید.
برای افزایش امنیت ، بهتر است برای هر بانک اطلاعاتی ، حسابهای کاربری اختصاصی با امتیازات گسترده تری تنظیم کنید ، به خصوص اگر قصد دارید چندین پایگاه داده را در سرور مجازی خود داشته باشید. برای توصیف چنین ستاپی ، یک پایگاه داده با نام example_database و کاربری با نام example_user ایجاد می کنیم ، اما می توانید این نام ها را با مقادیر مختلف جایگزین کنید.
برای ایجاد یک پایگاه داده جدید ، دستور زیر را از کنسول MariaDB خود اجرا کنید:
⦁ MariaDB [(none)]> CREATE DATABASE example_database;
اکنون می توانید یک کاربر جدید ایجاد کنید و از آنها در پایگاه داده سفارشی که اخیراً ایجاد کرده اید ، به آنها امتیاز دهید. دستور زیر رمزعبور کاربر را به عنوان password تعریف می کند ، اما شما باید این مقدار را با یک رمز عبور ایمن با انتخاب خود جایگزین کنید:
⦁ MariaDB [(none)]> GRANT ALL ON example_database.* TO ‘example_user’@’localhost’ IDENTIFIED BY ‘password’ WITH GRANT OPTION;
با این کار به کاربر example_user امتیازات کاملی روی example\_database داده می شود ، در حالی که از ایجاد یا تغییر سایر پایگاه های داده روی سرور مجازی شما جلوگیری می کند.
برای اطمینان از ذخیره و در دسترس بودن آنها در جلسه کنونی ، امتیازات را فلاش کنید:
⦁ MariaDB [(none)]>FLUSH PRIVILEGES;
از پوسته MariaDB خارج شوید:
⦁ MariaDB [(none)]>exit
با ورود دوباره به کنسول MariaDB ، این بار با استفاده از اعتبارات کاربر سفارشی می توانید آزمایش کنید که آیا کاربر جدید ادمین اجازه های لازم را دارد یا خیر.
⦁ $ mysql -u example_user -p
به فلگ -p در این دستور توجه کنید که با استفاده از پسوردی که هنگام ایجاد کاربر example_user انتخاب کرده اید ، شما را راهنمایی می کند. پس از ورود به کنسول MariaDB ، تأیید کنید که به پایگاه داده example\_database دسترسی دارید:
⦁ MariaDB [(none)]> SHOW DATABASES;
این کار خروجی زیر را به شما می دهد:
Output
+——————–+
| Database |
+——————–+
| example_database |
| information_schema |
+——————–+
2 rows in set (0.000 sec)

برای خروج از پوسته MariaDB ، تایپ کنید:
⦁ MariaDB [(none)]> exit
در این مرحله ، سیستم پایگاه داده شما تنظیم شده است و می توانید به سراغ نصب PHP ، مؤلفه نهایی پشته LEMP بروید.
مرحله 3 – نصب PHP-FPM
شما Nginx را برای ارائه مطالب خود و MariaDB را برای ذخیره و مدیریت داده های خود نصب کرده اید. اکنون می توانید PHP را برای پردازش کد و تولید محتوای پویا برای سرور مجازی وب نصب کنید.
در حالی که Apache مفسر PHP را در هر درخواست تعبیه می کند ،Nginx به یک برنامه خارجی نیاز دارد تا پردازش PHP را انجام دهد و به عنوان پلی بین مفسر PHP و سرور مجازی وب عمل کند. این کار باعث می شود عملکرد کلی بهتر در اکثر وب سایتهای مبتنی بر PHP انجام شود ، اما به پیکربندی اضافی نیاز دارد. شما باید php-fpm را که مخفف ” PHP fastCGI process manager ” است ، نصب کنید و به Nginx بگویید که درخواستهای PHP را برای پردازش به این نرم افزار ارسال کند. علاوه بر این ، به php-mysqlnd ، ماژول PHP نیاز خواهید داشت که به PHP اجازه می دهد تا با بانکهای اطلاعاتی مبتنی بر MySQL ارتباط برقرار کند. بسته های اصلی PHP بصورت خودکار به عنوان متعلقات نصب می شوند.
برای نصب بسته های php-fpm و php-mysql ، دستور زیر را اجرا کنید:
⦁ $ sudo dnf install php-fpm php-mysqlnd
پس از اتمام نصب ، برای یک سری تنظیمات ، باید فایل /etc/php-fpm.d/www.conf را ویرایش کنید.
ویرایشگر متن پیش فرض که با CentOS 8 همراه است vi است. vi یک ویرایشگر متن بسیار قدرتمند است ، اما می تواند برای کاربرانی که فاقد تجربه با آن هستند ، تا حدودی خسته کننده باشد. برای تسهیل ویرایش فایل های پیکربندی روی سرور مجازی CentOS 8 خود ، بهتر است ویرایشگر کاربر پسندتر دیگری مانند nano را نصب کنید:
⦁ $ sudo dnf install nano
اکنون فایل پیکربندی /etc/php-fpm.d/www.conf را با استفاده از nano یا ویرایشگر مورد نظر خود باز کنید:
⦁ $ sudo nano /etc/php-fpm.d/www.conf
اکنون به دنبال دیرکتیو user و group باشید. اگر از nano استفاده می کنید ، می توانید CTRL + W را بزنید تا این عبارات را در فایل باز جستجو کنید.
/etc/php-fpm.d/www.conf

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user’s group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

توجه خواهید کرد که متغیرهای user و group برای apache تنظیم شده اند. ما باید این موارد را به nginx تغییر دهیم:
/etc/php-fpm.d/www.conf

; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

پس از ویرایش ، فایل را ذخیره کنید و ببندید. اگر از nano استفاده می کنید ، این کار را با فشار دادن CTRL + X ، سپس Y و ENTER انجام دهید.
برای فعال و شروع سرویس php-fpm ، دستور زیر را اجرا کنید:
⦁ $ sudo systemctl start php-fpm
در آخر ، سرور مجازی وب Nginx را مجدداً راه اندازی کنید تا فایلهای پیکربندی ایجاد شده توسط نصب php-fpm لود شود:
⦁ $ sudo systemctl restart nginx
اکنون سرور مجازی وب شما کاملاً تنظیم شده است. در مرحله بعدی ، ما یک اسکریپت تست PHP ایجاد خواهیم کرد تا مطمئن شویم که همه چیز مطابق آنچه انتظار می رود کار می کند.
مرحله 4 – تست PHP با Nginx
در CentOS 8 ، نصب پیش فرض php-fpm به طور خودکار فایلهای پیکربندی ایجاد می کند که به سرور مجازی وب Nginx شما امکان می دهد تا فایل های .php را در ریشه سند پیش فرض واقع در / usr / share / nginx / html مدیریت کند. برای اینکه PHP بطور صحیح در سرور مجازی وب کار کند ، نیازی به تغییر در تنظیمات Nginx ندارید.
تنها تنظیماتی که انجام خواهیم داد تغییر تنظیمات پیش فرض اجازه در پوشه ریشه سند Nginx است. به این ترتیب ، شما قادر خواهید بود با استفاده از سیستم عادی کاربری خود ، بدون نیاز به پیشوند هر دستور با sudo ، فایل ها را در آن دیرکتوری قرار دهید و اصلاح کنید.
دستور زیر مالکیت ریشه اصلی پیش فرض Nginx را به کاربر و گروهی به نام sammy تغییر می دهد ، بنابراین حتماً نام کاربری و گروه هایلایت شده را در این دستور جایگزین کنید تا نام کاربری و گروه سیستم شما منعکس شود.
⦁ $ sudo chown -R sammy.sammy /usr/share/nginx/html/
اکنون برای این که مطمئن شویم که سرور مجازی وب همانطور که انتظار می رود کار کند ، یک صفحه PHP تست ایجاد می کنیم.
یک فایل PHP جدید با نام info.php در دیرکتوری / usr / share / nginx / html ایجاد کنید:
⦁ $ nano /usr/share/nginx/html/info.php
کد PHP زیر اطلاعات مربوط به محیط PHP فعلی را که روی سرور مجازی در حال اجرا است نمایش می دهد:
/usr/share/nginx/html/info.php
<?php

phpinfo();

پس از اتمام ، فایل را ذخیره کنید و ببندید.
اکنون می توانیم آزمایش کنیم که آیا سرور مجازی وب ما می تواند محتوای تولید شده توسط یک اسکریپت PHP را به درستی نمایش دهد یا خیر. به مرورگر خود بروید و به نام هاست یا آدرس IP سرور مجازی خود که در ادامه اش /info.php دارد دسترسی پیدا کنید:
http: //server_host_or_IP/info.php
صفحه ای شبیه به این را مشاهده خواهید کرد:

پس از بررسی اطلاعات مربوط به سرور مجازی PHP خود از طریق آن صفحه ، بهتر است فایل ایجاد شده را حذف کنید زیرا حاوی اطلاعات حساسی در مورد محیط PHP و سرور مجازی CentOS شما است. برای حذف آن فایل می توانید از rm استفاده کنید:
⦁ $ rm /usr/share/nginx/html/info.php
در صورت نیاز بعداً می توانید این فایل را دوباره بازتولید کنید. در مرحله بعد ، اتصال بانک اطلاعاتی را از طرف PHP آزمایش خواهیم کرد.
مرحله 5 – آزمایش اتصال به بانک اطلاعاتی از PHP (اختیاری)
اگر می خواهید تست کنید که PHP قادر به اتصال به MariaDB و اجرای درخواست های پایگاه داده است ، می توانید یک جدول آزمایشی با داده ها و درخواست های ساختگی برای محتوای آن از یک اسکریپت PHP ایجاد کنید.
ابتدا با کاربر پایگاه داده ای که در مرحله 2 این راهنما ایجاد کرده اید به کنسول MariaDB متصل شوید:
⦁ $ mysql -u example_user -p
یک جدول با نام todo_list ایجاد کنید. از کنسول MariaDB عبارت زیر را اجرا کنید:
CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);

اکنون ، چند ردیف از محتوا را در جدول تست وارد کنید. بهتر است با استفاده از مقادیر مختلف دستور بعدی را چند بار تکرار کنید:
⦁ MariaDB [(none)]> INSERT INTO example_database.todo_list (content) VALUES (“My first important item”);
برای تأیید اینکه داده ها با موفقیت در جدول شما ذخیره شده اند ، این دستور را اجرا کنید:
⦁ MariaDB [(none)]> SELECT * FROM example_database.todo_list;
خروجی زیر را مشاهده خواهید کرد:
Output
+———+————————–+
| item_id | content |
+———+————————–+
| 1 | My first important item |
| 2 | My second important item |
| 3 | My third important item |
| 4 | and this one more thing |
+———+————————–+
4 rows in set (0.000 sec)

پس از تأیید اینکه داده های معتبری در جدول آزمون خود دارید ، می توانید از کنسول MariaDB خارج شوید:
⦁ MariaDB [(none)]> exit
اکنون می توانید اسکریپت PHP را ایجاد کنید که به MariaDB وصل شود و محتوای خود را جستجو کنید. با استفاده از ویرایشگر مورد نظر خود ، یک فایل PHP جدید را در دیرکتوری ریشه وب خود ایجاد کنید. ما برای این کار از nano استفاده خواهیم کرد:
⦁ $ nano /usr/share/nginx/html/todo_list.php
محتوای زیر را به متن PHP خود اضافه کنید:

/usr/share/nginx/html/todo_list.php
<?php
$user = “example_user”;
$password = “password”;
$database = “example_database”;
$table = “todo_list”;

try {
$db = new PDO(“mysql:host=localhost;dbname=$database”, $user, $password);
echo “<h2>TODO</h2><ol>”;
foreach($db->query(“SELECT content FROM $table”) as $row) {
echo “<li>” . $row[‘content’] . “</li>”;
}
echo “</ol>”;
} catch (PDOException $e) {
print “Error!: ” . $e->getMessage() . “<br/>”;
die();
}

پس از پایان ویرایش ، فایل را ذخیره کنید و ببندید.
اکنون می توانید با مراجعه به نام هاست سرور مجازی یا آدرس IP عمومی خود که در ادامه اش /todo_list.php دارد، به این صفحه در مرورگر وب خود دسترسی پیدا کنید:
http: //server_host_or_IP/todo_list.php
باید صفحه ای مانند این را مشاهده کنید ، که محتویاتی را که در جدول آزمایش خود وارد کرده اید نشان دهد:

این بدان معناست که محیط PHP شما آماده اتصال و تعامل با سرور مجازی MariaDB شماست.
نتیجه
در این راهنما ، با استفاده از Nginx به عنوان سرور مجازی وب ، پایه ای انعطاف پذیر برای ارائه وب سایت ها و برنامه های PHP به بازدید کنندگان خود ایجاد کرده اید. شما Nginx را تنظیم کرده اید تا بتوانید درخواست های PHP را از طریق php-fpm انجام دهید ، همچنین یک پایگاه داده MariaDB را برای ذخیره اطلاعات وب سایت خود تنظیم نموده اید.

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

migrations و seeders ابزارهای قدرتمندی در بانک اطلاعاتی هستند که توسط چارچوب Laravel PHPفراهم شده است تا به توسعه دهندگان اجازه دهد سریعاً به صورت خودکار راه اندازی شوند ، و یک دیتابیس برنامه را از بین ببرند و دوباره بسازند. این ابزارها در به حداقل رساندن مشکلات ناسازگاری بانک اطلاعاتی که می تواند در اثر کار با چندین توسعه دهنده در یک برنامه ایجاد شود ، کمک کننده است: مشارکت کنندگان جدید فقط باید چند دستور artisan را اجرا کنند تا دیتابیس را روی یک نصب تازه تنظیم کنند.
در این راهنما ، ما برای جمع آوری بانک اطلاعاتی برنامه نمایشی Laravel با داده های نمونه ، migrations و seeders را ایجاد خواهیم کرد. در پایان ، شما فقط با استفاده از دستورات artisan می توانید جداول بانک اطلاعاتی خود را هر چند بار که می خواهید خراب کرده و مجدد بسازید.
پیش نیازها
برای دنبال کردن این راهنما ، به موارد زیر نیاز دارید:
⦁ دسترسی به یک دستگاه محلی یا سرور مجازی توسعه Ubuntu 18.04 به عنوان یک کاربر غیر ریشه و دارای امتیازات sudo. اگر از سرور مجازی راه دور استفاده می کنید ، توصیه می شود یک فایروال فعال نصب شود. برای انجام این کار ، لطفاً به راهنمای راه اندازی سرور مجازی اولیه ما برای اوبونتو 18.04 مراجعه کنید.
⦁ Docker که مطابق مرحله 1 و مرحله 2 نحوه نصب و استفاده از Docker در اوبونتو 18.04 بر روی سرور مجازی تان نصب شده است.
⦁ Docker Compose که مطابق مرحله 1 نحوه نصب Docker Compose در اوبونتو 18.04 بر روی سرور مجازی شما نصب شده باشد.
توجه: در این راهنما ، ما از یک محیط توسعه کانتینر شده که توسط Docker Compose اداره میشود برای اجرای برنامه استفاده خواهیم کرد ، اما ممکن است شما اجرای برنامه را روی یک سرور مجازی LEMP انتخاب کنید. برای تنظیم آن ، می توانید راهنمای ما در مورد نحوه نصب و پیکربندی Laravel با LEMP در اوبونتو 18.04 را دنبال کنید.

مرحله 1 – به دست آوردن برنامه دمو
برای شروع کار ، برنامه آزمایشی Laravel را از منبع GitHub آن دریافت خواهیم کرد. ما به شاخه tutorial-02 علاقه مند هستیم که شامل یک تنظیم Docker Compose برای اجرای برنامه بر روی کانتینرها است. در این مثال ، ما برنامه را در پوشه هوم خود دانلود خواهیم کرد ، اما می توانید از هر دیرکتوری مورد نظر خود استفاده کنید:
⦁ $ cd ~

⦁ $ curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-2.0.1.zip -o travellist.zip
از آنجا که ما کد برنامه را به عنوان فایل .zip دانلود کردیم ، برای باز کردن آن به دستور unzip احتیاج داریم. اگر اخیراً چنین کاری نکرده اید ، ایندکس بسته محلی دستگاه خود را به روز کنید:
⦁ $ sudo apt update
سپس بسته unzip را نصب کنید:
⦁ $ sudo apt install unzip
پس از آن ، محتویات برنامه را از حالت فشرده خارج کنید:
⦁ $ unzip travellist.zip
سپس برای دسترسی آسانتر ، دایرکتوری باز نشده را به travellist-demo تغییر نام دهید:
⦁ $ mv travellist-laravel-demo-tutorial-2.0.1 travellist-demo
در مرحله بعدی ، یک فایل پیکربندی .env برای تنظیم برنامه ایجاد خواهیم کرد.
مرحله 2 – تنظیم فایل .env برنامه
در Laravel ، فایل .env برای تنظیم پیکربندی های وابسته به محیط ، مانند اعتبارنامه ها و هرگونه اطلاعاتی که ممکن است بین آرایش ها متفاوت باشد ، استفاده می شود. این فایل در کنترل مروری گنجانده نشده است.
هشدار: فایل تنظیمات محیط شامل اطلاعات حساس در مورد سرور مجازی شما ، از جمله اطلاعات دیتابیس و کلیدهای امنیتی است. به همین دلیل ، شما هرگز نباید این فایل را به صورت عمومی به اشتراک بگذارید.

مقادیر موجود در فایل .env بر مقادیر تعیین شده در فایل های پیکربندی معمول واقع در دایرکتوری config مقدم است. هر نصب بر روی یک محیط جدید نیاز به یک فایل محیطی متناسب دارد تا مواردی مانند تنظیمات اتصال بانک اطلاعاتی ، آپشن های اشکال زدایی و URL برنامه را جدا از موارد دیگری تعریف کند که بسته به محیطی که اپلیکیشن در حال اجراست ممکن است متفاوت باشند.
به دیرکتوری travellist-demo بروید:
⦁ $ cd travellist-demo
اکنون ما یک فایل جدید .env را برای سفارشی کردن گزینه های پیکربندی محیط توسعه ای که تنظیم می کنیم ایجاد خواهیم کرد. Laravel با یک فایل.env همراه است که می توانیم آنرا کپی کنیم تا فایل خودمان را ایجاد کنیم:
⦁ $ cp .env.example .env
این فایل را با استفاده از nano یا ویرایشگر متن مورد نظر خود باز کنید:
⦁ $ nano .env
فایل .env شما اکنون به این شکل خواهد بود:
.env
APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password

فایل .env فعلی از برنامه نمایشی Travellist شامل تنظیماتی برای استفاده از محیط کانتینر شده ای است که ما با Docker Compose در قسمت آخر این سری ایجاد کرده ایم. شما نیازی به تغییر هیچ یک از این مقادیر ندارید ، اما در صورت تمایل می توانید DB_DATABASE ، DB_USERNAME و DB_PASSWORD را تغییر دهید ، زیرا این موارد توسط فایل docker-compose.yml ما به صورت خودکار کشیده می شود تا دیتابیس توسعه را تنظیم کنید. فقط مطمئن شوید که متغیر DB_HOST بدون تغییر باقی بماند ، زیرا در محیط Docker Compose نام سرویس دیتابیس ما را ارجاع می دهد.
اگر تغییری در فایل ایجاد کردید ، با فشار دادن CTRL + X ، Y ، و سپس enter آن را ذخیره کرده و ببندید.
توجه: اگر تصمیم به اجرای برنامه در سرور مجازی LEMP گرفتید ، باید مقادیر هایلایت شده را تغییر دهید تا تنظیمات دیتابیس خود را از جمله متغیر DB_HOST منعکس کنید.

مرحله 3 – نصب متعلقات برنامه با Composer
اکنون ما برای نصب متعلقات برنامه از Composer ، ابزار مدیریت متعلقات PHP استفاده خواهیم کرد و اطمینان حاصل خواهیم کرد که می توانیم دستورات artisan را اجرا کنیم.
محیط Docker Compose خود را با دستور زیر تنظیم کنید. این کار باعث می شود تا تصویر travellist برای سرویس app ایجاد شود و برای ایجاد محیط برنامه ، تصاویر اضافی Docker مورد نیاز خدمات nginx و db را جذب کنید:
⦁ $ docker-compose up -d
Output
Creating network “travellist-demo_travellist” with driver “bridge”
Building app
Step 1/11 : FROM php:7.4-fpm
—> fa37bd6db22a
Step 2/11 : ARG user
—> Running in 9259bb2ac034

Creating travellist-app … done
Creating travellist-nginx … done
Creating travellist-db … done

این عملیات ممکن است چند دقیقه طول بکشد. پس از اتمام مراحل ، می توانیم Composer را برای نصب متعلقات برنامه اجرا کنیم.
برای اجرای Composer و سایر دستورات در کانتینر سرویس app ، از docker-compose exec استفاده خواهیم کرد. دستور exec به ما امکان می دهد تا هر دستور مورد نظر خود را روی کانتینرهای مدیریت شده توسط Docker Compose اجرا کنیم. از دستور زیر استفاده می کند: docker-compose exec service_name
توجه: در صورت تصمیم به استفاده از سرور مجازی LEMP برای اجرای نسخه ی نمایشی ، باید قسمت docker-compose exec app از دستورهای ذکر شده در سراسر این راهنما را نادیده بگیرید. به عنوان مثال ، به جای اجرای دستور زیر به صورتی که نوشته شده ، فقط اجرا کنید:
⦁ $ composer install
برای اجرای composer install در کانتینر app ، دستور زیر را اجرا کنید:
⦁ $ docker-compose exec app composer install
Output
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 85 installs, 0 updates, 0 removals
– Installing doctrine/inflector (1.3.1): Downloading (100%)
– Installing doctrine/lexer (1.2.0): Downloading (100%)
– Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%)

هنگامی که composer نصب متعلقات برنامه را به پایان رساند ، می توانید دستورات artisan را اجرا کنید. برای آزمایش اینکه برنامه قادر به اتصال به بانک اطلاعاتی است ، دستور زیر را اجرا کنید که تمام جداول قبلی را حذف میکند:
⦁ docker-compose exec app php artisan db:wipe
این دستور هر جدول از قبل موجود را در دیتابیس پیکربندی شده رها می کند. اگر با موفقیت اجرا شد و برنامه قادر به اتصال به بانک اطلاعاتی شد ، خروجی مانند این را مشاهده خواهید کرد:
Output
Dropped all tables successfully.

اکنون که متعلقات برنامه را با Composer نصب کرده اید ، می توانید از ابزار artisan برای ایجاد migrations و seeders استفاده کنید.

مرحله 4 – ایجاد migrationهای دیتابیس
ابزار خط فرمان artisan که با Laravel ارسال می شود حاوی یک سری دستورات کمکی است که می تواند برای مدیریت برنامه و راه اندازی دسته های جدید برای راه اندازی خودکار استفاده شود. برای تولید یک گروهmigration جدید ، می توانیم از دستور make: migration به شرح زیر استفاده کنیم:
⦁ $ docker-compose exec app php artisan make:migration create_places_table
Laravel براساس نام توصیفی که برای دستور make: migration ارائه شده است ، اجرای این برنامه (create) ، نام جدول (places) و اینکه آیا این migration باعث ایجاد جدول جدید خواهد شد یا خیر را استنباط می کند.
خروجی مشابه این را مشاهده خواهید کرد:
Output
Created Migration: 2020_02_03_143622_create_places_table

این خروجی فایل جدیدی را در دیرکتوری database/migrations برنامه ایجاد می کند. برچسب زمانی موجود در فایل خودکار تولید شده توسط Laravel استفاده می شود تا تعیین کند که در چه صورت باید migrations اجرا شود.
از ویرایشگر متن دلخواه خود برای باز کردن فایل migration تولید شده استفاده کنید. به یاد داشته باشید که مقدار هایلایت شده را با نام فایل migration شخصی خود جایگزین کنید:
⦁ $ nano database/migrations/2020_02_03_143622_create_places_table.php
فایل migration تولید شده حاوی دسته ای به نام CreatPlacesTable است:

database/migrations/2020_02_03_143622_create_places_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePlacesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create(‘places’, function (Blueprint $table) {
$table->bigIncrements(‘id’);
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists(‘places’);
}
}

این کلاس دو روش دارد: up و down. هر دو روش حاوی کد بوت استرپ (راه اندازی خودکار) هستند که می توانید برای شخصی سازی آنچه هنگام انجام این migration و همچنین هنگام بازگشت دوباره اتفاق می افتد گسترش دهید.
ما روش up را طوری اصلاح خواهیم کرد که جدول places ساختاری را که قبلاً در نسخه فعلی برنامه استفاده می کنیم منعکس کند.
⦁ id : فیلد کلید اولیه.
⦁ name : نام مکان.
⦁ visited : آیا این مکان قبلاً بازدید شده یا خیر.
سازنده شماتیک Laravel روش هایی را برای ایجاد ، به روزرسانی و حذف جداول در یک دیتابیس در معرض دید شما قرار می دهد. کلاس Blueprint ساختار جدول را تعریف می کند و چندین روش برای انتزاع تعریف هر فیلد جدول ارائه می دهد.
کد خودکار تولید شده یک فیلد اصلی اولیه با نام id تنظیم می کند. روش timestamps دو فیلد datetime ایجاد می کند که با وارد کردن داده یا به روزرسانی داده ها در آن جدول ، به طور خودکار توسط دسته های دیتابیس تحت آن به روز می شوند. علاوه بر اینها ، باید یک name و یک فیلد visited را نیز وارد کنیم.
قسمت name ما از نوع string خواهد بود ، و قسمت visited ما با نوع boolean تنظیم می شود. ما همچنین مقدار پیش فرض 0 را برای قسمت visited تعیین خواهیم کرد ، به طوری که اگر هیچ مقداری رد و بدل نشود ، بدین معنی است که هنوز از مکان بازدید نشده است. اکنون روش up به این صورت خواهد بود:
database/migrations/2020_02_03_143622_create_places_table.php

public function up()
{
Schema::create(‘places’, function (Blueprint $table) {
$table->bigIncrements(‘id’);
$table->string(‘name’, 100);
$table->boolean(‘visited’)->default(0);
$table->timestamps();
});
}

توجه: لیست کامل انواع ستون های موجود را می توانید در مستندات Laravel پیدا کنید.

پس از درج دو خط هایلایت شده در اسکریپت migration خود ، فایل را ذخیره کنید و ببندید.
اکنون migration شما آماده اجرا از طریق artisan migrate میباشد. با این حال ، این فقط یک جدول خالی ایجاد می کند. همچنین باید بتوانیم داده های نمونه را برای توسعه و آزمایش درج کنیم. در مرحله بعدی ، خواهیم دید که چگونه می توان با استفاده از seeders دیتابیس این کار را انجام داد.
مرحله 5 – ایجاد Seeders بانک اطلاعاتی
seeder  یک کلاس ویژه ای است که برای تولید و درج داده های نمونه (seedها) در یک دیتابیس استفاده می شود. این امر یک ویژگی مهم در محیط های توسعه است ، زیرا به شما امکان می دهد برنامه را با یک دیتابیس تازه ، با استفاده از مقادیر نمونه ای بازتولید کنید که در غیر این صورت مجبور بودید به صورت دستی در هر بار بازتولید بانک اطلاعاتی آنها را وارد کنید.
اکنون ما از دستور artisan برای ایجاد یک کلاس seeder جدید برای جدول places خود با نام PlacesTableSeeder استفاده خواهیم کرد:
⦁ $ docker-compose exec app php artisan make:seeder PlacesTableSeeder
این دستور فایل جدیدی به نام PlacesTableSeeder.php را در دیرکتوری database/seeds ایجاد می کند. آن فایل را با استفاده از ویرایشگر متن مورد نظر خود باز کنید:
⦁ $ nano database/seeds/PlacesTableSeeder.php
فایل PlacesTableSeeder.php خودکار تولید شده این گونه خواهد بود:
database/seeds/PlacesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class PlacesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}

کلاس seeder جدید ما شامل یک روش خالی به نام run است. این روش با اجرای فرمان db: seed Artisan فراخوانی می شود.
ما باید روش run را ویرایش کنیم تا دستورالعمل هایی برای درج داده های نمونه در دیتابیس را شامل شود. از Laravel query builder برای ساده سازی این فرآیند استفاده خواهیم کرد.
Laravel query builder یک رابط کاربری قوی برای عملیات دیتابیس مانند درج ، به روزرسانی ، حذف و بازیابی داده ها ارائه می دهد. همچنین در برابر حملات تزریقی SQL محافظت هایی را ارائه می دهد. query builder با نمای خارجی DB به نمایش در می آید- یک پروکسی استاتیک برای در برگیری کلاس های دیتابیس در کانتینر سرویس.
برای شروع ، ما یک متغیر کلاس استاتیک ایجاد خواهیم کرد تا تمام مکان های نمونه ای که می خواهیم در بانک اطلاعاتی به عنوان یک آرایه درج کنیم را نگه داریم. این کار به ما این امکان را می دهد تا از یک حلقه foreach برای تکرار در تمام مقادیر استفاده کنیم و هر یک از آنها را با استفاده از query builder در بانک اطلاعاتی وارد کنیم.
ما این متغیر $places را فراخوانی میکنیم:
database/seeds/PlacesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class PlacesTableSeeder extends Seeder
{
static $places = [
‘Berlin’,
‘Budapest’,
‘Cincinnati’,
‘Denver’,
‘Helsinki’,
‘Lisbon’,
‘Moscow’,
‘Nairobi’,
‘Oslo’,
‘Rio’,
‘Tokyo’
];

در مرحله بعد ، باید یک عبارت use را در بالای کلاس PlacesTableSeeder خود وارد کنیم تا مراجعه به نمای DB در کل کد تسهیل شود:
database/seeds/PlacesTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class PlacesTableSeeder extends Seeder

اکنون می توانیم با استفاده از یک حلقه foreach مقادیر آرایه $places را تکرار کنیم و هر یک را در جدول places خود با استفاده از query builder وارد کنیم:
database/seeds/PlacesTableSeeder.php

public function run()
{
foreach (self::$places as $place) {
DB::table(‘places’)->insert([
‘name’ => $place,
‘visited’ => rand(0,1) == 1
]);
}
}

حلقه foreach در هر یک از آرایه های استاتیک $places تکرار می شود. در هر تکرار ، از نمای DB برای قرار دادن یک ردیف جدید در جدولplaces استفاده می کنیم. فیلد name را به نام محلی که تازه از آرایه $places بدست آورده ایم تنظیم کردیم و قسمت visited را روی یک مقدار تصادفی یا 0 یا 1 تنظیم می کنیم.
کلاس کامل PlacesTableSeeder بعد از همه به روزرسانی ها اینگونه به نظر می رسد:
database/seeds/PlacesTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class PlacesTableSeeder extends Seeder
{
static $places = [
‘Berlin’,
‘Budapest’,
‘Cincinnati’,
‘Denver’,
‘Helsinki’,
‘Lisbon’,
‘Moscow’,
‘Nairobi’,
‘Oslo’,
‘Rio’,
‘Tokyo’
];

/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
foreach (self::$places as $place) {
DB::table(‘places’)->insert([
‘name’ => $place,
‘visited’ => rand(0,1) == 1
]);
}
}
}

هنگامی که این تغییرات را انجام داده اید ، فایل را ذخیره کنید و ببندید.
کلاس های Seeder به طور خودکار در برنامه لود نمی شوند. ما باید کلاس اصلی DatabaseSeeder را ویرایش کنیم تا یک seeder که اخیراً ایجاد کرده ایم فراخوانی شود.
فایل database/seeds/DatabaseSeeder.php را با استفاده از nano یا ویرایشگر مورد علاقه خود باز کنید:
⦁ $ nano database/seeds/DatabaseSeeder.php
کلاس DatabaseSeeder مانند هر seeder دیگر به نظر می رسد: از کلاس Seeder امتداد دارد و یک روش run دارد. ما این روش را به روز خواهیم کرد تا یک فراخوانی PlacesTableSeeder را شامل شود.
با حذف خط کامنت شده و جایگزینی آن با کد هایلایت شده زیر ، روش run فعلی را در کلاس DatabaseSeeder خود به روز کنید.
database/seeds/DatabaseSeeder.php

public function run()
{
$this->call(PlacesTableSeeder::class);
}

کلاس کامل DatabaseSeeder بعد از بروزرسانی اینگونه خواهد شد:
database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
/**
* Seed the application’s database.
*
* @return void
*/
public function run()
{
$this->call(PlacesTableSeeder::class);
}
}

پس از اتمام به روزرسانی محتوای آن ، فایل را ذخیره کنید و ببندید.
اکنون تنظیمmigration و seeder را برای جدول places خود به پایان رسانده ایم. در مرحله بعدی ، نحوه اجرای آنها را خواهیم دید.
مرحله ششم – اجرای migration و seeder دیتابیس
قبل از ادامه کار ، باید اطمینان حاصل کنیم که برنامه شما در حال اجرا است. ما کلید رمزگذاری برنامه را تنظیم خواهیم کرد و سپس از طریق یک مرورگر برای تست سرور مجازی وب به برنامه دسترسی پیدا می کنیم.
برای تولید کلید رمزنگاری مورد نیاز Laravel می توانید از کلید artisan: generate command استفاده کنید:
⦁ $ docker-compose exec app php artisan key:generate
پس از ایجاد کلید ، با نشان دادن مرورگر خود به نام هاست سرور مجازی یا آدرس IP در پورت 8000 ، می توانید به برنامه دسترسی پیدا کنید:
http: // server_host_or_ip: 8000
صفحه ای را به این شکل مشاهده خواهید کرد:

این بدان معنی است که برنامه می تواند به بانک اطلاعاتی وصل شود ، اما نمی تواند یک جدول به نام places را پیدا کند. اکنون با استفاده از دستور migrate artisan زیر جدول places را ایجاد خواهیم کرد:
⦁ $ docker-compose exec app php artisan migrate
خروجی مشابه این دریافت خواهید کرد:
Output
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
Migrating: 2020_02_10_144134_create_places_table
Migrated: 2020_02_10_144134_create_places_table (0.03 seconds)

متوجه خواهید شد که چند migration دیگر به همراه create_places_table  که تنظیم کرده ایم انجام شده است. این migrationها هنگام نصب Laravel به صورت خودکار ایجاد می شوند. اگرچه ما اکنون از این جداول اضافی استفاده نخواهیم کرد ، در صورت گسترش برنامه برای داشتن کاربران ثبت نام شده و کارهای برنامه ریزی شده ، در آینده به آنها نیاز خواهیم داشت. در حال حاضر ، شما فقط می توانید آنها را مانند گذشته رها کنید.
در این مرحله جدول ما هنوز خالی است. ما باید دستور db: seed را اجرا کنیم تا دیتابیس را با مکان های نمونه خود seed دهی کنیم:
⦁ $ docker-compose exec app php artisan db:seed
این کار seeder ما را اجرا می کند و مقادیر نمونه ای را که ما در کلاس PlacesTableSeeder تعریف کردیم وارد می کند. خروجی مشابه این را مشاهده خواهید کرد:
Output
Seeding: PlacesTableSeeder
Seeded: PlacesTableSeeder (0.06 seconds)
Database seeding completed successfully.

اکنون صفحه برنامه را در مرورگر خود مجدد لود کنید. صفحه ای شبیه به این را مشاهده خواهید کرد:

هر وقت لازم است از ابتدا شروع کنید ، می توانید تمام جداول بانک اطلاعاتی خود را با این دستور دراپ کنید:
⦁ $ docker-compose exec app php artisan db:wipe
Output
Dropped all tables successfully.

برای اجرای برنامه migration و seed (بذردهی) جداول در یک دستور واحد ، می توانید از این خط استفاده کنید:
⦁ $ docker-compose exec app php artisan migrate –seed
Output
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.07 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
Migrating: 2020_02_10_144134_create_places_table
Migrated: 2020_02_10_144134_create_places_table (0.03 seconds)
Seeding: PlacesTableSeeder
Seeded: PlacesTableSeeder (0.06 seconds)
Database seeding completed successfully.

اگر می خواهید migration را به عقب برگردانید ، می توانید این دستور را اجرا کنید:
⦁ $ docker-compose exec app php artisan migrate:rollback
این دستور روش down را برای هر کلاس migration در داخل پوشه migration ها ایجاد می کند. به طور معمول ، تمام جداول ایجاد شده از طریق کلاس های migration را حذف می کند ، و جداول دیگری که ممکن است به صورت دستی ایجاد شده باشد را به خود اختصاص نمی دهد. خروجی مانند این را خواهید دید:
Output
Rolling back: 2020_02_10_144134_create_places_table
Rolled back: 2020_02_10_144134_create_places_table (0.02 seconds)
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back: 2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back: 2014_10_12_100000_create_password_resets_table (0.02 seconds)
Rolling back: 2014_10_12_000000_create_users_table
Rolled back: 2014_10_12_000000_create_users_table (0.02 seconds)

دستور بازگشت به خصوص هنگامی مفید است که شما در حال تغییر در مدل های برنامه هستید و از دستور db: wipe نمیتوان استفاده کرد – به عنوان مثال ، اگر چندین سیستم به یک دیتابیس وابسته باشند.
نتیجه
در این راهنما ، ما نحوه استفاده از migration ها و seeder های دیتابیس را برای تسهیل تنظیم دیتابیس های توسعه و آزمایش یک برنامه Laravel 6 مشاهده کردیم.
به عنوان مرحله بعد ، می توانید برای جزئیات بیشتر در مورد نحوه استفاده از query builder ، و نحوه استفاده از مدل های Eloquent برای انتزاع طرح دیتابیس برنامه خود ، مطالب Laravel را بررسی کنید.

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

این آموزش تنظیم چندین دامنه و وب سایت با استفاده از هاست های مجازی Apache در سرور مجازی اوبونتو 18.04 را به شما آموزش میدهد. در طی این فرایند ، یاد خواهید گرفت که بسته به دامنه درخواستی ، محتوای مختلفی را به بازدید کنندگان مختلف ارائه دهید.
برای نسخه دقیق تر این آموزش ، با توضیحات بیشتر در مورد هر مرحله ، لطفاً به نحوه تنظیم هاست های مجازی Apache در Ubuntu 18.04 مراجعه کنید.
پیش نیازها
برای تکمیل این آموزش ، به سرور مجازی Ubuntu 18.04 به موارد زیر دسترسی دارید:
⦁ کاربر sudo در سرور مجازی خود
⦁ سرور مجازی وب Apache2 ، که می توانید آن را با sudo apt install apache2 نصب کنید
مرحله 1 – ساختار دیرکتوری را ایجاد کنید
ابتدا یک ساختار دایرکتوری ایجاد خواهیم کرد که داده های سایت را که برای بازدید کنندگان در دایرکتوری سطح بالای Apache خود قرار خواهیم داد ، نگه می دارد. ما از نام های دامنه مثال ، که در زیر هایلایت شده استفاده خواهیم کرد. شما باید این نامها را با نام دامنه واقعی خود جایگزین کنید.
⦁ $ sudo mkdir -p /var/www/example.com/public_html

⦁ $ sudo mkdir -p /var/www/test.com/public_html

مرحله 2 – اعطای مجوزها
اکنون باید مجوزها را به کاربر غیر ریشه فعلی خود تغییر دهیم تا بتواند فایل ها را تغییر دهد.
⦁ $ sudo chown -R $USER:$USER /var/www/example.com/public_html

⦁ $ sudo chown -R $USER:$USER /var/www/test.com/public_html

علاوه بر این ، اطمینان حاصل خواهیم کرد که دسترسی خواندن به دایرکتوری وب عمومی و کلیه فایل ها و پوشه های موجود در آن مجاز است تا صفحات به درستی ارائه شوند.
⦁ $ sudo chmod -R 755 /var/www

مرحله 3 – ایجاد صفحات دمو برای هر هاست مجازی
بیایید برخی از مطالب را برای ارائه خدمات ایجاد کنیم ، یک صفحه نمایشی index.html برای هر سایت ایجاد میکنیم. می توانیم برای اولین سایت خود مثلا با استفاده از nano ، یک فایل index.html را در یک ویرایشگر متن باز کنیم.
⦁ $ nano /var/www/example.com/public_html/index.html

در این فایل ، یک سند HTML خاص دامنه ، مانند زیر ایجاد کنید:
/var/www/example.com/public_html/index.html
<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1>Success! The example.com virtual host is working!</h1>
</body>
</html>

فایل را ذخیره کنید و ببندید، سپس این فایل را برای استفاده به عنوان پایه ای برای سایت دوم کپی کنید:
⦁ $ cp /var/www/example.com/public_html/index.html /var/www/test.com/public_html/index.html
فایل را باز کرده و قسمتهای مربوط به اطلاعات را اصلاح کنید:
⦁ $ nano /var/www/test.com/public_html/index.html

/var/www/test.com/public_html/index.html
<html>
<head>
<title>Welcome to Test.com!</title>
</head>
<body> <h1>Success! The test.com virtual host is working!</h1>
</body>
</html>

این فایل را نیز ذخیره کنید و ببندید.
مرحله 4 – فایل های هاست مجازی جدید ایجاد کنید
Apache با یک فایل هاست مجازی پیش فرض به نام 000-default.conf ارائه می شود که ما از آن به عنوان یک الگو استفاده خواهیم کرد. آن را کپی می کنیم تا یک فایل هاست مجازی برای هر یک از دامنه های خود ایجاد کنیم.
اولین فایل هاست مجازی ایجاد کنید
با کپی کردن فایل برای دامنه اول شروع کنید:
⦁ $ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
فایل جدید را در ویرایشگر خود باز کنید (ما از nano در زیر استفاده می کنیم) با امتیازات کاربر اصلی:
⦁ $ sudo nano /etc/apache2/sites-available/example.com.conf

این فایل را برای دامنه خود شخصی سازی خواهیم کرد. متن هایلایت شده زیر را برای شرایط خود تغییر دهید.
/etc/apache2/sites-available/example.com.conf
<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

در این مرحله فایل را ذخیره کنید و ببندید.
اولین هاست مجازی را کپی کنید و برای دامنه دوم شخصی سازی کنید
اکنون که اولین فایل هاست مجازی ما ایجاد شده است ، می توانیم با کپی کردن آن فایل و تنظیم آن در صورت لزوم ، فایل دوم خود را ایجاد کنیم.
با کپی کردن آن شروع کنید:
⦁ $ sudo cp /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/test.com.conf

فایل جدید را با امتیازات root در ویرایشگر خود باز کنید:
⦁ $ sudo nano /etc/apache2/sites-available/test.com.conf

اکنون باید برای ارجاع دادان به دامنه دوم خود ، تمام بخش های اطلاعات را تغییر دهید. فایل نهایی باید چیزی شبیه به این باشد ، که متن هایلایت شده مطابق با اطلاعات دامنه مربوطه شماست.
/etc/apache2/sites-available/test.com.conf
<VirtualHost *:80>
ServerAdmin admin@test.com
ServerName test.com
ServerAlias www.test.com
DocumentRoot /var/www/test.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

پس از اتمام فایل را ذخیره کنید و ببندید.
مرحله 5 – فایل های هاست مجازی جدید را فعال کنید
با ایجاد فایل های هاست مجازی ، باید آنها را فعال کنیم. ما برای دستیابی به این هدف از ابزار a2ensite استفاده خواهیم کرد.
⦁ $ sudo a2ensite example.com.conf

⦁ $ sudo a2ensite test.com.conf

سپس ، سایت پیش فرض تعریف شده در 000-default.conf را غیرفعال کنید:
⦁ $ sudo a2dissite 000-default.conf
پس از اتمام ، باید Apache را مجدداً راه اندازی کنید تا این تغییرات عملی شود و از systemctl status برای تأیید موفقیت در راه اندازی مجدد استفاده کنید.
⦁ $ sudo systemctl restart apache2
اکنون سرور مجازی شما برای ارائه خدمات به دو وب سایت تنظیم شده است.
مرحله 6 – تنظیم فایل هاست محلی (اختیاری(
اگر تاکنون از نامهای دامنه واقعی که برای تست این روش دارید استفاده نکرده اید و در عوض از برخی از دامنه های نمونه استفاده کرده اید ، می توانید با تغییر موقت فایل هاست ها در رایانه محلی خود ، کار خود را آزمایش کنید.
در دستگاه Mac یا Linux محلی ، دستور زیر را تایپ کنید:
⦁ $ sudo nano /etc/hosts

برای یک دستگاه محلی ویندوز ، دستورالعمل های مربوط به تغییر فایل هاست های خود را در این لینک پیدا کنید.
با استفاده از دامنه های مورد استفاده در این راهنما ، و جایگزین کردن IP سرور مجازی به جای your_server_IP ، فایل شما باید به این شکل درآید:
/etc/hosts
127.0.0.1 localhost
127.0.1.1 guest-desktop
your_server_IP example.com
your_server_IP test.com

فایل را ذخیره کنید و ببندید. این امر باعث می شود هر گونه درخواستی برای مثال.com و test.com از طریق رایانه ما هدایت شود و آنها را به سرور مجازی ما ارسال کند.
مرحله 7 – نتایج خود را آزمایش کنید
اکنون که هاست های مجازی خود را پیکربندی کرده اید ، می توانید با رفتن به دامنه هایی که در مرورگر وب خود پیکربندی کرده اید ، تنظیمات خود را آزمایش کنید:
http://example.com
باید صفحه ای به شکل زیر مشاهده کنید:

همچنین می توانید به صفحه دوم خود مراجعه کرده و فایلی را که برای سایت دوم خود ایجاد کرده اید ببینید.
http://test.com

اگر هر دو این سایت همانطور که انتظار می رود کار کنند ، شما دو هاست مجازی را در همان سرور مجازی پیکربندی کرده اید.
اگر فایل هاست های رایانه خانگی خود را تنظیم کردید ، خطوط اضافه شده را حذف کنید.
آموزشهای مرتبط
در اینجا پیوندهایی به راهنماهای بیشتر مربوط به این آموزش آمده اند:
⦁ چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04 تنظیم کرد
⦁ دامنه ها و DNS در vpsgol
⦁ چگونه می توان URL را با mod_rewrite برای Apache در اوبونتو 18.04 بازنویسی کرد

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

R یک زبان برنامه نویسی منبع باز است که در محاسبات آماری و گرافیک تخصص دارد. با حمایت بنیاد R برای محاسبات آماری ، از آن به صورت گسترده برای تهیه نرم افزار آماری و انجام تجزیه و تحلیل داده ها استفاده می شود. R که یک زبان محبوب و گسترده با جامعه فعال است ، بسیاری از بسته های تولید شده توسط کاربر را برای مناطقی خاص از مطالعه ارائه می دهد ، که باعث می شود این امر در بسیاری از زمینه ها کاربرد داشته باشد.
در این آموزش R را نصب می کنیم و نحوه اضافه کردن بسته ها از شبکه رسمی بایگانی جامع R (CRAN) را نشان می دهیم.
پیش نیازها
برای پیگیری این آموزش به سرور مجازی اوبونتو 18.04 با:
• حداقل 1 گیگابایت رم
• کاربر غیر ریشه ای با امتیازات sudo
نیاز دارید
برای یادگیری چگونگی دستیابی به این تنظیمات ، راهنمای راه اندازی سرور مجازی اولیه ما را دنبال کنید یا اسکریپت خودکار خود را اجرا کنید.
پس از اتمام این پیش نیازها ، آماده شروع هستید.
مرحله 1 – نصب R
از آنجا که R یک پروژه به سرعت در حال حرکت است ، آخرین نسخه پایدار همیشه از منابع اوبونتو در دسترس نیست ، بنابراین ما با اضافه کردن منبع خارجی که توسط CRAN نگهداری می شود ، شروع خواهیم کرد.
توجه : CRAN منابع درون شبکه خود را حفظ می کند ، اما همه منابع خارجی قابل اعتماد نیستند. مطمئن شوید که فقط از منابع معتبر نصب کنید.

ابتدا بیایید کلید GPG مربوطه را اضافه کنیم.
$ sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
وقتی دستور را اجرا می کنیم ، خروجی زیر را دریافت خواهیم کرد:
Output
Executing: /tmp/apt-key-gpghome.4BZzh1TALq/gpg.1.sh –keyserver keyserver.ubuntu.com –recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
gpg: key 51716619E084DAB9: public key “Michael Rutter <marutter@gmail.com>” imported
gpg: Total number processed: 1
gpg: imported: 1

پس از داشتن کلید قابل اعتماد ، می توانیم منبع را اضافه کنیم. توجه داشته باشید که اگر از 18.04 استفاده نمی کنید ، می توانید منبع مربوطه را از لیست R Project Ubuntu ، که برای هر نسخه نامگذاری شده است ، پیدا کنید.
$ sudo add-apt-repository ‘deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/’
در بین خروجی نمایش داده شده ، باید خطوط مشابه با موارد زیر را پیدا کنید:
Output

Get:5 https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/ InRelease [3609 B]

Get:6 https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/ Packages [21.0 kB]

اکنون ، برای اینکه مانیفیست (اعلان) های بسته از منبع جدید را شامل شود ، باید پس از این اقدام به روزرسانی کنیم.
$ sudo apt update
در بین خروجی باید یک خط شبیه به زیر باشد:
Output

Hit:2 https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/ InRelease

اگر خط فوق در خروجی از دستور UPDATE ظاهر شود ، ما منبع را با موفقیت اضافه کرده ایم. می توانیم مطمئن باشیم که به طور تصادفی نسخه قدیمی را نصب نمی کنیم.
در این مرحله ، آماده نصب R با دستور زیر هستیم.
$sudo apt install r-base
اگر از شما خواسته شد که نصب را تأیید کنید ، برای ادامه ، y را فشار دهید.
در زمان نوشتن این مقاله، آخرین نسخه پایدار R از CRAN نسخه 3.5.1 میباشد که هنگام شروع R نمایش داده می شود.
از آنجا که ما قصد داریم یک پکیج نمونه برای هر کاربر روی سیستم نصب کنیم ، R را به صورت root شروع خواهیم کرد تا کتابخانه ها بصورت خودکار در دسترس همه کاربران قرار بگیرند. از طرف دیگر ، اگر دستور R را بدون sudo اجرا کنید ، می توانید یک کتابخانه شخصی برای کاربر خود تنظیم کنید.
$sudo -i R

Output
R version 3.5.1 (2018-07-02) — “Feather Spray”
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

Type ‘demo()’ for some demos, ‘help()’ for on-line help, or
‘help.start()’ for an HTML browser interface to help.
Type ‘q()’ to quit R.

>

این تأیید می کند که ما R را با موفقیت نصب کرده ایم و وارد پوسته تعاملی آن شدیم.
مرحله 2 – نصب بسته های R از CRAN
بخشی از قدرت R فراوانی در دسترس بودن بسته های اضافی آن است. برای اهداف توضیحی ، txtplot را نصب خواهیم کرد ، کتابخانه ای که نمودارهای ASCII را در بر می گیرد که شامل نمودار پراگندگی ، نمودار خطی ، نمودار چگالی ، نمودارهای acf و نمودارهای میله ای است:
> install.packages(‘txtplot’)
توجه: خروجی زیر نشان می دهد که بسته در کجا نصب خواهد شد.
Output

Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
. . .
این مسیر گسترده در سایت وجود دارد زیرا ما R را به عنوان root اجرا کردیم. این مکان صحیحی است که بسته را در دسترس همه کاربران قرار میدهد.
پس از اتمام نصب ، می توانیم txtplot را بارگذاری کنیم:
> library(‘txtplot’)
اگر پیام خطایی وجود ندارد ، کتابخانه با موفقیت لود شده است. بیایید اکنون آن را با مثالی که عملکرد نمودارسازی پایه را با برچسب های محور نشان می دهد ، در مرحله عمل قرار دهیم. داده های مثال ، تهیه شده توسط بسته های datasets درR ، شامل سرعت اتومبیل ها و مسافت موردنیاز برای متوقف کردن بر اساس داده های دهه 1920 است:
$ txtplot(cars[,1], cars[,2], xlab = ‘speed’, ylab = ‘distance’)
Output
+—-+———–+————+———–+———–+–+
120 + * +
| |
d 100 + * +
i | * * |
s 80 + * * +
t | * * * * |
a 60 + * * * * * +
n | * * * * * |
c 40 + * * * * * * * +
e | * * * * * * * |
20 + * * * * * +
| * * * |
0 +—-+———–+————+———–+———–+–+
5 10 15 20 25
speed

اگر علاقه مند به کسب اطلاعات بیشتر در مورد txtplot هستید ، از help)txtplot) در داخل مفسر R استفاده کنید.
هر بسته از پیش کامپایل شده را می توان از CRAN با install.packages () نصب کرد. برای کسب اطلاعات بیشتر در مورد آنچه در دسترس است ، می توانید لیستی از بسته های رسمی بر اساس نام که از طریق لیست نام بسته های موجود CRAN سازماندهی شده ، پیدا کنید.
برای خروج از R ، می توانید q () را تایپ کنید. مگر اینکه بخواهید تصویر فضای کاری را ذخیره کنید ، می توانید در صورت درخواست از شما n را فشار دهید.
نتیجه
با نصب موفقیت آمیز R روی سرور مجازی ، ممکن است علاقه مند به این راهنما در مورد نصب سرور مجازی RStudio باشید تا بتوانید یک IDE را در استقرار مبتنی بر سرور مجازی که تازه تکمیل کرده اید ، قرار دیهد. همچنین می توانید نحوه تنظیم سرور مجازی Shiny را برای تبدیل کد R خود به صفحات وب تعاملی بیاموزید.
برای کسب اطلاعات بیشتر در مورد نحوه نصب پکیج های R با استفاده از ابزارهای مختلف ، می توانید نحوه نصب مستقیم از GitHub ، BitBucket یا سایر مکان ها را مطالعه کنید. این کار به شما امکان می دهد تا از آخرین کارهای جامعه فعال بهره ببرید.

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18 – نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم کد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7 – نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi