سرور مجازی

۱۱۸ مطلب در مرداد ۱۳۹۹ ثبت شده است

  • ۰
  • ۰

در 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
  • ۰
  • ۰

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
  • ۰
  • ۰

در ECMAScript 2015 ، ژنراتورها (آزانگرها) به زبان JavaScript معرفی شدند. ژنراتورفرایندی است که می تواند متوقف شده و از سر گرفته شود و می تواند مقادیر مختلفی را ارائه دهد. ژنراتور در جاوا اسکریپت از یک تابع ژنراتور تشکیل شده است ، که یک مفعول Generator تکرارگر را برمی گرداند.
ژنراتورها می توانند حالت خود را حفظ کنند ، روشی کارآمد برای ایجاد تکرارگرها ارائه دهند ، و قادر به کار با داده های نامتناهی هستند که می توانند برای اجرای اسکرول نامحدود در یک برنامه وب ، کار با داده های موج صدا و موارد دیگر استفاده شوند. علاوه بر این ، در هنگام استفاده به همراه promise ها ، می توانند از تابع async/await استفاده کنند ، که به ما امکان می دهد با کد غیرهمزمان با روشی ساده تر و خواناتر سر و کار داشته باشیم. اگرچه async / await روشی معمول تر برای کار با موارد استفاده معمول، ساده و غیر همزمان، مانند گرفتن داده ها از یک API است، ژنراتورها ویژگی های پیشرفته تری دارند که یادگیری نحوه استفاده از آنها را ارزشمند می کند.
در این مقاله ، ما نحوه ایجاد توابع ژنراتور ، نحوه تکرار آبجکت های ژنراتور ، تفاوت بین yield  و return  در داخل ژنراتور و سایر جنبه های کار با ژنراتور را پوشش خواهیم داد.
توابع ژنراتور
یک تابع ژنراتور تابعی است که یک آبجکت Generator را برمی گرداند و همانطور که در شکل زیر نشان داده شده است توسط کلید واژه function  به همراه ستاره (*) تعریف می شود:
// Generator function declaration
function* generatorFunction() {}

گاهی اوقات ، ستاره را در کنار نام تابع و مقابل کلمه کلیدی تابع مانند function *generatorFunction() ، مشاهده می کنید. این هم به همان صورت عمل میکند ، اما function* به طور گسترده تری پذیرفته شده است.
توابع ژنراتور نیز مانند توابع معمولی می تواند در یک عبارت تعریف شود:
// Generator function expression
const generatorFunction = function*() {}

ژنراتورها حتی می توانند روشهای یک آبجکت یا کلاس باشند:
// Generator as the method of an object
const generatorObj = {
*generatorMethod() {},
}

// Generator as the method of a class
class GeneratorClass {
*generatorMethod() {}
}

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

اکنون که می دانید چگونه می توانید توابع ی ژنراتور را اظهار کنید ، بیایید به آبجکت های ژنراتور تکرارگر که باز می گردند نگاهی بیندازید.
آبجکت های ژنراتور
به طور معمول ، توابع موجود در جاوا اسکریپت تا زمان اتمام اجرا میشوند ، و فراخوانی یک تابع با رسیدن به کلمه کلیدی return ، مقداری را برمی گرداند. در صورت حذف کلمه کلیدی return ، یک تابع به طور ضمنی undefined را باز خواهد گرداند.
به عنوان مثال در کد زیر یک تابع sum () را اعلام می کنیم که مقداری را برمی گرداند که جمع آن دو عدد صحیح است:
// A regular function that sums two values
function sum(a, b) {
return a + b
}

فراخوانی تابع مقداری را نشان می دهد که مجموع آرگومان ها است:
const value = sum(5, 6) // 11
Copy

با این حال ، تابع ژنراتور ، یک مقدار را فوراً بر نمی گرداند ، و در عوض یک آبجکت ژنراتور تکرارگر را برمی گرداند. در مثال زیر ، یک تابع را اعلام می کنیم و مانند یک تابع استاندارد ، تک مقدار برگشتی به آن می دهیم:
// Declare a generator function with a single return value
function* generatorFunction() {
return ‘Hello, Generator!’
}

هنگامی که ما از تابع ژنراتور درخواست می کنیم ، آبجکت ژنراتور را برمی گرداند ، که می توانیم به یک متغیر اختصاص دهیم:
// Assign the Generator object to generator
const generator = generatorFunction()

اگر یک تابع معمولی بود ، انتظار داشتیم که ژنراتور رشته ای را که در این تابع برگشته است به ما بدهد. با این حال ، آنچه در واقع دریافت می کنیم یک آبجکت در حالت suspended  است. بنابراین فراخوانی generator  خروجی مشابه موارد زیر را نشان می دهد:
Output
generatorFunction {<suspended>}
__proto__: Generator
[[GeneratorLocation]]: VM272:1
[[GeneratorStatus]]: “suspended”
[[GeneratorFunction]]: ƒ* generatorFunction()
[[GeneratorReceiver]]: Window
[[Scopes]]: Scopes[3]

آبجکت Generator  که توسط تابع برگشت داده شده ، یک تکرارگر است. تکرارگر آبجکتی است که یک روش next() در دسترس دارد که برای تکرار از طریق دنباله ای از مقادیر استفاده می شود. روش next() یک آبجکت با ویژگی های value  و done  برمی گرداند. value  نشان دهنده مقدار برگشتی است ، و done  نشان می دهد که آیا تکرارگر تمام مقادیر خود را اجرا کرده است یا نه.
با دانستن این موضوع ، بیایید next() را روی ژنراتور خود فراخوانی کنیم و مقدار و وضعیت فعلی تکرارگر را بدست آوریم:
// Call the next method on the Generator object
generator.next()

خروجی زیر را ارائه می دهد:
Output
{value: “Hello, Generator!”, done: true}

مقدار برگشتی از فراخوانی next()،Hello, Generator! است و وضعیت done ، true میباشد ، زیرا این مقدار از return حاصل می شود که تکرارگر را بسته است. از آنجا که تکرار انجام شده است ، وضعیت تابع ژنراتور از حالت suspended  به closed تغییر می کند. دوباره فراخوانی generator  خروجی زیر را ارائه می دهد:
Output
generatorFunction {<closed>}

در حال حاضر ، ما فقط نشان داده ایم که چگونه یک تابع ژنراتور می تواند روشی پیچیده تر برای بدست آوردن مقدار return  یک تابع باشد. اما توابع ژنراتور همچنین دارای ویژگی های منحصر به فردی هستند که آنها را از توابع طبیعی متمایز می کند. در بخش بعدی ، ما در مورد اپراتور yield  خواهیم آموخت و میبینیم که چگونه یک ژنراتور می تواند مکث کرده و اجرا را از سر بگیرد.
عملگرهای yield
ژنراتورها یک کلمه کلیدی جدید به نام yield را به JavaScript معرفی می کنند. yield  می تواند یک تابع ژنراتور را متوقف کرده و مقداری را که بعد از yield  میاید ، بازگرداند و راهی ساده برای تکرار مقادیر فراهم می کند.
در این مثال ، ما تابع ژنراتور را سه بار با مقادیر مختلف متوقف می کنیم و در انتها یک مقدار را برمی گردانیم. سپس آبجکت ژنراتور خود را به متغیر ژنراتور اختصاص می دهیم.
// Create a generator function with multiple yields
function* generatorFunction() {
yield ‘Neo’
yield ‘Morpheus’
yield ‘Trinity’

return ‘The Oracle’
}

const generator = generatorFunction()

حال ، هنگامی که ما تابع next() را بر روی تابع ژنراتور فراخوانی می کنیم ، هر بار که با تابع yield مواجه می شود متوقف خواهد شد. done بعد از هر بار yield روی false تنظیم خواهد شد و این نشان می دهد که ژنراتور تمام نشده است. هنگام رویارویی با return ، یا وقتی yield دیگری در تابع نباشد ، done  روی true تنظیم میشود ​​و ژنراتور به پایان می رسد.
از روش next() چهار بار در یک ردیف استفاده کنید
// Call next four times
generator.next()
generator.next()
generator.next()
generator.next()
چهار خط زیر را به ترتیب نشان می دهد:
Output
{value: “Neo”, done: false}
{value: “Morpheus”, done: false}
{value: “Trinity”, done: false}
{value: “The Oracle”, done: true}

توجه داشته باشید که ژنراتور نیازی به return ندارد. در صورت حذف ، آخرین تکرار این عبارت را باز میگرداند: {value: undefined, done: true} ، چرا که هر فراخوانی بعدی به next() پس از اتمام ژنراتور به پایان می رسد.
تکرار در یک ژنراتور
با استفاده از روش next() ، ما به طور دستی از طریق آبجکت ژنراتور تمام ویژگی های value  و done  تمام آبجکت را تکرار می کنیم. با این حال ، درست مانند Array ، Map ، و Set ، یک ژنراتور از پروتکل تکرار پیروی می کند و می تواند با استفاده از for…of تکرار شود:
// Iterate over Generator object
for (const value of generator) {
console.log(value)
}

خروجی زیر باز می گردد:
Output
Neo
Morpheus
Trinity

همچنین می توان از اپراتور spread برای تعیین مقادیر یک ژنراتور به یک آرایه استفاده کرد.
// Create an array from the values of a Generator object
const values = […generator]

console.log(values)

آرایه زیر را ارائه می دهد:
Output
(3) [“Neo”, “Morpheus”, “Trinity”]

هم spread و هم for..of ، return را در مقادیر فاکتور نمیگیرند (در این حالت، ‘The Oracle’ خواهد بود)
توجه: در حالی که هر دو روش برای کار با ژنراتورهای محدود مؤثر هستند ، اگر یک ژنراتور با یک جریان داده نامتناهی سر و کار داشته باشد ، بدون ایجاد یک حلقه نامحدود امکان استفاده مستقیم از spread یا for… of وجود ندارد.

بستن یک ژنراتور
همانطور که مشاهده کردیم ، یک ژنراتور می تواند ویژگی های done  خود را روی true تنظیم کرده و وضعیت خود را با تکرار در تمام مقادیر خود روی closed تنظیم کند. دو روش دیگر وجود دارد که فوراً یک ژنراتور را کنسل کنید: با روش return () و با روش throw().
با return () ، ژنراتور می تواند در هر نقطه خاتمه یابد ، دقیقاً مثل اینکه عبارت return () در بدنه تابع بوده باشد. می توانید یک آرگومان را به return () بفرستید، یا آن را به صورت یک مقدار نامشخص خالی بگذارید.
برای نشان دادن return () ، ما یک ژنراتور با چند مقدار yield ایجاد می کنیم اما در تعریف تابع return وجود ندارد.
function* generatorFunction() {
yield ‘Neo’
yield ‘Morpheus’
yield ‘Trinity’
}

const generator = generatorFunction()

اولین next () به ما “Neo” می دهد ، که done روی false تنظیم شده است. اگر بلافاصله پس از آن از روش return () در ژنراتور استفاده کنیم ، اکنون مقدار عبور داده شده را دریافت می کنیم و done روی true تنظیم می شود. هرگونه فراخوانی دیگر به next () پاسخ ژنراتور کامل شده با مقدار نامشخص را می دهد.
برای نشان دادن این ، سه روش زیر را روی ژنراتور اجرا کنید:
generator.next()
generator.return(‘There is no spoon!’)
generator.next()

این سه نتیجه را می دهد:
Output
{value: “Neo”, done: false}
{value: “There is no spoon!”, done: true}
{value: undefined, done: true}

روش return () آبجکت Generator را مجبور به تکمیل و چشم پوشی از کلمات کلیدی دیگر yield می کند. این امر به ویژه در برنامه نویسی ناهمزمان مفید خواهد بود، هنگامی که شما نیاز به لغو توابع دارید ، از جمله قطع یک درخواست وب در هنگامی که کاربری می خواهد یک عمل متفاوت انجام دهد ، زیرا نمی توان مستقیماً یک promise را لغو کرد.
اگر بدنه یک تابع ژنراتور راهی برای گرفتن و مقابله با خطاها داشته باشد ، می توانید از روش throw() برای انتقال خطا به ژنراتور استفاده کنید. این کار ژنراتور را به کار می اندازد، خطا را وارد می کند و ژنراتور را خاتمه می دهد.
برای نشان دادن این امر ، try…catch را وارد بدنه تابع ژنراتور میکنیم و در صورت یافتن خطا آن را log میکند:
// Define a generator function with a try…catch
function* generatorFunction() {
try {
yield ‘Neo’
yield ‘Morpheus’
} catch (error) {
console.log(error)
}
}

// Invoke the generator and throw an error
const generator = generatorFunction()

اکنون ، متد next () را اجرا خواهیم کرد و به دنبال آن () throw:
generator.next()
generator.throw(new Error(‘Agent Smith!’))

خروجی زیر را می دهد:
Output
{value: “Neo”, done: false}
Error: Agent Smith!
{value: undefined, done: true}

با استفاده از () throw ، خطایی به ژنراتور تزریق کردیم که با try…catch پیدا شد و وارد کنسول گردید.
روشها و حالتهای آبجکت ژنراتور
در جدول زیر لیستی از روش های قابل استفاده در ابجکت های ژنراتور نشان داده شده است:
روش توصیف
next() مقدار بعدی ژنراتور را برمیگرداند
return() مقداری را در ژنراتور برمیگرداند و ژنراتور را به پایان میرساند
throw() خطای ایجاد میکند و ژنراتور را به پایان میرساند
next ()
در جدول بعدی حالت های احتمالی یک آبجکت ژنراتور آورده شده است:
وضعیت توضیحات
suspended ژنراتور اجر را متوقف کرده اما به اتمام نرسیده است
closed ژنراتور به وسیله برخورد با خطای ، بازگشت یا تکرار تمام مقادیر ، خاتمه یافته است

نمایندگی yield
علاوه بر اپراتور yield معمولی ، ژنراتورها می توانند از عبارت yield* نیز استفاده کنند تا مقادیر بیشتری را به ژنراتور دیگر واگذار کنند. هنگامی که با yield* در یک ژنراتور مواجهه انجام می شود ، وارد ژنراتور تفویض شده می شود و با تمام yieldها تا زمانی که آن ژنراتور بسته شود ، تکرار را آغاز می کند. این ویژگی می تواند برای جدا کردن توابع مختلف ژنراتور برای سازماندهی معنایی کد شما مورد استفاده قرار گیرد ، در حالی که هنوز همه yieldهای آنها به ترتیب درست قابل تکرار هستند.
برای توضیف بیشتر ، می توانیم دو تابع ژنراتور ایجاد کنیم که یکی از آنها yield* را در دیگری اجرا می کند:
// Generator function that will be delegated to
function* delegate() {
yield 3
yield 4
}

// Outer generator function
function* begin() {
yield 1
yield 2
yield* delegate()
}

در مرحله بعدی ، بیایید از طریق تابع ژنراتور begin() تکرار انجام دهیم:
// Iterate through the outer generator
const generator = begin()

for (const value of generator) {
console.log(value)
}

مقدار زیر را به ترتیب تولید ارائه می دهد:
Output
1
2
3
4

ژنراتور خارجی مقادیر 1 و 2 را میدهد ، سپس با yield* به ژنراتور دیگر واگذار میکند و 3 و 4 را برمیگرداند.
yield* همچنین می تواند به هر آبجکتی که قابل تکرار باشد ، مانند یک آرایه یا یک نقشه واگذار شود. واگذاری yield می تواند در سازماندهی کد کمک کننده باشد ، زیرا هر تابعی در یک ژنراتور که بخواهد از yield استفاده کند نیز باید یک ژنراتور باشد.
جریان های بی نهایت داده
یکی از جنبه های مفید ژنراتورها ، امکان کار با جریان ها و مجموعه های اطلاعات نامحدود است. این را می توان با ایجاد یک حلقه نامحدود در داخل یک تابع ژنراتور نشان داد که یک عدد را یک به یک افزایش می دهد.
در بلوک کد زیر این تابع ژنراتور را تعریف می کنیم و سپس ژنراتور را شروع می کنیم:
// Define a generator function that increments by one
function* incrementer() {
let i = 0

while (true) {
yield i++
}
}

// Initiate the generator
const counter = incrementer()

اکنون با استفاده از next () مقادیر را تکرار کنید:
// Iterate through the values
counter.next()
counter.next()
counter.next()
counter.next()

خروجی زیر را می دهد
Output
{value: 0, done: false}
{value: 1, done: false}
{value: 2, done: false}
{value: 3, done: false}

این تابع مقادیر پی در پی را در حلقه نامحدود برمیگرداند ، در حالی که ویژگی done روی false میماند ، و اطمینان حاصل می کند که تمام نمی شود.
در کار با ژنراتورها ، لازم نیست نگران ایجاد یک حلقه نامحدود باشید ، زیرا می توانید به خواست خود متوقف کنید و از سر بگیرید. با این حال ، شما هنوز هم باید در مورد چگونگی استناد به ژنراتور احتیاط کنید. اگر در یک جریان داده نامتناهی از spread یا for …of استفاده می کنید ، همچنان یک حلقه بی نهایت را یکباره تکرار می کنید ، که باعث کرش محیط می شود.
برای یک مثال پیچیده تر از یک جریان داده نامتناهی ، می توانیم یک تابع ژنراتور فیبوناچی ایجاد کنیم. دنباله فیبوناچی ، که به طور مداوم دو مقدار قبلی را با هم جمع می کند ، می تواند با استفاده از یک حلقه نامحدود در یک ژنراتور به شرح زیر نوشته شود:
// Create a fibonacci generator function
function* fibonacci() {
let prev = 0
let next = 1

yield prev
yield next

// Add previous and next values and yield them forever
while (true) {
const newVal = next + prev

yield newVal

prev = next
next = newVal
}
}

برای آزمایش این مورد ، می توانیم از یک تعداد محدود حلقه کمک بگیریم و دنباله فیبوناچی را بر روی کنسول چاپ کنیم.
// Print the first 10 values of fibonacci
const fib = fibonacci()

for (let i = 0; i < 10; i++) {
console.log(fib.next().value)
}

خروجی زیر را نشان می دهد:
Output
0
1
1
2
3
5
8
13
21
34

توانایی کار با مجموعه داده های نامتناهی بخشی از ویژگی هایی است که ژنراتورها را بسیار قدرتمند می کند. این می تواند برای مثالهایی مانند اجرای اسکرول نامحدود در یک برنامه وب مفید باشد.
انتقال مقادیر در ژنراتورها
در طول این مقاله ، ما از ژنراتورها به عنوان تکرارگر استفاده کرده ایم و در هر تکرار مقادیری به دست آورده ایم. علاوه بر تولید مقادیر ، ژنراتورها می توانند مقادیری را نیز از next () مصرف کنند . در این حالت ، yield شامل یک مقدار است.
توجه به این نکته ضروری است که اولین next () که فراخوانی می شود مقداری را منتقل نمی کند ، بلکه فقط ژنراتور را راه اندازی می کند. برای نشان دادن این ویژگی ، می توانیم مقدار yield را ثبت کنیم و next () را با برخی از مقادیر چند بار فراخوانی کنیم.
function* generatorFunction() {
console.log(yield)
console.log(yield)

return ‘The end’
}

const generator = generatorFunction()

generator.next()
generator.next(100)
generator.next(200)

خروجی زیر را به دست می دهد:
Output
100
200
{value: “The end”, done: true}

همچنین می توان ژنراتور را با مقدار اولیه بذردهی کرد. در مثال زیر ، حلقه ای را ایجاد می کنیم و هر مقدار را به روش next () منتقل می کنیم ، اما یک آرگومان را نیز به تابع اولیه منتقل می کنیم:
function* generatorFunction(value) {
while (true) {
value = yield value * 10
}
}

// Initiate a generator and seed it with an initial value
const generator = generatorFunction(0)

for (let i = 0; i < 5; i++) {
console.log(generator.next(i).value)
}

ما مقدار را از next () بازیابی می کنیم و مقدار جدیدی را در تکرار بعدی میگیریم که ضرب مقدار قبلی در ده است . خروجی زیر را نشان می دهد:
Output
0
10
20
30
40

راه دیگر برای کار با یک ژنراتور این است که ژنراتور را در تابعی محصور کنید که همیشه قبل از انجام هر کار دیگری ، next () را فراخوانی میکند.
async/await به همراه ژنراتورها
یک تابع ناهمزمان نوعی از توابع موجود در ES6 + JavaScript است که با ایجاد ظاهر همزمان، کار با داده های ناهمزمان را آسان تر می کند. ژنراتورها دارای قابلیتهای گسترده تری نسبت به توابع ناهمزمان هستند ، اما قادر به تکرار رفتارهای مشابه هستند. اجرای برنامه نویسی ناهمزمان از این طریق می تواند انعطاف پذیری کد شما را افزایش دهد.
در این بخش نمونه ای از بازتولید async/await را با ژنراتورها نشان خواهیم داد.
بیایید یک تابع ناهمزمان ایجاد کنیم که از API Fetch برای دریافت داده از API JSONPlaceholder استفاده میکند (که داده های JSON مثال را برای اهداف آزمایش ارائه می دهد) و پاسخ را به کنسول وارد می کند.
با تعریف تابعی ناهمزمان به نام getUsers که داده ها را از API دریافت می کند و مجموعه ای از ابجکت ها را برمی گرداند ، شروع کرده سپس getUsers را فراخوانی کنید:
const getUsers = async function() {
const response = await fetch(‘https://jsonplaceholder.typicode.com/users’)
const json = await response.json()

return json
}

// Call the getUsers function and log the response
getUsers().then(response => console.log(response))

با این کار داده های JSON مشابه زیر ارائه می شود:
Output
[ {id: 1, name: “Leanne Graham” …},
{id: 2, name: “Ervin Howell” …},
{id: 3, name”: “Clementine Bauch” …},
{id: 4, name: “Patricia Lebsack”…},
{id: 5, name: “Chelsey Dietrich”…},
…]

با استفاده از ژنراتورها ، می توانیم چیزی تقریباً یکسان ایجاد کنیم که از کلمات کلیدی async/await استفاده نکند. در عوض ، از تابع جدیدی که ایجاد می کنیم استفاده می کند و به جای promiseهای await ، مقادیر را yield میکند.
در بلوک کد زیر ، تابعی به نام getUsers را تعریف می کنیم که از تابع جدید asyncAlt (که بعداً خواهیم نوشت) استفاده می کند تا async / await را شبیه سازی کند.
const getUsers = asyncAlt(function*() {
const response = yield fetch(‘https://jsonplaceholder.typicode.com/users’)
const json = yield response.json()

return json
})

// Invoking the function
getUsers().then(response => console.log(response))

همانطور که می بینیم ، تقریباً شبیه اجرای async/await است ، با این تفاوت که یک تابع ژنراتور وجود دارد که مقادیر را yield میکند.
اکنون می توانیم یک تابع asyncAlt ایجاد کنیم که شبیه به یک تابع ناهمزمان باشد. asyncAlt یک تابع ژنراتور به عنوان یک پارامتر دارد ، که تابع ما میباشد و promiseهایی را که باز می گرداند yield میکند. asyncAlt خود یک تابع را برمی گرداند و هر promise ای که می یابد را تا آخرین مورد برطرف می کند:
// Define a function named asyncAlt that takes a generator function as an argument
function asyncAlt(generatorFunction) {
// Return a function
return function() {
// Create and assign the generator object
const generator = generatorFunction()

// Define a function that accepts the next iteration of the generator
function resolve(next) {
// If the generator is closed and there are no more values to yield,
// resolve the last value
if (next.done) {
return Promise.resolve(next.value)
}

// If there are still values to yield, they are promises and
// must be resolved.
return Promise.resolve(next.value).then(response => {
return resolve(generator.next(response))
})
}

// Begin resolving promises
return resolve(generator.next())
}
}

همان خروجی نسخه async / await را خواهد داد:
Output
[ {id: 1, name: “Leanne Graham” …},
{id: 2, name: “Ervin Howell” …},
{id: 3, name”: “Clementine Bauch” …},
{id: 4, name: “Patricia Lebsack”…},
{id: 5, name: “Chelsey Dietrich”…},
…]

توجه داشته باشید که این اجرا برای نشان دادن چگونگی استفاده از ژنراتورها به جای async / await است و یک طراحی آماده برای تولید نیست. این روش در تنظیمات خطایی ندارد و همچنین توانایی انتقال پارامترها به مقادیر yield را ندارد. گرچه این روش می تواند انعطاف پذیری را به کد شما بیفزاید ، اما اغلب async/awaitانتخاب بهتری خواهد بود ، زیرا جزئیات اجرا را خلاصه می کند و به شما امکان می دهد تا روی نوشتن کد موثر تمرکز کنید.
نتیجه
ژنراتورها فرآیندهایی هستند که می توانند اجرا را متوقف کرده و از سر گرفته شوند. آنها یکی از ویژگی های قدرتمند و همه کاره جاوا اسکریپت هستند ، اگرچه معمولاً مورد استفاده قرار نمی گیرند. در این آموزش با توابع ژنراتور و آبجکت های ژنراتور ، روش های موجود برای ژنراتورها ، عملگرهای yield* و yield و ژنراتورهای مورد استفاده با مجموعه داده های محدود و نامتناهی آشنا شدیم. همچنین یک راه برای پیاده سازی کد ناهمزمان را بدون کال بک های آشیانه ای یا زنجیره های طولانی promise بررسی کردیم.
اگر می خواهید در مورد دستورات JavaScript بیشتر بیاموزید ، به آموزش درک، اتصال ، فراخوانی و اعمال در JavaScript و فهم Map و تنظیم آبجکت ها در آموزش های JavaScript مراجعه کنید.

 

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

نحوه نصب 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
  • ۰
  • ۰

مقدمه
Shipit ابزار جهانی اتوماسیون و استقرار برای توسعه دهندگان Node.js است. این ابزار شامل یک جریان کار بر اساس پکیج محبوب Orchestrator ، ورود به سیستم و دستورات SSH تعاملی از طریق OpenSSH و یک API قابل توسعه است. توسعه دهندگان می توانند از Shipit برای خودکار سازی جریان های کاری ساخت و استقرار در طیف گسترده ای از برنامه های Node.js استفاده کنند.
گردش کار Shipit به توسعه دهندگان اجازه می دهد تا نه تنها کارها را پیکربندی کنند ، بلکه ترتیب اجرای آنها را نیز مشخص کنند. و اینکه آیا باید همزمان یا ناهمزمان اجرا شوند و در کدام محیط قرار گیرند.
در این آموزش Shipit را برای به کارگیری برنامه Node.js از محیط توسعه محلی خود به محیط تولید خود نصب و پیکربندی می کنید. شما به وسیله موارد زیر از Shipit برای استقرار برنامه خود و پیکربندی سرور مجازی از راه دور استفاده میکنید:
• انتقال فایل های برنامه Node.js از محیط محلی خود به محیط تولید (با استفاده از rsync ، git و ssh).
• نصب متعلقات برنامه (ماژول های گره).
• پیکربندی و مدیریت فرآیندهای Node.js در حال اجرا بر روی سرور مجازی از راه دور با PM2.
پیش نیازها
قبل از شروع این آموزش به موارد زیر نیاز خواهید داشت:
⦁ دو سرور مجازی CentOS 7 (در این آموزش آنها را با app و web نامگذاری میکنیم) که توسط شبکه های خصوصی و طبق آموزش نحوه تنظیم برنامه Node.js برای تولید در CentOS 7 پیکربندی شده باشد.
⦁ Nginx (روی سرور مجازی وب خود) که با TLS / SSL همانطور که در آموزش نحوه ایمن سازی Nginx با رمزگذاری در CentOS 7 نشان داده شده ایمن شده باشد. توجه داشته باشید ، اگر پیش نیازها را به ترتیب دنبال می کنید ، فقط باید مراحل 1 ، 4 و 6 را در سرور مجازی وب خود انجام دهید.
⦁ Node.js و npm که در محیط توسعه شما نصب شده باشند. در این آموزش از نسخه 10.17.0 استفاده شده است. برای نصب این برنامه در macOS یا Ubuntu 18.04 ، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی را در macOS یا نصب با استفاده از بخش PPA از نحوه نصب Node.js در اوبونتو 18.04 دنبال کنید. با نصب Node.js ، npm را نیز نصب خواهید کرد. این آموزش از نسخه 6.11.3 استفاده می کند.
⦁ یک کامپیوتر توسعه محلی که روی آن rsync و git نصب شده باشد.
⦁ در macOS می توانید این موارد را با Homebrew نصب کنید.
⦁ برای نصب git در توزیع های لینوکس ، آموزش نحوه نصب Git را دنبال کنید.
⦁ یک حساب کاربری با GitHub یا یک ارائه دهنده سرویس git میزبان دیگر. در این آموزش از GitHub استفاده می شود.
توجه: کاربران Windows برای اجرای دستورات موجود در این راهنما نیاز به نصب ساب سیستم ویندوز برای لینوکس دارند.

مرحله 1 – تنظیم منبع راه دور
Shipit برای همگام سازی بین دستگاه توسعه محلی و سرور مجازی از راه دور به یک منبع Git نیاز دارد. در این مرحله یک منبع از راه دور در Github.com ایجاد خواهید کرد. در حالی که هر ارائه دهنده (PROVIDER) کمی متفاوت است ، دستورات تا حدودی قابل انتقال هستند.
برای ایجاد یک منبع ، Github.com را در مرورگر وب خود باز کنید و وارد شوید. متوجه خواهید شد که در گوشه سمت راست و بالای هر صفحه یک نماد + وجود دارد. روی + کلیک کنید ، و سپس روی New repository کلیک کنید.

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

به صورت اختیاری ، توضیحی از منبع خود اضافه کنید.

نمایش منبع خود را بر اساس اولویت خود ، عمومی یا خصوصی تنظیم کنید.
اطمینان حاصل کنید که منبع با .gitignore آغاز شده است ، از لیست کشویی Add .gitignore ، node را انتخاب کنید. این مرحله برای جلوگیری از اضافه شدن فایل های غیر ضروری (مانند پوشه node_modules) به منبع شما مهم است.

روی دکمه Create repository کلیک کنید.
اکنون منبع باید از Github.com به دستگاه محلی شما کلون شود.
ترمینال خود را باز کرده و به محلی که می خواهید فایلهای پروژه Node.js خود را ذخیره کنید ، بروید. توجه داشته باشید که این فرآیند یک زیر پوشه را در دیرکتوری اصلی ایجاد می کند. برای کلون کردن منبع به دستگاه محلی خود ، دستور زیر را اجرا کنید:
⦁ $ git clone https://github.com/your-github-username/your-github-repository-name.git
برای بازتاب نام کاربری Github و نام منبع قبلاً عرضه شده خود ، باید your-github-username و your-github-repository-name را جایگزین کنید.
توجه: اگر تأیید صحت دو عاملی (2FA) را در Github.com فعال کرده اید ، هنگام دسترسی به Github در خط فرمان ، باید از یک نشانه دسترسی شخصی یا کلید SSH به جای رمزعبور استفاده کنید. صفحه راهنما Github مربوط به 2FA اطلاعات بیشتری را ارائه می دهد.

خروجی مشابه با این خواهید دید:
Output
Cloning into ‘your-github-repository-name’…
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Unpacking objects: 100% (3/3), done.

با اجرای دستور زیر به منبع بروید:
⦁ $ cd your-github-repository-name

در داخل منبع یک فایل تکی و پوشه وجود دارد که هر دو فایل مورد استفاده Git برای مدیریت منبع هستند. می توانید این موضوع را با این دستور زیر تأیید کنید:
⦁ $ ls -la

خروجی مشابه زیر را مشاهده خواهید کرد:
Output
total 8
0 drwxr-xr-x 4 asciant staff 128 22 Apr 07:16 .
0 drwxr-xr-x 5 asciant staff 160 22 Apr 07:16 ..
0 drwxr-xr-x 13 asciant staff 416 22 Apr 07:16 .git
8 -rw-r–r– 1 asciant staff 914 22 Apr 07:16 .gitignore

اکنون که یک منبع git کاری را پیکربندی کرده اید ، فایل shipit.js را ایجاد خواهید کرد که روند استقرار شما را مدیریت می کند.
مرحله 2 – ادغام shipit در یک پروژه Node.js
در این مرحله ، یک نمونه پروژه Node.js ایجاد می کنید و سپس پکیج های Shipit را اضافه می کنید. این آموزش یک برنامه مثال را ارائه می دهد – سرور مجازی وب Node.js که درخواست HTTP را می پذیرد و با Hello World در متن ساده پاسخ می دهد. برای ایجاد برنامه ، دستور زیر را اجرا کنید:
⦁ $ nano hello.js
کد برنامه مثال زیر را به hello.js اضافه کنید (به روزرسانی متغیر APP_PRIVATE_IP_ADDRESS به آدرس IP شبکه خصوصی سرور مجازی برنامه خود(:
hello.js
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(8080, ‘APP_PRIVATE_IP_ADDRESS’);
console.log(‘Server running at http://APP_PRIVATE_IP_ADDRESS:8080/’);

اکنون فایل pack.json خود را برای برنامه تان ایجاد کنید:
⦁ $ npm init -y
این دستور یک فایل pack.json ایجاد می کند ، که شما برای پیکربندی برنامه Node.js خود استفاده خواهید کرد. در مرحله بعد ، با رابط خط فرمان npm ، به این فایل متعلقات را اضافه خواهید کرد.
Output
Wrote to ~/hello-world/package.json:
{
“name”: “hello-world”,
“version”: “1.0.0”,
“description”: “”,
“main”: index.js”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″
},
“keywords”: [],
“author”: “”,
“license”: “ISC”
}

سپس ، بسته های npm لازم را با دستور زیر نصب کنید:
⦁ $ npm install –save-dev shipit-cli shipit-deploy shipit-shared
از فلگ –save-dev استفاده می کنید زیرا بسته های Shipit فقط در دستگاه محلی شما مورد نیاز است. خروجی مشابه زیر را مشاهده خواهید کرد:
Output
+ shipit-shared@4.4.2
+ shipit-cli@4.2.0
+ shipit-deploy@4.1.4
updated 4 packages and audited 21356 packages in 11.671s
found 62 low severity vulnerabilities run `npm audit fix` to fix them, or `npm audit` for details

این کار همچنین سه بسته را به عنوان بسته های توسعه به فایل pack.json شما اضافه میکند:
package.json
. . .
“devDependencies”: {
“shipit-cli”: “^4.2.0”,
“shipit-deploy”: “^4.1.4”,
“shipit-shared”: “^4.4.2”
},
. . .

با پیکربندی محیط محلی خود ، اکنون می توانید به سراغ آماده سازی سرور مجازی برنامه از راه دور برای استقرار مبتنی بر Shipit بروید.
مرحله 3 – تهیه سرور مجازی برنامه از راه دور
در این مرحله از ssh برای اتصال به سرور مجازی برنامه خود و نصب متعلقات از راه دور rsync استفاده خواهید کرد. Rsync ابزاری برای انتقال کارآمد و همگام سازی فایل ها بین درایوهای رایانه های محلی و در سراسر رایانه های شبکه با مقایسه زمان و اندازه تغییر فایل ها است.
Shipit از rsync برای انتقال و همگام سازی فایل ها بین رایانه محلی و سرور مجازی برنامه از راه دور استفاده می کند. شما دستوراتی را به صورت مستقیم به rsync صادر نمی کنید ؛ Shipit آن را برای شما مدیریت می کند.
توجه: راهنمای نحوه راه اندازی یک برنامه Node.js برای تولید در CentOS 7 ، دو سرور مجازی app و web را به شما معرفی میکند. این دستورات باید فقط در app اجرا شوند.

از طریق sshبه سرور مجازی برنامه راه دور خود متصل شوید:
⦁ $ ssh deployer@your_app_server_ip
rsync را با اجرای دستور زیر بر روی سرور مجازی خود نصب کنید:
⦁ $ sudo yum install rsync
نصب را با دستور زیر تایید کنید:
⦁ $ rsync –version
خط مشابهی را در خروجی این دستور مشاهده خواهید کرد:
Output
rsync version 3.1.2 protocol version 31
. . .

می توانید بخش ssh خود را با تایپ کردن exit پایان دهید.
با نصب و دسترسی rsync در خط فرمان ، می توانید به سراغ کارهای استقرار و ارتباط آنها با رویدادها بروید.
مرحله 4 – پیکربندی و اجرای کارهای استقرار
هم events و هم tasks مؤلفه های اصلی استقرار Shipit هستند و درک چگونگی تکمیل استقرار برنامه شما توسط آن ها مهم است. رویدادهای (events) ناشی از Shipit بیانگر نقاط خاصی در چرخه عمر استقرار هستند. کارها (tasks) بر اساس توالی چرخه زندگی Shipit در پاسخ به این رویدادها اجرا خواهند شد.
یک نمونه متداول از این که این سیستم وظیفه / رویداد در یک برنامه Node.js چگونه مفید است ، نصب متعلقات برنامه (node_modules) روی سرور مجازی راه دور است. بعداً در این مرحله ، شما باید Shipit را برای بررسی و گوش دادن به رویداد آپدیت شده (که بعد از انتقال فایل های برنامه صادر می شود) به کار بگیرید و یک task را برای نصب متعلقات برنامه (نصب npm) بر روی سرور مجازی راه دور اجرا کنید.
برای گوش دادن به رویدادها و اجرای وظایف ، Shipit به یک فایل پیکربندی نیاز دارد که اطلاعات مربوط به سرور مجازی راه دور شما (سرور مجازی app) را در اختیار داشته باشد و شنوندگان رویدادها و دستوراتی را که باید توسط این وظایف اجرا شوند را ثبت می کند. این فایل در رایانه توسعه محلی شما ، در دیرکتوری برنامه Node.js شما قرار دارد.
برای شروع ، این فایل را ایجاد کنید ، از جمله اطلاعاتی درباره سرور مجازی راه دور خود ، شنوندگان رویدادی که می خواهید تایید کنید و برخی از تعریف های مربوط به کارهایتان. با اجرای دستور زیر shipitfile.js را در دیرکتوری اصلی برنامه خود در دستگاه محلی خود ایجاد کنید:
⦁ $ nano shipitfile.js
اکنون که فایلی را ایجاد کرده اید ، باید اطلاعات اولیه محیطی مورد نیاز Shipit را جمع کند. در درجه اول مکان منبع Git از راه دور شما و مهمتر از همه ، آدرس IP عمومی سرور مجازی برنامه شما و حساب کاربری SSH میباشد.
این پیکربندی اولیه را اضافه کنید و خطوط هایلایت شده را به روز کنید تا با محیط شما مطابقت داشته باشد:
shipitfile.js
module.exports = shipit => {
require(‘shipit-deploy’)(shipit);
require(‘shipit-shared’)(shipit);

const appName = ‘hello’;

shipit.initConfig({
default: {
deployTo: ‘/home/sammy/your-domain’,
repositoryUrl: ‘https://git-provider.tld/YOUR_GIT_USERNAME/YOUR_GIT_REPO_NAME.git’,
keepReleases: 5,
shared: {
overwrite: true,
dirs: [‘node_modules’]
}
},
production: {
servers: ‘sammy@YOUR_APP_SERVER_PUBLIC_IP’
}
});

const path = require(‘path’);
const ecosystemFilePath = path.join(
shipit.config.deployTo,
‘shared’,
‘ecosystem.config.js’
);

// Our listeners and tasks will go here

};

به روزرسانی متغیرها در روش shipit.initConfig پیکربندی خاصی را برای Shipit برای استقرار شما فراهم می کند. این موارد نشان دهنده موارد زیر برای Shipit است:
⦁ deployTo: دایرکتوری است که Shipit کد برنامه شما را روی سرور مجازی از راه دور مستقر می کند. در اینجا از پوشه / home / برای کاربر غیر root با امتیازات sudo (/ home / sammy) استفاده می کنید چرا که امن است و از مشکلات مجوزی جلوگیری می کند. مؤلفه /your-domain یک کنوانسیون نامگذاری برای تشخیص پوشه از سایر موارد در پوشه هوم کاربر است.
⦁ repositoryUrl: URL برای منبع کامل Git است ، Shipit از این URL استفاده می کند تا اطمینان حاصل کند که فایل های پروژه قبل از استقرار در همگام سازی هستند.
⦁ KeepReleases: تعداد نسخه هایی است که می توانید روی سرور مجازی از راه دور نگه دارید. یک نسخه پوشه ای با تاریخ مهر شده است که حاوی فایل های برنامه شما در زمان انتشار میباشد. اینها می توانند برای رول بک استقرار مفید باشند.
⦁ Shared : پیکربندی است که با KeepReleases مطابقت دارد و اجازه می دهد تا دایرکتوری ها بین نسخه ها به اشتراک گذاشته شوند. در این مثال ، یک پوشه node_modules منفرد داریم که بین همه نسخه ها به اشتراک گذاشته می شود.
⦁ production: یک سرور مجازی از راه دور را برای به کارگیری برنامه شما به کاربر نشان می دهد. در این مثال ، شما دارای یک سرور مجازی واحد (سرور مجازی app) هستید که نام production را با پیکربندی servers: متناسب با کاربر SSH و آدرس IP عمومی خود نامگذاری میکنید. نام production مربوط به Shipit ، فرمان استفاده شده در انتهای این آموزش به کار میگیرد (npx shipit server name deploy یا در مورد شما ( npx shipit production deploy
اطلاعات بیشتر در مورد موضوع پیکربندی Shipit Deploy را می توان در منبع Shipit Github یافت.
قبل از ادامه به روزرسانی shipitfile.js ، اجازه دهید نمونه خرده کد زیر را برای درک وظایف Shipit بررسی کنیم:
Example event listenershipit.on(‘deploy’, () => {
shipit.start(‘say-hello’);
});

shipit.blTask(‘say-hello’, async () => {
shipit.local(‘echo “hello from your local computer”‘)
});

این یک task نمونه است که از روش shipit.on برای عضویت در رویداد deploy استفاده می کند. این task منتظر میماند تا رویداد deploy توسط چرخه Shipit منتشر شود ، پس از دریافت رویداد ، task روش shipit.start را اجرا می کند که به Shipit می گوید کار say-hello را شروع کند.
روش shipit.on دو پارامتر میگیرد ، نام رویداد برای گوش دادن به آن و تابع callback برای اجرا هنگام دریافت رویداد.
طبق توضیحات روش shipit.on ، task با روش shipit.blTask ​​تعریف شده است. این یک task جدید Shipit ایجاد می کند که سایر کارها را هنگام اجرای آن مسدود می کند (یک task همزمان است). روش shipit.blTask ​​نیز دو پارامتر میگیرد ، نام task ای که آن را تعریف می کند و یک تابع callback برای اجرا هنگام فعالسازی task توسط shipit.start .
در تابع callback این مثال (say-hello) ، روش shipit.local یک دستور در دستگاه محلی اجرا می کند. فرمان محلی ” hello from your local computer ” را به خروجی ترمینال می فرستد.
اگر می خواستید یک دستور روی سرور مجازی از راه دور اجرا کنید ، از روش shipit.remote استفاده می کردید. دو روش ، shipit.local و shipit.remote ، API را برای صدور دستورات به صورت محلی یا از راه دور به عنوان بخشی از استقرار فراهم می کنند.
اکنون shipitfile.js را به روز کنید تا شنوندگان رویداد برای عضویت در چرخه Shipit با shipit.on عضو شوند. شنوندگان رویداد را به shipitfile.js خود اضافه کنید و آنها را پس از مکان نگهدارنده کامنت از پیکربندی اولیه // Our tasks will go here درج کنید:
shipitfile.js
. . .
shipit.on(‘updated’, () => {
shipit.start(‘npm-install’, ‘copy-config’);
});

shipit.on(‘published’, () => {
shipit.start(‘pm2-server’);
});

این دو روش در حال گوش دادن به رویدادهای به روز شده و منتشر شده هستند که به عنوان بخشی از چرخه Shipit منتشر می شوند. هنگامی که این رویداد دریافت شد ، هر یک از آنها taskهایی را با استفاده از روش shipit.start ، به طور مشابه با task مثال ، آغاز می کنند.
اکنون که جدول شنوندگان را برنامه ریزی کرده اید ، task مربوطه را اضافه خواهید کرد. task زیر را به shipitfile.js خود اضافه کنید ، آنها را بعد از شنوندگان رویداد خود وارد کنید:
shipitfile.js
. . .
shipit.blTask(‘copy-config’, async () => {

const fs = require(‘fs’);

const ecosystem = `
module.exports = {
apps: [
{
name: ‘${appName}’,
script: ‘${shipit.releasePath}/hello.js’,
watch: true,
autorestart: true,
restart_delay: 1000,
env: {
NODE_ENV: ‘development’
},
env_production: {
NODE_ENV: ‘production’
}
}
]
};`;

fs.writeFileSync(‘ecosystem.config.js’, ecosystem, function(err) {
if (err) throw err;
console.log(‘File created successfully.’);
});

await shipit.copyToRemote(‘ecosystem.config.js’, ecosystemFilePath);
});

ابتدا یک task را با عنوان copy-config اعلام می کنید. این task یک فایل محلی به نام ecosystem.config.js ایجاد می کند و سپس آن فایل را در سرور مجازی برنامه راه دور شما کپی می کند. PM2 از این فایل برای مدیریت برنامه Node.js استفاده می کند. این کار اطلاعات مسیر لازم جهت فایل را به PM2 برای اطمینان از اجرای آخرین فایل های مستقر شده در اختیار شما قرار می دهد. بعداً در مراحل ساخت ، TASK ای را ایجاد خواهید کرد که PM2 را با ecosystem.config.js به عنوان پیکربندی اجرا می کند.
اگر برنامه شما به متغیرهای محیطی نیاز دارد (مانند رشته اتصال به بانک اطلاعاتی) می توانید آنها را به صورت محلی در env: یا در سرور مجازی راه دور در env_production اعلام کنید: به همان روشی که متغیر NODE_ENV را در این موضوعات تنظیم کرده اید.
بعد از copy-config ، task بعدی را به shipitfile.js اضافه کنید:
shipitfile.js
. . .
shipit.blTask(‘npm-install’, async () => {
shipit.remote(`cd ${shipit.releasePath} && npm install –production`);
});

در مرحله بعد ، task ای به نام npm-install را اعلام می کنید. این task برای نصب متعلقات برنامه (بسته های npm) از یک ترمینال bash از راه دور (از طریق shipit.remote) استفاده می کند.
بعد از npm-install ، آخرین task را به shipitfile.js خود اضافه کنید:
shipitfile.js
. . .
shipit.blTask(‘pm2-server’, async () => {
await shipit.remote(`pm2 delete -s ${appName} || :`);
await shipit.remote(
`pm2 start ${ecosystemFilePath} –env production –watch true`
);
});

سرانجام task ای بنام pm2-server را اعلام می کنید. این task نیز از یک ترمینال bash از راه دور استفاده می کند تا ابتدا PM2 را از مدیریت استقرار قبلی شما از طریق فرمان delete متوقف کند و سپس یک نمونه جدید از سرور مجازی Node.js شما را شروع کند که فایل ecosystem.config.js را به عنوان یک متغیر فراهم می کند. شما همچنین به PM2 اطلاع میدهید که باید در تنظیمات اولیه خود از متغیرهای محیطی از بلوک production استفاده کند و از PM2 می خواهید که برنامه را تماشا کند و در صورت خرابی مجدداً آن را راه اندازی کند.
فایل کامل shipitfile.jsاینگونه خواهد بود:
shipitfile.js
module.exports = shipit => {
require(‘shipit-deploy’)(shipit);
require(‘shipit-shared’)(shipit);

const appName = ‘hello’;

shipit.initConfig({
default: {
deployTo: ‘/home/deployer/example.com’,
repositoryUrl: ‘https://git-provider.tld/YOUR_GIT_USERNAME/YOUR_GIT_REPO_NAME.git’,
keepReleases: 5,
shared: {
overwrite: true,
dirs: [‘node_modules’]
}
},
production: {
servers: ‘deployer@YOUR_APP_SERVER_PUBLIC_IP’
}
});

const path = require(‘path’);
const ecosystemFilePath = path.join(
shipit.config.deployTo,
‘shared’,
‘ecosystem.config.js’
);

// Our listeners and tasks will go here
shipit.on(‘updated’, async () => {
shipit.start(‘npm-install’, ‘copy-config’);
});

shipit.on(‘published’, async () => {
shipit.start(‘pm2-server’);
});

shipit.blTask(‘copy-config’, async () => {
const fs = require(‘fs’);
const ecosystem = `
module.exports = {
apps: [
{
name: ‘${appName}’,
script: ‘${shipit.releasePath}/hello.js’,
watch: true,
autorestart: true,
restart_delay: 1000,
env: {
NODE_ENV: ‘development’
},
env_production: {
NODE_ENV: ‘production’
}
}
]
};`;

fs.writeFileSync(‘ecosystem.config.js’, ecosystem, function(err) {
if (err) throw err;
console.log(‘File created successfully.’);
});

await shipit.copyToRemote(‘ecosystem.config.js’, ecosystemFilePath);
});

shipit.blTask(‘npm-install’, async () => {
shipit.remote(`cd ${shipit.releasePath} && npm install –production`);
});

shipit.blTask(‘pm2-server’, async () => {
await shipit.remote(`pm2 delete -s ${appName} || :`);
await shipit.remote(
`pm2 start ${ecosystemFilePath} –env production –watch true`
);
});
};

هنگامی که آماده بودید ، فایل را ذخیره کنید و از آن خارج شوید.
با پیکربندی shipitfile.js ، و نهایی کردن شنوندگان رویدادها و کارهای مرتبط، می توانید به سراغ استقرار روی سرور مجازی برنامه بروید.
مرحله 5 – استقرار برنامه
در این مرحله ، برنامه خود را از راه دور مستقر می کنید و آزمایش می کنید که استقرار برنامه شما را در دسترس اینترنت قرار داده شده است.
از آنجا که Shipit فایلهای پروژه را از منبع راه دور Git کلون می کند ، باید فایلهای برنامه Node.js محلی خود را از دستگاه محلی خود به سمت Github بفرستید. به دیرکتوری برنامه های پروژه Node.js خود بروید (جایی که hello.js و shiptitfile.js در آن قرار دارند) و دستور زیر را اجرا کنید:
⦁ $ git status
دستور git status وضعیت دایرکتوری کاری و منطقه مرحله بندی را نشان می دهد. به شما امکان می دهد ببینید کدام تغییرات روی صحنه رفته است ، کدام موارد انجام نشده است ، و کدام فایل ها توسط Git ردیابی نمی شوند. فایل های شما غیرفعال هستند و در خروجی به صورت قرمز ظاهر می شوند:
Output
On branch master
Your branch is up to date with ‘origin/master’.

Untracked files:
(use “git add <file>…” to include in what will be committed)

hello.js
package-lock.json
package.json
shipitfile.js

nothing added to commit but untracked files present (use “git add” to track)

با دستور زیر می توانید این فایل ها را به منبع خود اضافه کنید:
⦁ $ git add –all
این دستور هیچ گونه خروجی ایجاد نمی کند ، اگرچه اگر شما مجدداً git statu را اجرا کنید ، فایل ها با توجه به این نکته که تغییراتی در این زمینه وجود دارد سبز می شوند.
می توانید با اجرای دستور زیر یک commit ایجاد کنید:
⦁ $ git commit -m “Our first commit”
خروجی این فرمان برخی از اطلاعات مخصوص Git درباره فایل ها را فراهم می کند
Output
[master c64ea03] Our first commit
4 files changed, 1948 insertions(+)
create mode 100644 hello.js
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 shipitfile.js

تمام کاری که اکنون باقی مانده است این است که commit خود را به منبع راه دور Shipit منتقل کنید تا در حین استقرار به سرور مجازی برنامه شما کلون شود. دستور زیر را اجرا کنید:
⦁ $ git push origin master
خروجی شامل اطلاعات مربوط به هماهنگی با منبع از راه دور است:
Output
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 15.27 KiB | 7.64 MiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:Asciant/hello-world.git
e274312..c64ea03 master -> master

برای استقرار برنامه خود ، دستور زیر را اجرا کنید:
⦁ $ npx shipit production deploy
خروجی این دستور (که کل آن بسیار طولانی است) جزئیات مربوط به کارهایی که انجام می شود و نتیجه تابع خاص را ارائه میدهد. خروجی زیر برای کار pm2-server نشان می دهد که برنامه Node.js راه اندازی شده است:
Output
Running ‘deploy:init’ task…
Finished ‘deploy:init’ after 432 μs
. . .
Running ‘pm2-server’ task…
Running “pm2 delete -s hello || :” on host “centos-ap-app.asciant.com”.
Running “pm2 start /home/deployer/example.com/shared/ecosystem.config.js –env production –watch true” on host “centos-ap-app.asciant.com”.
@centos-ap-app.asciant.com [PM2][WARN] Node 4 is deprecated, please upgrade to use pm2 to have all features
@centos-ap-app.asciant.com [PM2][WARN] Applications hello not running, starting…
@centos-ap-app.asciant.com [PM2] App [hello] launched (1 instances)
@centos-ap-app.asciant.com ┌──────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────────┬──────────┐
@centos-ap-app.asciant.com │ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
@centos-ap-app.asciant.com ├──────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────────┼──────────┤
@centos-ap-app.asciant.com │ hello │ 0 │ 1.0.0 │ fork │ 4177 │ online │ 0 │ 0s │ 0% │ 4.5 MB │ deployer │ enabled │
@centos-ap-app.asciant.com └──────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────────┴──────────┘
@centos-ap-app.asciant.com Use `pm2 show <id|name>` to get more details about an app
Finished ‘pm2-server’ after 5.27 s

Running ‘deploy:clean’ task…
Keeping “5” last releases, cleaning others
Running “(ls -rd /home/deployer/example.com/releases/*|head -n 5;ls -d /home/deployer/example.com/releases/*)|sort|uniq -u|xargs rm -rf” on host “centos-ap-app.asciant.com”.
Finished ‘deploy:clean’ after 1.81 s

Running ‘deploy:finish’ task…
Finished ‘deploy:finish’ after 222 μs
Finished ‘deploy’ [ deploy:init, deploy:fetch, deploy:update, deploy:publish, deploy:clean, deploy:finish ]

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

Hello World را می بینید.
توجه: پس از اولین استقرار ، منبع Git شما فایل جدید ایجاد شده با نام ecosystem.config.js را پیگیری می کند. از آنجا که این فایل در هر استقرار بازسازی می شود ، و ممکن است حاوی اطلاعات سری برنامه کامپایل شده باشد ، باید قبل از انجام اقدامات بعدی ، به فایل .gitignore در دیرکتوری برنامه ریشه برنامه در دستگاه محلی شما اضافه شود.
.gitignore
. . .
# ecosystem.config
ecosystem.config.js

شما برنامه Node.js خود را روی سرور مجازی برنامه خود مستقر کرده اید ، که به استقرار جدید شما اشاره دارد. با به روز رسانی و راه اندازی همه موارد، می توانید به سراغ نظارت بر فرآیندهای برنامه خود بروید.
مرحله 6 – نظارت بر برنامه تان
PM2 ابزاری عالی برای مدیریت فرآیندهای از راه دور شما است ، اما همچنین ویژگی هایی را برای نظارت بر عملکرد این فرآیندهای برنامه فراهم می کند.
با این دستور به سرور مجازی برنامه راه دور خود از طریق SSH متصل شوید:
⦁ $ ssh deployer@your_app_server_ip
برای به دست آوردن اطلاعات خاص مربوط به فرآیندهای مدیریت شده PM2 خود ، دستور زیر را اجرا کنید:
⦁ $ pm2 list
خروجی مشابه زیر را مشاهده میکنید:
Output
┌─────────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬──────┬───────────┬──────────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├─────────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼──────┼───────────┼──────────┼──────────┤
│ hello │ 0 │ 0.0.1 │ fork │ 3212 │ online │ 0 │ 62m │ 0.3% │ 45.2 MB │ deployer │ enabled │
└─────────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴──────┴───────────┴──────────┴──────────┘

خلاصه اطلاعاتی را که PM2 جمع آوری کرده است مشاهده خواهید کرد. برای دیدن اطلاعات دقیق ، می توانید دستور زیر را اجرا کنید:
⦁ $ pm2 show hello
خروجی روی اطلاعات خلاصه ارائه شده توسط فرمان pm2 list گسترش می یابد. همچنین اطلاعات مربوط به تعدادی از دستورات جانبی را در اختیار شما قرار می دهد و مکان فایل های log را در اختیار شما قرار می دهد:
Output
Describing process with id 0 – name hello
┌───────────────────┬─────────────────────────────────────────────────────────────┐
│ status │ online │
│ name │ hello │
│ version │ 1.0.0 │
│ restarts │ 0 │
│ uptime │ 82s │
│ script path │ /home/deployer/example.com/releases/20190531213027/hello.js │
│ script args │ N/A │
│ error log path │ /home/deployer/.pm2/logs/hello-error.log │
│ out log path │ /home/deployer/.pm2/logs/hello-out.log │
│ pid path │ /home/deployer/.pm2/pids/hello-0.pid │
│ interpreter │ node │
│ interpreter args │ N/A │
│ script id │ 0 │
│ exec cwd │ /home/deployer │
│ exec mode │ fork_mode │
│ node.js version │ 4.2.3 │
│ node env │ production │
│ watch & reload │ ✔ │
│ unstable restarts │ 0 │
│ created at │ 2019-05-31T21:30:48.334Z │
└───────────────────┴─────────────────────────────────────────────────────────────┘
Revision control metadata
┌──────────────────┬────────────────────────────────────────────────────┐
│ revision control │ git │
│ remote url │ N/A │
│ repository root │ /home/deployer/example.com/releases/20190531213027 │
│ last update │ 2019-05-31T21:30:48.559Z │
│ revision │ 62fba7c8c61c7769022484d0bfa46e756fac8099 │
│ comment │ Our first commit │
│ branch │ master │
└──────────────────┴────────────────────────────────────────────────────┘
Divergent env variables from local env
┌───────────────────────────┬───────────────────────────────────────┐
│ XDG_SESSION_ID │ 15 │
│ HOSTNAME │ N/A │
│ SELINUX_ROLE_REQUESTED │ │
│ TERM │ N/A │
│ HISTSIZE │ N/A │
│ SSH_CLIENT │ 44.222.77.111 58545 22 │
│ SELINUX_USE_CURRENT_RANGE │ │
│ SSH_TTY │ N/A │
│ LS_COLORS │ N/A │
│ MAIL │ /var/mail/deployer │
│ PATH │ /usr/local/bin:/usr/bin │
│ SELINUX_LEVEL_REQUESTED │ │
│ HISTCONTROL │ N/A │
│ SSH_CONNECTION │ 44.222.77.111 58545 209.97.167.252 22 │
└───────────────────────────┴───────────────────────────────────────┘
. . .

PM2 همچنین ابزاری برای نظارت بر ترمینال فراهم می کند که با دستور زیر قابل انجام است:
⦁ $ pm2 monit
خروجی این دستور یک داشبورد تعاملی است ، که در آن pm2 اطلاعات مربوط به فرآیند realtime ، ورودها ، متریک ها و ابرداده ها را ارائه می دهد. این داشبورد ممکن است به نظارت بر منابع و ورودی های خطا کمک کند:
Output
┌─ Process list ────────────────┐┌─ Global Logs ─────────────────────────────────────────────────────────────┐
│[ 0] hello Mem: 22 MB ││ │
│ ││ │
│ ││ │
└───────────────────────────────┘└───────────────────────────────────────────────────────────────────────────┘
┌─ Custom metrics (http://bit.l─┐┌─ Metadata ────────────────────────────────────────────────────────────────┐
│ Heap Size 10.73 ││ App Name hello │
│ Heap Usage 66.14 ││ Version N/A │
│ Used Heap Size 7.10 ││ Restarts 0 │
│ Active requests 0 ││ Uptime 55s │
│ Active handles 4 ││ Script path /home/asciant/hello.js │
│ Event Loop Latency 0.70 ││ Script args N/A │
│ Event Loop Latency p95 ││ Interpreter node │
│ ││ Interpreter args N/A │
└───────────────────────────────┘└───────────────────────────────────────────────────────────────────────────┘

با درک اینکه چگونه می توانید فرایندهای خود را با PM2 کنترل کنید ، می توانید به نحوه عملکرد Shipit در برگشت به یک استقرار کاری قبلی کمک کنید.
بخش ssh خود را با اجرای exit ، روی سرور مجازی برنامه خود پایان دهید.
مرحله 7 – برگشت به یک استقرار دچار مشکل (bugged)
استقرارها گاه به گاه در معرض اشکالات پیش بینی نشده یا مواردی قرار میگیرند که باعث می شود سایت شما خراب با مشکل رو به رو شود. توسعه دهندگان و محافظان Shipit این موضوع را پیش بینی کرده اند و این امکان را برای شما فراهم کرده اند که بتوانید به استقرار قبلی (کار) برنامه خود برگردید.

برای اطمینان از وجود پیکربندی PM2 خود ، در رویداد برگشت ، شنونده رویداد دیگری را به shipitfile.js اضافه کنید:
shipitfile.js
. . .
shipit.on(‘rollback’, () => {
shipit.start(‘npm-install’, ‘copy-config’);
});

برای اجرای وظایف npm-install و copy-config ، یک شنوند را به رویداد بازگشت اضافه می کنید. این امر ضروری است زیرا برخلاف رویداد منتشر شده (published )، رویداد به روز شده (updated ) توسط چرخه Shipit هنگام بازگشت استقرار اجرا نمی شود. افزودن این شنونده رویداد ، اطمینان حاصل می کند که مدیر فرآیند PM2 شما حتی در صورت بازگشت مجدد ، به جدیدترین استقرار اشاره می کند.
این فرایند شبیه به استقرار اما با تغییر جزئی در فرمان میباشد. برای بازگشت به حالت قبلی می توانید دستور زیر را اجرا کنید:
⦁ $ npx shipit production rollback
مانند دستور deploy  ، rollback  جزئیات مربوط به روند برگشت و کارهایی که انجام می شود را ارائه می دهد:
Output
Running ‘rollback:init’ task…
Get current release dirname.
Running “if [ -h /home/deployer/example.com/current ]; then readlink /home/deployer/example.com/current; fi” on host “centos-ap-app.asciant.com”.
@centos-ap-app.asciant.com releases/20190531213719
Current release dirname : 20190531213719.
Getting dist releases.
Running “ls -r1 /home/deployer/example.com/releases” on host “centos-ap-app.asciant.com”.
@centos-ap-app.asciant.com 20190531213719
@centos-ap-app.asciant.com 20190531213519
@centos-ap-app.asciant.com 20190531213027
Dist releases : [“20190531213719″,”20190531213519″,”20190531213027”].
Will rollback to 20190531213519.
Finished ‘rollback:init’ after 3.96 s

Running ‘deploy:publish’ task…
Publishing release “/home/deployer/example.com/releases/20190531213519”
Running “cd /home/deployer/example.com && if [ -d current ] && [ ! -L current ]; then echo “ERR: could not make symlink”; else ln -nfs releases/20190531213519 current_tmp && mv -fT current_tmp current; fi” on host “centos-ap-app.asciant.com”.
Release published.
Finished ‘deploy:publish’ after 1.8 s

Running ‘pm2-server’ task…
Running “pm2 delete -s hello || :” on host “centos-ap-app.asciant.com”.
Running “pm2 start /home/deployer/example.com/shared/ecosystem.config.js –env production –watch true” on host “centos-ap-app.asciant.com”.
@centos-ap-app.asciant.com [PM2][WARN] Node 4 is deprecated, please upgrade to use pm2 to have all features
@centos-ap-app.asciant.com [PM2][WARN] Applications hello not running, starting…
@centos-ap-app.asciant.com [PM2] App [hello] launched (1 instances)
@centos-ap-app.asciant.com ┌──────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────────┬──────────┐
@centos-ap-app.asciant.com │ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
@centos-ap-app.asciant.com ├──────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────────┼──────────┤
@centos-ap-app.asciant.com │ hello │ 0 │ 1.0.0 │ fork │ 4289 │ online │ 0 │ 0s │ 0% │ 4.5 MB │ deployer │ enabled │
@centos-ap-app.asciant.com └──────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────────┴──────────┘
@centos-ap-app.asciant.com Use `pm2 show <id|name>` to get more details about an app
Finished ‘pm2-server’ after 5.55 s

Running ‘deploy:clean’ task…
Keeping “5” last releases, cleaning others
Running “(ls -rd /home/deployer/example.com/releases/*|head -n 5;ls -d /home/deployer/example.com/releases/*)|sort|uniq -u|xargs rm -rf” on host “centos-ap-app.asciant.com”.
Finished ‘deploy:clean’ after 1.82 s

Running ‘rollback:finish’ task…
Finished ‘rollback:finish’ after 615 μs
Finished ‘rollback’ [ rollback:init, deploy:publish, deploy:clean, rollback:finish ]

شما Shipit را پیکربندی کرده اید تا 5 نسخه را از طریق KeepReleases حفظ کند: 5 پیکربندی در shipitfile.js. Shipit این نسخه ها را به صورت داخلی ردیابی می کند تا در صورت لزوم بتواند به عقب برگردد. Shipit همچنین با ایجاد دایرکتوری به نام timestamp (YYYYMMDDHHmmss – مثال: / home / deployer / your-domain / Releases / 20190420210548) راهی مفید برای شناسایی نسخه ها ارائه می دهد.
اگر می خواهید فرآیند برگشت را سفارشی کنید ، می توانید وقایع خاص مربوط به عملیات برگشت را شنود کنید. سپس می توانید از این رویدادها برای اجرای کارهایی استفاده کنید که برگشت شما را تکمیل می کند. می توانید به لیست رویدادهای ارائه شده در تجزیه چرخه shipit مراجعه کرده و tasks/listeners را در shipitfile.js خود پیکربندی کنید.
قابلیت برگشت به معنای این است که شما همیشه می توانید یک نسخه کاربردی برنامه خود را در اختیار کاربران خود قرار دهید حتی اگر یک استقرار با مشکلات یا باگ غیرمنتظره مواجه شود.
نتیجه
در این آموزش ، شما یک گردش کاری را پیکربندی کرده اید که به شما امکان می دهد یک جایگزین بسیار قابل تنظیم برای Platform را به عنوان یک سرویس ایجاد کنید، که همه از چند سرور مجازی ایجاد میشوند . این گردش کار امکان استقرار و پیکربندی سفارشی ، نظارت بر فرآیند با PM2 ، امکان مقیاس و اضافه کردن خدمات یا سرور مجازی های اضافی یا محیط های مورد نیاز را در صورت لزوم فراهم می کند.
اگر علاقه دارید که ویژگی های Node.js خود را بیشتر بدانید، محتوای vpsgol Node.js و همچنین نحوه رمزگذاری در سری 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