ايجاد سرور مجازي

ايجاد سرور مجازي

چگونه مي توان REST API را با Prisma و PostgreSQL ساخت

Prisma ، يك ابزار پايگاه داده منبع باز است. از سه ابزار اصلي تشكيل شده است:
Prisma Client: سازنده جستار خودكار و از نوع مطمئن براي Node.js و TypeScript.
Prisma Migrate: يك سيستم توصيفي انتقال و مدل سازي داده ها.
Prisma Studio: رابط كاربري گرافيكي براي مشاهده و ويرايش داده ها در پايگاه داده خود.
اين ابزارها با هدف افزايش بهره وري يك برنامه نويس در گردش كار در پايگاه داده خود ارائه مي شود. يكي از مهمترين مزاياي Prisma ميزان انتزاع ارائه شده است: به جاي فهميدن جستارهاي پيچيده SQL يا انتقال شماتيك ها ، توسعه دهندگان برنامه مي توانند هنگام استفاده از Prisma براي كار با پايگاه داده خود ، اطلاعات خود را به روشي بصري تر استدلال كنند.
در اين آموزش ، شما يك API REST براي يك برنامه بلاگ نويسي كوچك در TypeScript با استفاده از Prisma و يك پايگاه داده PostgreSQL ايجاد خواهيد كرد. پايگاه داده PostgreSQL را بصورت محلي با Docker تنظيم مي كنيد و مسيرهاي REST API را با استفاده از Express پياده سازي مي كنيد. در پايان آموزش ، يك وب سرور داريد كه بصورت محلي روي دستگاه شما كار مي كند كه مي تواند به درخواست هاي مختلف HTTP پاسخ دهد و داده ها را در ديتابيس بخواند و بنويسد.
پيش نيازها
اين آموزش موارد زير را فرض مي كند:
Node.js v10 يا بالاتر روي دستگاه شما نصب شده باشد. براي تنظيم اين گزينه مي توانيد از يكي از روش هاي نصب Node.js و ايجاد محيط توسعه محلي براي سيستم عامل خود استفاده كنيد.
Docker نصب شده بر روي دستگاه تان (براي اجراي پايگاه داده PostgreSQL) . مي توانيد از طريق وب سايت Docker آن را روي maغير مجاز مي باشد و Windows نصب كنيد ، يا نحوه نصب و استفاده از Docker را براي توزيع هاي لينوكس دنبال كنيد.
آشنايي اوليه با TypeScript و API هاي REST مفيد است اما براي اين آموزش لازم نيست.
مرحله 1 – ايجاد پروژه TypeScript
در اين مرحله با استفاده از npm يك پروژه ساده TypeScript تنظيم مي كنيد. اين پروژه پايه و اساس API REST است كه مي خواهيد در طول دوره اين آموزش بسازيد.
ابتدا يك دايركتوري جديد براي پروژه خود ايجاد كنيد:
$ mkdir my-blog

در مرحله بعد ، به ديركتوري برويد و يك پروژه npm خالي را آغاز كنيد. توجه داشته باشيد كه گزينه -y در اينجا بدان معني است كه شما از گزينه هاي تعاملي فرمان عبور ميكنيد. براي اجراي دستورها ، -y را از دستور حذف كنيد:
$ cd my-blog

$ npm init -y

براي اطلاعات بيشتر در مورد اين پيام ها ، مي توانيد مرحله 1 نحوه استفاده از ماژول هاي Node.js را با npm و pack.json دنبال كنيد.
با پاسخهاي پيش فرض موجود ، خروجي مشابه موارد زير را دريافت خواهيد كرد:
Output
Wrote to /…/my-blog/package.json:

{
“name”: “my-blog”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“scripts”: {
“test”: “echo ”Error: no test specified” && exit 1″
},
“keywords”: [],
“author”: “”,
“license”: “ISC”
}

اين دستور يك فايل pack.json حداقلي ايجاد مي كند كه شما به عنوان فايل پيكربندي پروژه npm خود استفاده مي كنيد. اكنون آماده تنظيم پيكربندي TypeScript در پروژه خود هستيد.
دستور زير را براي ستاپ ساده TypeScript اجرا كنيد:
npm install typescript ts-node @types/node –save-dev

اين دستور، سه بسته به عنوان متعلقات توسعه در پروژه شما نصب مي كند:
Typescript: زنجيره ابزار TypeScript.
ts-node: بسته اي براي اجراي برنامه هاي TypeScript بدون كامپايل قبلي با JavaScript
@ types / node: تعاريف نوع TypeScript براي Node.js.
آخرين كاري كه بايد انجام دهيد اضافه كردن فايل tsconfig.json است تا اطمينان حاصل شود كه TypeScript به درستي براي برنامه اي كه مي خواهيد بسازيد پيكربندي شده است.
ابتدا ، دستور زير را براي ايجاد فايل اجرا كنيد:
$ nano tsconfig.json

كد JSON زير را در فايل اضافه كنيد:
my-blog/tsconfig.json
{
“compilerOptions”: {
“sourceMap”: true,
“outDir”: “dist”,
“strict”: true,
“lib”: [“esnext”],
“esModuleInterop”: true
}
}

فايل را ذخيره و از آن خارج شويد.
اين يك پيكربندي استاندارد و حداقل براي يك پروژه TypeScript است. اگر مي خواهيد در مورد خصوصيات فردي فايل پيكربندي بياموزيد ، مي توانيد آنها را در مستندات TypeScript جستجو كنيد.
شما پروژه ساده TypeScript خود را با استفاده از npm تنظيم كرده ايد. سپس پايگاه داده PostgreSQL خود را با Docker تنظيم مي كنيد و Prisma را به آن وصل مي كنيد.
مرحله 2 – تنظيم Prisma با PostgreSQL
در اين مرحله Prisma CLI را نصب مي كنيد ، فايل شماتيك اوليه Prisma خود را ايجاد كرده و PostgreSQL را با Docker تنظيم مي كنيد و Prisma را به آن وصل مي كنيد. شماتيك Prism فايل پيكربندي اصلي براي تنظيم Prisma شما است و شامل شماتيك پايگاه داده شما ميباشد.
با نصب دستور Prisma CLI با دستور زير شروع كنيد:
$ npm install @prisma/cli –save-dev

به عنوان بهترين روش ، توصيه مي شود كه Prisma CLI را بصورت محلي در پروژه خود نصب كنيد (برخلاف نصب جهاني). اين امر به شما كمك مي كند تا در صورت داشتن بيش از يك پروژه Prisma در دستگاه خود ، از تداخل نسخه ها جلوگيري كنيد.
در مرحله بعد ، پايگاه داده PostgreSQL خود را با استفاده از Docker تنظيم مي كنيد. با دستور زير يك فايل جديد Docker Compose ايجاد كنيد:
$ nano docker-compose.yml

اكنون كد زير را به فايل جديد ايجاد شده اضافه كنيد:
my-blog/docker-compose.yml
version: ‘3.8’
services:
postgres:
image: postgres:10.3
restart: always
environment:
– POSTGRES_USER=sammy
– POSTGRES_PASSWORD=your_password
volumes:
– postgres:/var/lib/postgresql/data
ports:
– ‘5432:5432’
volumes:
postgres:

اين فايل Docker Compose يك پايگاه داده PostgreSQL را تنظيم مي كند كه از طريق پورت 5432 كانتينر Docker قابل دسترسي است. همچنين توجه داشته باشيد كه اعتبارنامه ديتابيس در حال حاضر به عنوان sammy (كاربر) و your_password (رمز عبور) تعيين شده است. در تنظيم اين اعتبارها با كاربر و رمز عبور دلخواه خود اختيارعمل كامل داريد. فايل را ذخيره كنيد و از آن خارج شويد.
با استفاده از اين ستاپ، سرور پايگاه داده PostgreSQL را با دستور زير راه اندازي كنيد:
$ docker-compose up -d

خروجي اين دستور مشابه اين است:
Output
Pulling postgres (postgres:10.3)…
10.3: Pulling from library/postgres
f2aa67a397c4: Pull complete
6de83ca23e55: Pull complete
. . .
Status: Downloaded newer image for postgres:10.3
Creating my-blog_postgres_1 … done

با دستور زير مي توانيد تأييد كنيد كه سرور پايگاه داده در حال اجرا است:
$ docker ps

اين چيزي شبيه به اين نتيجه خواهد داد:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8547f8e007ba postgres:10.3 “docker-entrypoint.s…” 3 seconds ago Up 2 seconds 0.0.0.0:5432->5432/tcp my-blog_postgres_1

با اجراي سرور پايگاه داده ، اكنون مي توانيد ستاپ Prisma خود را ايجاد كنيد. دستور زير را از Prisma CLI اجرا كنيد:
با اين كار خروجي زير چاپ مي شود:
$ npx prisma init

خروجي زير را پرينت ميكند:
Output
✔ Your Prisma schema was created at prisma/schema.prisma.
You can now open it in your favorite editor.

توجه داشته باشيد كه به عنوان بهترين كار ، بايد تمام فراخواني هاي Prisma CLI را با npxپيشونددار كنيد. اين كار اطمينان حاصل مي كند نصب محلي شما در حال استفاده است.
پس از اجراي فرمان ، Prisma CLI يك پوشه جديد به نام prisma را در پروژه شما ايجاد كرد. اين شامل دو فايل زير است:
schema.prisma: فايل اصلي پيكربندي پروژه Prisma شما (شامل مدل داده شما خواهد بود(.
.env: يك فايل dotenv براي مشخص كردن URL اتصال به پايگاه داده خود.
براي اطمينان از اينكه Prisma از مكان پايگاه داده شما اطلاع دارد ، فايل .env را باز كنيد و متغير محيط DATABASE_URL را تنظيم كنيد.
ابتدا فايل .env را باز كنيد:
$ nano prisma/.env

اكنون مي توانيد متغير محيط را به شرح زير تنظيم كنيد:
my-blog/prisma/.env
DATABASE_URL=”postgresql://sammy:your_password@localhost:5432/my-blog?schema=public”

اطمينان حاصل كنيد كه اعتبار ديتابيس را به مواردي كه در فايل Docker Compose معرفي كرده ايد تغيير دهيد. براي كسب اطلاعات بيشتر در مورد قالب URL اتصال ، به اسناد Prisma مراجعه كنيد.
پس از اتمام كار ، فايل را ذخيره كنيد و خارج شويد.
در اين مرحله ، پايگاه داده PostgreSQL خود را با Docker تنظيم كرده ، Prisma CLI را نصب كرده و Prisma را از طريق يك متغير محيط به پايگاه داده وصل مي كنيد. در بخش بعدي ، مدل داده خود را تعيين كرده و جداول بانك اطلاعاتي خود را ايجاد خواهيد كرد.
مرحله 3 – تعريف مدل داده خود و ايجاد جداول بانك اطلاعاتي
در اين مرحله مدل داده خود را در فايل شماتيك Prisma تعريف خواهيد كرد. سپس اين مدل داده با Prisma Migrate به پايگاه داده نگاشت مي شود كه عبارت SQL را براي ايجاد جداول متناسب با مدل داده شما توليد و ارسال مي كند. از آنجا كه شما در حال ايجاد يك برنامه وبلاگ نويسي هستيد ، ماهيت هاي اصلي برنامه، كاربران و پستها خواهند بود.
Prisma از زبان مدل سازي داده خود استفاده مي كند تا شكل داده هاي برنامه شما را تعريف كند.
ابتدا فايل schema.prisma خود را با دستور زير باز كنيد:
$ nano prisma/schema.prisma

حالا تعاريف مدل زير را به آن اضافه كنيد. شما مي توانيد مدل ها را در پايين فايل ، درست پس از بلوك generator clientقرار دهيد:
my-blog/prisma/schema.prisma
. . .
model User {
id Int @default(autoincrement()) @id
email String @unique
name String?
posts Post[]
}

model Post {
id Int @default(autoincrement()) @id
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}

فايل را ذخيره كنيد و از آن خارج شويد.
شما در حال تعريف دو مدل به نام هاي كاربر و پست هستيد. هر يك از اين موارد داراي تعدادي فيلد است كه نشان دهنده ويژگي هاي مدل است. مدل ها در جداول بانك اطلاعاتي نگاشت مي شوند. فيلد ها ستون هاي فردي را نشان مي دهند.
همچنين توجه داشته باشيد كه بين اين دو مدل رابطه يك به يك وجود دارد ، كه توسط فيلدهاي رابطه اي posts  و author  در User  و Post مشخص شده است. اين بدان معني است كه يك كاربر مي تواند با بسياري از پست ها در ارتباط باشد.
با استفاده از اين مدل ها ، اكنون مي توانيد جداول مربوطه را با استفاده از Prisma Migrate در ديتابيس ايجاد كنيد. در ترمينال خود دستور زير را اجرا كنيد:
$ npx prisma migrate save –experimental –create-db –name “init”

اين دستور يك تغيير جديد در سيستم فايل شما ايجاد مي كند. در اينجا يك مرور اجمالي از سه گزينه ارائه شده به اين دستور آمده است:
–experimental: الزامي است زيرا Prisma Migrateدر حال حاضر در حالت آزمايشي قرار دارد.
–create-db: Prisma Migrate را قادر مي سازد تا پايگاه داده اي را با نام وبلاگ من ايجاد كند كه در URL اتصال مشخص شده است.
–name “init”: انتقال را مشخص مي كند (براي نامگذاري پوشه جا به جايي ايجاد شده در سيستم فايل شما استفاده خواهد شد).
خروجي اين دستور مشابه اين است:
Output
New datamodel:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

datasource db {
provider = “postgresql”
url = env(“DATABASE_URL”)
}

generator client {
provider = “prisma-client-js”
}

model User {
id Int @default(autoincrement()) @id
email String @unique
name String?
posts Post[]
}

model Post {
id Int @default(autoincrement()) @id
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}

Prisma Migrate just created your migration 20200811140708-init in

migrations/
└─ 20200811140708-init/
└─ steps.json
└─ schema.prisma
└─ README.md

در جتجوي فايل هاي migration كه در ديركتوري prisma/migrations ايجاد شده اند ، آزادانه عمل كنيد.
براي اجراي جابه جايي در برابر پايگاه داده خود و ايجاد جداول براي مدل هاي Prisma ، دستور زير را در ترمينال خود اجرا كنيد:
$ npx prisma migrate up –experimental

خروجي زير را دريافت خواهيد كرد:
Output
. . .
Checking the datasource for potential data loss…

Database Changes:

Migration Database actions Status

20200811140708-init 2 CreateTable statements. Done ????

You can get the detailed db changes with prisma migrate up –experimental –verbose
Or read about them here:
./migrations/20200811140708-init/README.md

???? Done with 1 migration in 206ms.

اكنون Prisma Migrate عبارات SQL را كه براي جابه جايي لازم است توليد مي كند و آنها را به پايگاه داده مي فرستد. موارد زير عبارات SQL است كه جدول ها را ايجاد كرده است:
CREATE TABLE “public”.”User” (
“id” SERIAL,
“email” text NOT NULL ,
“name” text ,
PRIMARY KEY (“id”)
)

CREATE TABLE “public”.”Post” (
“id” SERIAL,
“title” text NOT NULL ,
“content” text ,
“published” boolean NOT NULL DEFAULT false,
“authorId” integer ,
PRIMARY KEY (“id”)
)

CREATE UNIQUE INDEX “User.email” ON “public”.”User”(“email”)

ALTER TABLE “public”.”Post” ADD FOREIGN KEY (“authorId”)REFERENCES “public”.”User”(“id”) ON DELETE SET NULL ON UPDATE CASCADE

در اين مرحله شما مدل داده خود را در شماي Prisma خود تعريف كرده و جداول پايگاه داده هاي مربوطه را با Prisma Migrate ايجاد كرده ايد. در مرحله بعد ، Prisma Client را در پروژه خود نصب خواهيد كرد تا بتوانيد از پايگاه داده پرس و جو كنيد.
مرحله چهارم – كاوش در مورد جستارهاي كلاينت Prisma در يك اسكريپت ساده
Prisma Client يك سازنده جستار خودكار ايجاد شده و از نوع مطمئن است كه مي توانيد با استفاده از برنامه هاي Node.js يا TypeScript ، داده ها را در يك پايگاه داده بخوانيد و بنويسيد. شما مي توانيد از آن براي دسترسي به بانك اطلاعاتي در مسيرهاي REST API خود ، جايگزين كردن ORM هاي معمول ، جستارهاي ساده SQL ، لايه هاي دسترسي به داده هاي سفارشي يا هر روش ديگري براي صحبت با يك پايگاه داده استفاده كنيد.
در اين مرحله Prisma Client را نصب مي كنيد و با جستارهايي كه مي توانيد با آن ارسال كنيد آشنا مي شويد. قبل از اجراي مسيرهاي API REST در مراحل بعدي ، ابتدا برخي از جستارهاي Prisma را با يك اسكريپت ساده و اجرايي جستجو خواهيد كرد.
ابتدا پيش برويد و با باز كردن ترمينال خود و نصب بسته npm Prisma Client در پروژه خود ، Prisma Client را در پروژه خود نصب كنيد:
npm install @prisma/client

سپس ، دايركتوري جديدي بنام src ايجاد كنيد كه شامل فايل هاي منبع شما باشد:
mkdir src

اكنون يك فايل TypeScript را در داخل ديركتوري جديد ايجاد كنيد:
nano src/index.ts

كليه جستارهاي Prisma Client ، عباراتي را برميگرداند كه مي توانيد در كد خود await  كنيد. اين امر نياز دارد كه شما جستارها را درون يك تابع async ارسال كنيد.
boilerplate زير را با يك تابع async كه در اسكريپت شما اجرا شده است اضافه كنيد:
my-blog/src/index.ts
import { PrismaClient } from ‘@prisma/client’

const prisma = new PrismaClient()

async function main() {
// … your Prisma Client queries will go here
}

main()
.catch((e) => console.error(e))
.finally(async () => await prisma.disconnect())

در اينجا مرور مختصري بر boilerplate آورده شده است:
1- سازنده PrismaClient را از بسته npm @prisma/client كه قبلاً نصب شده بود ، وارد كنيد.
2- با تماس با سازنده ، و دريافت نمونه اي به نام prisma ؛ PrismaClient را معرفي مي كنيد.
3- يك تابع async  به نام main  تعريف مي كنيد كه در مرحله بعدي جستارهايPrisma Client خود را اضافه خواهيد كرد.
4-تابع main  را فراخواني مي كنيد ، در حالي كه مي توانيد هر استثناء بالقوه را بدست آوريد و اطمينان حاصل كنيد كه Prisma Client با فراخواني prisma.disconnect () اتصالهاي پايگاه داده باز را ميبندد.
با وجود تابع main  ، مي توانيد جستارهاي Prisma Client را به اسكريپت اضافه كنيد. index.ts را تنظيم كنيد تا به شرح زير باشد:
my-blog/src/index.ts
import { PrismaClient } from ‘@prisma/client’

const prisma = new PrismaClient()

async function main() {
const newUser = await prisma.user.create({
data: {
name: ‘Alice’,
email: ‘alice@prisma.io’,
posts: {
create: {
title: ‘Hello World’,
},
},
},
})
console.log(‘Created new user: ‘, newUser)

const allUsers = await prisma.user.findMany({
include: { posts: true },
})
console.log(‘All users: ‘)
console.dir(allUsers, { depth: null })
}

main()
.catch((e) => console.error(e))
.finally(async () => await prisma.disconnect())

در اين كد ، شما از دو جستار Prisma Client استفاده مي كنيد:
create: يك ركورد كاربر جديد ايجاد مي كند. توجه كنيد كه شما در واقع از نوشتن تودرتو استفاده مي كنيد ، به اين معني كه شما يك ركورد كاربر و پست را در همان جستار ايجاد مي كنيد.
findMany: تمام ركوردهاي كاربر موجود را از پايگاه داده مي خواند. شما گزينه include را داريد كه علاوه بر آن ركورد Post مربوط را براي هر ركورد كاربر را بارگذاري مي كند.
اكنون اسكريپت را با دستور زير اجرا كنيد:
$ npx ts-node src/index.ts

خروجي زير را در ترمينال خود دريافت خواهيد كرد:
Output
Created new user: { id: 1, email: ‘alice@prisma.io’, name: ‘Alice’ }
[
{
id: 1,
email: ‘alice@prisma.io’,
name: ‘Alice’,
posts: [
{
id: 1,
title: ‘Hello World’,
content: null,
published: false,
authorId: 1
}
]
}

توجه: اگر از يك رابط كاربري گرافيكي ديتابيس استفاده مي كنيد ، مي توانيد با نگاه كردن به جداول كاربر و پست ، تأييد كنيد كه داده ها ايجاد شده اند. از طرف ديگر ، مي توانيد داده هاي موجود در استوديوي Prisma را با اجراي npx prisma studio –experimental پيدا كنيد.
اكنون از Prisma Client براي خواندن و نوشتن داده در پايگاه داده خود استفاده كرده ايد. در مراحل باقيمانده ، از دانش جديد براي اجراي مسيرهاي مربوط به نمونه REST API استفاده خواهيد كرد.
مرحله 5 – اجراي اولين مسير API REST شما
در اين مرحله ، Express را در برنامه خود نصب خواهيد كرد. Express يك چارچوب وب محبوب براي Node.js است كه شما براي اجراي مسيرهاي REST API خود در اين پروژه استفاده خواهيد كرد. اولين مسيري كه پياده سازي خواهيد كرد به شما امكان مي دهد تا با استفاده از يك درخواست GET ، كليه كاربران را از API منتقل كنيد. داده هاي كاربر با استفاده از Prisma Client از بانك اطلاعاتي بازيابي مي شوند.
پيش برويد و Express را با دستور زير نصب كنيد:
$ npm install express

از آنجا كه از TypeScript استفاده مي كنيد ، بهتر است انواع مربوطه را نيز به عنوان متعلقات توسعه نصب كنيد. دستور زير را براي اين كار اجرا كنيد:
$ npm install @types/express –save-dev

با متعلقات موجود ، مي توانيد برنامه Express خود را تنظيم كنيد.
دوباره با باز كردن فايل منبع اصلي خود شروع كنيد:
$ nano src/index.ts

اكنون تمام كد هاي موجود در index.ts را پاك كرده و آن را با موارد زير جايگزين كنيد تا REST API خود را شروع كنيد:
my-blog/src/index.ts
import { PrismaClient } from ‘@prisma/client’
import express from ‘express’

const prisma = new PrismaClient()
const app = express()

app.use(express.json())

// … your REST API routes will go here

app.listen(3000, () =>
console.log(‘REST API server ready at: http://localhost:3000’),
)

در اينجا خلاصه اي از كد توضيح داده شده است:
1- شما PrismaClient و express را از بسته هاي npm مربوطه وارد مي كنيد.
2- با تماس با سازنده ، PrismaClient را معرفي مي كنيد و نمونه اي به نام prisma را دريافت مي آوريد.
3- با تماس با Express () برنامه Express خود را ايجاد مي كنيد.
4- مي توانيد واسط Express.json () را براي اطمينان از پردازش صحيح داده هاي JSON توسط Express ، اضافه كنيد.
5- سرور را از پورت 3000 شروع مي كنيد.
اكنون مي توانيد اولين مسير خود را پياده كنيد. در بين تماس هاي app.use و app.listen ، كد زير را اضافه كنيد:
my-blog/src/index.ts
. . .
app.use(express.json())

app.get(‘/users’, async (req, res) => {
const users = await prisma.user.findMany()
res.json(users)
})

app.listen(3000, () =>
console.log(‘REST API server ready at: http://localhost:3000’),
)

پس از افزودن ، فايل خود را ذخيره كنيد و از آن خارج شويد. سپس سرور وب محلي خود را با استفاده از دستور زير شروع كنيد:
$ npx ts-node src/index.ts

خروجي زير را دريافت خواهيد كرد:
Output
REST API server ready at: http://localhost:3000

براي دسترسي به مسير /users مي توانيد مرورگر خود را به آدرس http: // localhost: 3000 / كاربر يا هر كلاينت HTTP ديگري هدايت كنيد.
در اين آموزش ، تمام مسيرهاي REST API را با استفاده از Curl ، يك كلاينت HTTP مبتني بر ترمينال ، تست خواهيد كرد.
توجه: اگر ترجيح مي دهيد از يك سرويس دهنده HTTP مبتني بر GUI استفاده كنيد ، مي توانيد از گزينه هاي ديگري مانند Postwoman يا Advanced REST Client استفاده كنيد.
براي آزمايش مسير خود ، يك پنجره يا تب ترمينال جديد باز كنيد (به اين ترتيب كه وب سرور محلي شما قادر به اجراي آن باشد) و دستور زير را اجرا كنيد:
$ curl http://localhost:3000/users

داده هاي كاربري را كه در مرحله قبل ايجاد كرده ايد دريافت خواهيد كرد:
Output
[{“id”:1,”email”:”alice@prisma.io”,”name”:”Alice”}]

توجه داشته باشيد كه اين بار آرايه posts  گنجانده نشده است. اين امر به اين دليل است كه شما در اجراي مسير /users گزينه include را به تماس findMany منتقل نمي كنيد.
شما اولين مسير REST API خود را در /usersپياده سازي كرده ايد. در مرحله بعدي مسيرهاي باقيمانده API را براي اضافه كردن قابليت هاي بيشتر به API خود پياده سازي خواهيد كرد.
مرحله 6 – اجراي مسيرهاي باقيمانده REST API
در اين مرحله مسيرهاي باقيمانده API را براي برنامه وبلاگ نويسي خود پياده سازي خواهيد كرد. در پايان ، سرور وب شما درخواست هاي مختلف GET ، POST ، PUT و DELETE را ارائه مي دهد.
در اينجا مروري بر مسيرهاي مختلفي كه اجرا خواهيد كرد:
HTTP Method مسير توصيف
GET /feed تمام پست هاي منتشر شده را ميگيرد
GET /post/:id پست خاصي را با IDميگيرد
POST /user كاربر جديد ايجاد ميكند
POST /post پست جديد ايجاد ميكند (به عنوان پيش نويس)
PUT /post/publish/:id فيلد published  را روي true قرار ميدهد
DELETE post/:id پستي را بر جسب ID حذف ميكند

پيش برويد و ابتدا مسيرهاي GET باقيمانده را پياده سازي كنيد.
index.ts را با دستور زير باز كنيد:
$ nano src/index.ts

سپس ، بعد از اجراي مسير /users، كد زير را اضافه كنيد:
my-blog/src/index.ts
. . .

app.get(‘/feed’, async (req, res) => {
const posts = await prisma.post.findMany({
where: { published: true },
include: { author: true }
})
res.json(posts)
})

app.get(`/post/:id`, async (req, res) => {
const { id } = req.params
const post = await prisma.post.findOne({
where: { id: Number(id) },
})
res.json(post)
})

app.listen(3000, () =>
console.log(‘REST API server ready at: http://localhost:3000’),
)

فايل خود را ذخيره كنيد و از آن خارج شويد.
اين كد مسيرهاي API را براي دو درخواست GET پياده سازي مي كند:
/ feed: ليستي از پستهاي منتشر شده را برمي گرداند.
/ post /: id: يك پست خاص را با شناسه خود برمي گرداند.
Prisma Client در هر دو پياده سازي استفاده مي شود. در اجراي مسير /feed، جستار شما كه با فيلترهاي Prisma Client براي همه سوابق پست مي كنيد و در آن ستون published  شامل مقدار واقعي است. علاوه بر اين ، جستارهاي مربوط به Prisma Client شامل اطلاعات author مربوطه براي هر پست برگشتي نيز مي باشد. در اجراي مسير / post /: id ، مي توانيد شناسه اي را كه از مسير URL بازيابي مي شود براي خواندن يك ركورد ارسال خاص از پايگاه داده در حال عبور هستيد.
مي توانيد CTRL + C را در صفحه كيبورد خود بزنيد و سرور را متوقف كنيد. سپس ، سرور را با استفاده از دستور زير ريستارت كنيد:
$ npx ts-node src/index.ts

براي تست مسير /feed، مي توانيد از دستور curl زير استفاده كنيد:
$ curl http://localhost:3000/feed

از آنجا كه هنوز هيچ پستي منتشر نشده است ، اين پاسخ ارايه خالي به همراه دارد:
Output
[]
براي بررسي مسير /post/:id ميتوانيد از دستور زير استفاده كنيد:
$ curl http://localhost:3000/post/1

پستي كه ابتدا ايجاد كرده ايد را برميگرداند:
Output
{“id”:1,”title”:”Hello World”,”content”:null,”published”:false,”authorId”:1}

سپس دو مسير post را اجرا كنيد. كد زير را به index.ts پس از پياده سازي مسير GET اضافه كنيد
my-blog/src/index.ts
. . .

app.post(`/user`, async (req, res) => {
const result = await prisma.user.create({
data: { …req.body },
})
res.json(result)
})

app.post(`/post`, async (req, res) => {
const { title, content, authorEmail } = req.body
const result = await prisma.post.create({
data: {
title,
content,
published: false,
author: { connect: { email: authorEmail } },
},
})
res.json(result)
})

app.listen(3000, () =>
console.log(‘REST API server ready at: http://localhost:3000’),
)
پس از اتمام كار ، پرونده خود را ذخيره كنيد و خارج شويد.
اين كد مسيرهاي API را براي دو درخواست POST پياده سازي مي كند:
/ user: كاربر جديدي را در ديتابيس ايجاد مي كند.
/ post: يك پست جديد در بانك اطلاعاتي ايجاد مي كند.
مانند قبل ، Prisma Client در هر دو پياده سازي استفاده مي شود. در اجراي مسير /user، مقادير را از بدنه درخواست HTTP به جستار create  در Prisma Client منتقل مي كنيد.
مسير /post كمي بيشتر درگير است: در اينجا نمي توانيد مقادير را مستقيماً از بدنه درخواست HTTP عبور دهيد. در عوض ، ابتدا بايد آنها را به صورت دستي استخراج كنيد تا آنها را به جستار Prisma Client منتقل كنيد. دليل اين امر اين است كه ساختار JSON در بدنه درخواست با ساختار مورد انتظار Prisma Client مطابقت ندارد ، بنابراين بايد ساختار مورد نظر را بصورت دستي ايجاد كنيد.
با متوقف كردن سرور با CTRL + C مي توانيد مسيرهاي جديد را آزمايش كنيد. سپس ، سرور را با استفاده از دستور زير ريستارت كنيد:
$ npx ts-node src/index.ts

براي ايجاد يك كاربر جديد از طريق مسير /user، مي توانيد درخواست POST زير را با استفاده از curlارسال كنيد:
$ curl -X POST -H “Content-Type: application/json” -d ‘{“name”:”Bob”, “email”:”bob@prisma.io”}’ http://localhost:3000/user

با اين كار كاربر جديدي در ديتابيس ايجاد مي شود و خروجي زير را چاپ مي كند:
Output
{“id”:2,”email”:”bob@prisma.io”,”name”:”Bob”}

براي ايجاد يك پست جديد از طريق مسير /post، مي توانيد درخواست POST  زير را با curl ارسال كنيد:
$ curl -X POST -H “Content-Type: application/json” -d ‘{“title”:”I am Bob”, “authorEmail”:”bob@prisma.io”}’ http://localhost:3000/post

با اين كار پست جديدي در ديتابيس ايجاد شده و با ايميل bob@prisma.io به كاربر وصل مي شود. خروجي زير را چاپ مي كند:
Output
{“id”:2,”title”:”I am Bob”,”content”:null,”published”:false,”authorId”:2}

سرانجام مي توانيد مسيرهاي PUT و DELETE را پياده سازي كنيد.
index.ts را با دستور زير باز كنيد:
$ nano src/index.ts

در مرحله بعد ، پس از اجراي دو مسير POST ، كد هايلايت شده را اضافه كنيد:
my-blog/src/index.ts
. . .

app.put(‘/post/publish/:id’, async (req, res) => {
const { id } = req.params
const post = await prisma.post.update({
where: { id: Number(id) },
data: { published: true },
})
res.json(post)
})

app.delete(`/post/:id`, async (req, res) => {
const { id } = req.params
const post = await prisma.post.delete({
where: { id: Number(id) },
})
res.json(post)
})

app.listen(3000, () =>
console.log(‘REST API server ready at: http://localhost:3000’),
)

فايل خود را ذخيره كنيد و از آن خارج شويد.
اين كد مسيرهاي API را براي يك PUT و يك درخواست DELETE پياده سازي مي كند:
/post/publish/:id (PUT): پستي را با شناسه اش منتشر مي كند.
/post/:id (DELETE): پستي را با شناسه آن حذف مي كند.
باز هم ، Prisma Client در هر دو پياده سازي استفاده مي شود. در اجراي /post/publish/:id ، شناسه پستي كه بايد منتشر شود از URL برداشته مي شود و به جستار به روزرساني Prisma Client منتقل مي شود. اجراي مسير / post /: id براي پاك كردن يك پست در ديتابيس نيز شناسه پست را از URL باز مي گيرد و آن را به درخواست حذف Prisma Client منتقل مي كند.
دوباره ، سرور را با CTRL + C در صفحه كليد خود متوقف كنيد. سپس ، سرور را با استفاده از دستور زير ريستارت كنيد:
$ npx ts-node src/index.ts

مي توانيد مسير PUT را با دستور curl زير آزمايش كنيد:
$ curl -X PUT http://localhost:3000/post/publish/2

اين دستور پست را با شناسه برابر با 2 منتشر ميكند. در صورت ارسال درخواست /feed، اين پست در پاسخ گنجانده مي شود.
در آخر ، مي توانيد مسير DELETE را با دستور curl زير آزمايش كنيد:
$ curl -X DELETE http://localhost:3000/post/1

اين دستور پست با شناسه ID 1 را حذف ميكند. براي تأييد اينكه پست با اين شناسه حذف شده است ، مي توانيد يك درخواست GET را به مسير / post / 1 ارسال كنيد.
در اين مرحله ، شما مسيرهاي باقي مانده REST API را براي برنامه وبلاگ نويسي خود پياده سازي كرده ايد. API اكنون به درخواستهاي مختلف GET ، POST ، PUT و DELETE پاسخ مي دهد و عملكردي را براي خواندن و نوشتن داده ها در بانك اطلاعاتي پياده سازي مي كند.
نتيجه
در اين مقاله ، شما يك سرور API REST ايجاد كرده ايد كه داراي چندين مسير مختلف براي ايجاد ، خواندن ، به روزرساني و حذف داده هاي كاربر و ارسال يك برنامه وبلاگ نويسي نمونه است. در داخل مسيرهاي API ، شما در حال استفاده از Prisma Client براي ارسال جستارهاي مربوطه به پايگاه داده خود هستيد.
به عنوان مرحله بعدي ، مي توانيد مسيرهاي API اضافي را پياده سازي كنيد يا طرح پايگاه داده خود را با استفاده از Prisma Migrate گسترش دهيد. براي اطلاع از جوانب مختلف Prisma ، به اسناد Prisma مراجعه كرده و برخي از پروژه هاي نمونه آماده را براي استفاده در مخزن نمونه هاي Prisma – با استفاده از ابزارهايي مانند GraphQL يا APP هاي grPC جستجو كنيد.

 

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

نحوه مديريت چندين سرور با دستورات Ad Hoc Ansible

Ansible ابزاري مدرن براي مديريت پيكربندي است كه كار تنظيم و نگهداري سرور محازي هاي از راه دور را تسهيل مي كند. با يك طراحي مينيماليستي كه قصد دارد كاربران را به روز كرده و به آنها سرعت ببخشد ، به شما اين امكان را مي دهد تا يك يا صدها سيستم را از يك مكان مركزي با playbook يا دستورات ad hoc كنترل كنيد.
بر خلاف playbook- كه شامل مجموعه كارهايي است كه مي توان از آنها استفاده مجدد كرد – دستورات ad hoc كارهايي هستند كه شما مرتباً آنها را انجام نمي دهيد ، مانند راه اندازي مجدد يك سرويس يا بازيابي اطلاعات در مورد سيستمهاي از راه دور كه قابل اعتماد نيستند.

در اين راهنما، ياد مي گيريد كه چگونه از دستورات ad hoc براي انجام كارهاي متداول مانند نصب بسته ها ، كپي كردن فايل ها ، و راه اندازي مجدد سرويس ها بر روي يك يا چند سرور محازي از راه دور ، از يك گره كنترل Ansible استفاده كنيد.

پيش نيازها
براي پيروي از اين راهنما ، به موارد زير نياز داريد:
• يك گره كنترل Ansible. اين راهنما فرض مي كند كه گره كنترل شما يك دستگاه اوبونتو 20.04 است كه Ansible روي آن نصب و پيكربندي شده است تا با استفاده از كليدهاي SSH به ميزبان هاي Ansible شما متصل شود. اطمينان حاصل كنيد كه گره كنترل داراي يك كاربر معمولي با مجوزهاي sudo است و فايروال را نيز فعال كرده است ، همانطور كه در راهنماي ستاپ اوليه سرور محازي توضيح داده شده است. براي راه اندازي Ansible ، لطفا راهنماي ما در مورد نحوه نصب و پيكربندي Ansible در اوبونتو 20.04 را دنبال كنيد.
• دو يا چند ميزبان Ansible. ميزبان Ansible هر دستگاهي است كه گره كنترل Ansible شما براي خودكار سازي پيكربندي شده باشد. اين راهنما فرض مي كند كه ميزبان هاي Ansible شما سرور محازي هاي Ubuntu 20.04 از راه دور هستند. اطمينان حاصل كنيد كه هر ميزبان Ansible داراي موارد زير است:
o كليد عمومي SSH گره كنترل Ansible به كليدهاي مجاز كاربر كاربر اضافه شده باشد. اين كاربر مي تواند root يا يك كاربر معمولي با امتيازات sudo باشد. براي تنظيم اين گزينه ، مي توانيد مرحله 2 راهنماي نحوه تنظيم كليدهاي SSH را در اوبونتو 20.04 دنبال كنيد.
• يك فايل inventory بر روي گره كنترل Ansible تنظيم شده باشد. اطمينان حاصل كنيد كه يك فايل inventory در آن وجود دارد كه شامل همه ميزبان هاي Ansible باشد. براي انجام اين كار ، لطفاً به راهنماي چگونگي تنظيم موجودي هاي Ansible مراجعه كنيد. سپس مطمئن شويد كه با اجراي تست اتصال مشخص شده در بخش تست اتصال به ميزبان هاي Ansible ، مي توانيد به گره هاي خود متصل شويد.

آزمايش اتصال به هاست هاي Ansible
دستور زير اتصال بين گره كنترل Ansible و تمام ميزبان هاي Ansible شما را آزمايش مي كند. اين دستور از كاربر سيستم فعلي و كليد SSH مربوطه آن به عنوان ورود از راه دور استفاده مي كند و گزينه -m را نيز شامل مي شود ، كه به Ansible مي گويد ماژول ping را اجرا كنيد. همچنين داراي پرچم -i است كه به Ansible ميگويد ميزبان هاي موجود در فايل inventory مشخص شده را ping كند.
$ ansible all -i inventory -m ping

اگر اولين بار است كه از طريق SSH به اين سرور محازي ها وصل مي شويد ، از شما خواسته مي شود كه صحت ميزبان هايي را كه از طريق Ansible به آنها وصل مي شويد ، تأييد كنيد. وقتي از شما خواسته شد ، yes را تايپ كنيد و سپس براي تأييد ENTER را بزنيد.
بايد خروجي مشابه اين دريافت كنيد:
Output
server1 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
server2 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}

هنگامي كه يك پاسخ “pong” را از هاست دريافت كرديد ، بدان معني است كه ارتباط زنده است و شما آماده اجراي دستورات Ansible در آن سرور محازي هستيد.

تنظيم گزينه هاي اتصال
به طور پيش فرض ، Ansible سعي دارد با استفاده از صفحه كليد SSH مربوطه ، به عنوان كاربر از راه دور با همان نام كاربري سيستم فعلي شما ، به گره ها متصل شود.
براي اتصال به عنوان يك كاربر از راه دور متفاوت ، فرمان را با پرچم -u و نام كاربر در نظر گرفته شده اضافه كنيد:
$ ansible all -i inventory -m ping -u sammy

اگر از يك كليد SSH سفارشي براي اتصال به سرور محازي هاي از راه دور استفاده مي كنيد ، مي توانيد آن را در زمان اجرا با گزينه –private-key ارائه دهيد:
$ ansible all -i inventory -m ping –private-key=~/.ssh/custom_id

توجه: براي كسب اطلاعات بيشتر در مورد نحوه اتصال به گره ها ، لطفاً به راهنماي نحوه استفاده از Ansible ما مراجعه كنيد ، كه گزينه هاي اتصال بيشتري را نشان مي دهد.

هنگامي كه مي توانيد با استفاده از گزينه هاي مناسب اتصال برقرار كنيد ، مي توانيد فايل inventory خود را تنظيم كنيد تا به صورت خودكار كاربر از راه دور و كليد خصوصي خود را تنظيم كنيد ، تا تفاوتي با مقادير پيش فرض تعيين شده توسط Ansible نباشد. سپس ، لازم نيست آن پارامترها را در خط فرمان ارائه دهيد.
مثال فايل inventory زير متغير ansible_user را فقط براي سرور محازي server1 تنظيم مي كند:
~/ansible/inventory
server1 ansible_host=203.0.113.111 ansible_user=sammy
server2 ansible_host=203.0.113.112

Ansible اكنون هنگام اتصال به سرور محازي server1 از summy به عنوان كاربر پيش فرض از راه دور استفاده مي كند.
براي تنظيم كليد SSH سفارشي ، متغير ansible_ssh_private_key_file را به شرح زير وارد كنيد:
~/ansible/inventory
server1 ansible_host=203.0.113.111 ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id
server2 ansible_host=203.0.113.112

در هر دو مورد ، ما مقادير سفارشي را فقط براي server1 تنظيم كرده ايم. اگر مي خواهيد از همان تنظيمات براي چندين سرور محازي استفاده كنيد ، مي توانيد براي آن گروه child استفاده كنيد:
~/ansible/inventory
[group_a]
203.0.113.111
203.0.113.112

[group_b]
203.0.113.113

[group_a:vars]
ansible_user=sammy
ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id

اين پيكربندي مثال فقط يك كاربر سفارشي و كليد SSH را براي اتصال به سرور محازي هاي ذكر شده در group_a اختصاص مي دهد.

تعيين اهدافي براي اجراي فرمان
هنگام اجراي دستورات ad hoc با Ansible ، مي توانيد ميزبان هاي فردي و همچنين هر تركيبي از گروه ها ، هاست ها و زير گروه ها را هدف قرار دهيد. به عنوان مثال ، به ترتيب زير مي توانيد اتصال را براي هر ميزبان در يك گروه به نام سرور محازي ها بررسي كنيد:
$ ansible servers -i inventory -m ping

همچنين مي توانيد ميزبان ها و گروه هاي مختلفي را با جدا كردن آنها با ستون هايي مشخص كنيد:
$ ansible server1:server2:dbservers -i inventory -m ping

براي درج يك استثناء در يك الگو ، از علامت تعجب ، پيشوند با كاراكتر ، به شرح زير استفاده كنيد. اين دستور بر روي همه سرور محازي هاي گروه 1 اجرا مي شود ، به جز server2:
$ ansible group1:!server2 -i inventory -m ping

در صورت تمايل به اجراي يك دستور فقط بر روي سرور محازي هايي كه جزئي از گروه 1 و گروه 2 هستند ،
به عنوان مثال ، بايد از & استفاده كنيد. فراموش نكنيد كه پيشوند آن را يك كاراكتر قرار دهيد:
$ ansible group1:&group2 -i inventory -m ping

براي كسب اطلاعات بيشتر در مورد چگونگي استفاده از الگوها هنگام تعيين اهداف براي اجراي فرمان ، لطفاً به مرحله 5 راهنماي ما در مورد نحوه تنظيم موجودي هاي Ansible مراجعه كنيد.

اجراي ماژول هاي Ansible
ماژول هاي Ansible قطعاتي از كد هستند كه مي توانند از playbooks و همچنين از خط فرمان دريافت شوند تا مراحل اجرا روي گره هاي از راه دور را تسهيل كنند. مثالها شامل ماژول apt  ، براي مديريت بسته هاي سيستم در اوبونتو و ماژول user  است كه براي مديريت كاربران سيستم استفاده مي شود. دستور ping  مورد استفاده در سراسر اين راهنما نيز يك ماژول است كه به طور معمول براي تست اتصال از گره كنترل به هاست استفاده مي شود.
Ansible با مجموعه گسترده اي از ماژول هاي داخلي همراه است كه برخي از آنها به منظور فراهم آوردن قابليت هاي كامل ، نياز به نصب نرم افزار اضافي دارند. همچنين مي توانيد ماژول هاي دلخواه خود را با استفاده از زبان مورد نظر خود ايجاد كنيد.
براي اجراي يك ماژول با آرگومان ها ، پرچم -a را به همراه گزينه هاي مناسب در نقل قول اضافه كنيد ، مانند اين:
$ ansible target -i inventory -m module -a “module options”

به عنوان نمونه ، از ماژول apt براي نصب بسته tree  روي server1 استفاده مي كند:
$ ansible server1 -i inventory -m apt -a “name=tree”

اجراي دستورات Bash

هنگامي كه يك ماژول از طريق گزينه -m ارائه نمي شود ، از ماژول فرمان به طور پيش فرض براي اجراي دستور مشخص شده روي سرور محازي (هاي) راه دور استفاده مي شود.
اين امر به شما امكان مي دهد تا بتوانيد تقريبا هر فرماني را اجرا كنيد كه بطور معمول از طريق يك ترمينال SSH اجرا ميشود، مادامي كه كاربر در حال اتصال مجوزهاي كافي داشته باشد و هيچ گونه اعلان تعاملي وجود نداشته باشد.
اين مثال فرمان uptime را در كليه سرور محازي ها از موجودي مشخص شده اجرا مي كند:
$ ansible all -i inventory -a “uptime”

Output
server1 | CHANGED | rc=0 >>
14:12:18 up 55 days, 2:15, 1 user, load average: 0.03, 0.01, 0.00
server2 | CHANGED | rc=0 >>
14:12:19 up 10 days, 6:38, 1 user, load average: 0.01, 0.02, 0.00

استفاده از افزايش امتيازات براي اجراي دستورات با sudo
اگر دستور يا ماژول مورد نظر براي اجرا روي هاستهاي از راه دور نياز به امتيازات گسترده سيستم يا كاربر سيستم ديگري دارد ، لازم است كه از ماژول افزايش امتياز Ansible استفاده كنيد ، كه ماژولي انتزاعي براي sudo و همچنين ساير نرم افزارهاي افزايش امتياز است كه توسط Ansible در سيستم عامل هاي مختلف پشتيباني مي شود.
به عنوان مثال ، اگر مي خواهيد يك فرمان tail  را براي خروجي آخرين پيام هاي ورود به سيستم از خطاي Nginx روي سرور محازي به نام server1 از inventory ، اجرا كنيد ، بايد گزينه –become را به شرح زير وارد كنيد:
ansible server1 -i inventory -a “tail /var/log/nginx/error.log” –become

اين مي تواند معادل اجراي فرمان sudo tail /var/log/nginx/error.log بر روي ميزبان از راه دور ، با استفاده از كاربر سيستم فعلي محلي يا كاربر از راه دور تنظيم شده در فايل inventory شما باشد.
سيستم هاي افزايش امتياز مانند sudo اغلب با درخواست رمز ورود كاربر، از شما ميخواهند كه تأييد اعتبار كنيد. اين باعث مي شود كه Ansible در اجراي يك دستور يا اجراي playbook شكست بخورد. سپس مي توانيد از گزينه –ask-become-pass يا -K استفاده كنيد تا Ansible اعلان رمز عبور sudo را درخواست كند:

$ ansible server1 -i inventory -a “tail /var/log/nginx/error.log” –become -K

نصب و حذف بسته ها
مثال زير از ماژول apt براي نصب بسته nginx در تمام گره ها از فايل inventory استفاده مي كند:
$ ansible all -i inventory -m apt -a “name=nginx” –become -K

براي حذف بسته ، آرگومان state را درج كنيد و آن را روي absent تنظيم كنيد:.
$ ansible all -i inventory -m apt -a “name=nginx state=absent” –become -K

 

كپي كردن فايل ها
با ماژول file ، مي توانيد فايلها را بين گره كنترل و گره هاي مديريت شده ، از هر جهت كپي كنيد. دستور زير يك فايل متني محلي را براي همه ميزبانهاي از راه دور در فايل inventory مشخص شده كپي مي كند:
$ ansible all -i inventory -m copy -a “src=./file.txt dest=~/myfile.txt”

براي كپي كردن فايل از سرور محازي از راه دور در گره كنترل خود ، گزينه Remote_src را نيز اضافه كنيد:
$ ansible all -i inventory -m copy -a “src=~/myfile.txt remote_src=yes dest=./file.txt”

تغيير مجوزهاي فايل
براي تغيير مجوزها در فايل ها و دايركتوري ها روي گره هاي از راه دور خود ، مي توانيد از ماژول file استفاده كنيد.
دستور زير مجوزها را روي فايلي به نام file.txt كه در / var / www در ميزبان از راه دور قرار دارد تنظيم مي كند. اين قسمت كادر اجرايي فايل را روي 600 تنظيم مي كند ، كه مجوزهاي خواندن و نوشتن را فقط براي مالك فعلي فايل فعال مي كند. علاوه بر اين ، مالكيت آن فايل را براي كاربر و گروهي به نام sammy تعيين مي كند:
$ ansible all -i inventory -m file -a “dest=/var/www/file.txt mode=600 owner=sammy group=sammy” –become -K

از آنجا كه اين فايل در يك ديركتوري قرار دارد كه معمولاً متعلق به root است ، براي تغيير ويژگي هاي آن ممكن است به مجوزهاي sudo نياز داشته باشيم. به همين دليل گزينه هاي –become و -K را شامل مي شود. اينها براي اجراي دستور داراي امتيازات گسترده از سيستم تشديد امتياز Ansible استفاده مي كنند ، و اين امر باعث مي شود كه رمز عبور sudo را براي كاربر از راه دور تهيه كنيد.

ريستارت سرويس ها
شما مي توانيد از ماژول service براي مديريت سرويس هاي در حال اجرا روي گره هاي از راه دور كه توسط Ansible استفاده مي شود ، استفاده كنيد. اين امر به امتيازات گسترده سيستم نياز دارد ، بنابراين اطمينان حاصل كنيد كه كاربر از راه دور شما داراي مجوزهاي sudo است و شما از گزينه –become براي استفاده از سيستم افزايش امتياز Ansible استفاده مي كنيد. استفاده از -K باعث مي شود كه رمز عبور sudo را براي كاربر متصل كننده فراهم كنيد.
براي ريستارت سرويس nginx در تمام ميزبانهاي گروهي به نام webservers ، دستور زير را اجرا كنيد:
$ ansible webservers -i inventory -m service -a “name=nginx state=restarted” –become -K

ريستارت سرور محازي ها
اگرچه Ansible يك ماژول اختصاصي براي راه اندازي مجدد سرور محازي ها ندارد ، مي توانيد يك دستور bash صادر كنيد كه فرمان /sbin/reboot را روي ميزبان از راه دور فراخواني مي كند.
راه اندازي مجدد سرور محازي به امتيازات گسترده سيستم نياز دارد ، بنابراين اطمينان حاصل كنيد كه كاربر از راه دور شما داراي مجوزهاي sudo است و شما از گزينه –become براي استفاده از سيستم افزايش امتياز Ansible استفاده مي كنيد. استفاده از -K باعث مي شود رمز عبور sudo را براي كاربر متصل كننده فراهم كنيد.
هشدار: دستور زير سرور محازي (هاي) هدف Ansible را ريستارت مي كند. اين امر ممكن است باعث ايجاد اختلال موقتي در هر برنامه اي كه به آن سرور محازي ها متكي است، گردد.

براي ريستارت همه سرور محازي ها در يك گروه webservers  دستور زير را اجرا كنيد :
$ ansible webservers -i inventory -a “/sbin/reboot” –become -K

جمع آوري اطلاعات در مورد گره هاي از راه دور
ماژول setup  اطلاعات دقيق در مورد سيستمهاي از راه دور مديريت شده توسط Ansible ، كه به system facts نيز شناخته ميشود را نشان مي دهد.
براي به دست آوردن system facts براي server1 ، دستور زير را اجرا كنيد:
$ ansible server1 -i inventory -m setup

اين دستور مقدار زيادي از داده هاي JSON را چاپ مي كند كه حاوي جزئياتي درباره محيط سرور محازي از راه دور است. براي اينكه فقط مرتبط ترين اطلاعات چاپ شود، عبارت “gather_subset=min” را به شرح زير وارد كنيد:
$ ansible server1 -i inventory -m setup -a “gather_subset=min”

براي چاپ فقط موارد خاص JSON ، مي توانيد از آرگومان filter استفاده كنيد. كه يك الگوي wildcard را ميپذيرد كه براي مطابقت رشته ها ، مشابه fnmatch ، استفاده ميشود. به عنوان مثال ، براي به دست آوردن اطلاعات در مورد هر دو رابط شبكه ipv4 و ipv6 ، مي توانيد از * ipv * به عنوان فيلتر استفاده كنيد:
ansible server1 -i inventory -m setup -a “filter=*ipv*”

Output
server1 | SUCCESS => {
“ansible_facts”: {
“ansible_all_ipv4_addresses”: [
“203.0.113.111”,
“10.0.0.1”
],
“ansible_all_ipv6_addresses”: [
“fe80::a4f5:16ff:fe75:e758”
],
“ansible_default_ipv4”: {
“address”: “203.0.113.111”,
“alias”: “eth0”,
“broadcast”: “203.0.113.111”,
“gateway”: “203.0.113.1”,
“interface”: “eth0”,
“macaddress”: “a6:f5:16:75:e7:58”,
“mtu”: 1500,
“netmask”: “255.255.240.0”,
“network”: “203.0.113.0”,
“type”: “ether”
},
“ansible_default_ipv6”: {}
},
“changed”: false
}

اگر مي خواهيد ميزان استفاده از ديسك را بررسي كنيد ، مي توانيد يك دستور Bash را با استفاده از ابزار df اجرا كنيد ، به شرح زير:
$ ansible all -i inventory -a “df -h”

Output

server1 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 798M 624K 798M 1% /run
/dev/vda1 155G 2.3G 153G 2% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda15 105M 3.6M 101M 4% /boot/efi
tmpfs 798M 0 798M 0% /run/user/0

server2 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 395M 608K 394M 1% /run
/dev/vda1 78G 2.2G 76G 3% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda15 105M 3.6M 101M 4% /boot/efi
tmpfs 395M 0 395M 0% /run/user/0

نتيجه
در اين راهنما ، ما نحوه استفاده از دستورات adible ad hoc را براي مديريت سرور محازي هاي از راه دور ، از جمله نحوه اجراي كارهاي متداول شامل ريستارت يك سرويس يا كپي كردن يك فايل از گره كنترل به سرور محازي هاي از راه دور كه توسط آن قابل كنترل است ، نشان داديم. همچنين نحوه جمع آوري اطلاعات از گره هاي از راه دور با استفاده از پارامترهاي محدود كننده و فيلتر را مشاهده كرديم.
به عنوان يك منبع اضافي ، مي توانيد مستندات رسمي Ansible را در مورد دستورات ad hoc بررسي كنيد.

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

استفاده از سرور از راه دور Docker

ساخت تصاوير و باينري هاي داراي CPU فشرده ، فرايندي بسيار كند و زمان بري است كه مي تواند در بعضي مواقع لپ تاپ شما را به بخاري تبديل كند. وارد كردن تصاوير Docker با اتصال آهسته ، مدت زمان زيادي طول مي كشد. خوشبختانه ، رفع اين مشكلات آسان است. Docker به شما امكان مي دهد تمام كارها را به يك سرور مجازي از راه دور بسپاريد تا دستگاه محلي شما مجبور به انجام آن كار سخت نباشد.
اين ويژگي در Docker 18.09 معرفي شده است. اين نسخه پشتيباني اتصال به يك ميزبان Docker از راه دور از طريق SSH را به همراه دارد. به تنظيمات بسيار كمي در كلاينت احتياج دارد و فقط به يك سرور مجازي Docker معمولي و بدون هيچگونه تنظيم خاص در حال اجرا بر روي يك دستگاه از راه دور نياز خواهد داشت. قبل از Docker 18.09 ، بايد از دستگاه Docker براي ايجاد يك سرور مجازي Docker از راه دور استفاده كرده و سپس محيط محلي Docker را پيكربندي كنيد تا از آن استفاده كنيد. اين روش جديد آن پيچيدگي اضافي را از بين مي برد.
در اين آموزش ، شما يك Droplet ايجاد مي كنيد تا ميزبان سرور مجازي Docker از راه دور باشيد و دستور docker را روي دستگاه محلي خود پيكربندي كنيد تا از آن استفاده نماييد.
پيش نيازها
براي دنبال كردن اين آموزش ، به موارد زير نياز داريد:
يك حساب DigitalOcean. اگر قبلاً حساب كاربري نداريد مي توانيد يك حساب كاربري ايجاد كنيد.
Docker كه روي دستگاه محلي يا سرور مجازي توسعه شما نصب شده باشد. اگر با Ubuntu 18.04 كار مي كنيد ، مراحل 1 و 2 نحوه نصب و استفاده از Docker را در اوبونتو 18.04 دنبال كنيد. در غير اين صورت ، براي كسب اطلاعات در مورد نصب در سيستم عامل هاي ديگر ، مطالب رسمي را دنبال كنيد. حتماً كاربر غير ريشه خود را به گروه docker اضافه كنيد ، همانطور كه در مرحله 2 از آموزش مربوطه توضيح داده شده است.
مرحله 1 – ايجاد هاست Docker
براي شروع كار ، Droplet را با مقدار مناسب قدرت پردازش راه اندازي كنيد. برنامه هاي بهينه سازي CPU براي اين منظور ايده آل هستند ، اما برنامه هاي استاندارد ديگر نيز به خوبي كار مي كنند. اگر برنامه هايي با منابع فشرده را كامپايل مي كنيد ، برنامه هاي بهينه سازي CPU هسته هاي CPU اختصاصي را ارائه مي دهند كه امكان ساخت سريع تر را فراهم مي كنند. در غير اين صورت ، برنامه هاي استاندارد نسبت CPU به RAM متعادل تري را ارائه مي دهند.
Docker One-click image از همه تنظيمات مربوطه براي ما مراقبت مي كند. اين لينك را دنبال كنيد تا يك دراپلت بهينه سازي شده با CPU 16 GB / 8vCPU با Docker از كنترل پنل ايجاد كنيد.
از طرف ديگر ، مي توانيد براي ايجاد Droplet از خط فرمان محلي خود ، از doctl استفاده كنيد. براي نصب آن ، دستورالعمل موجود در فايل README doctl را در GitHub دنبال كنيد.
دستور زير يك دراپلت جديد بهينه شده با CPU 16GB/8vCPU در ناحيه FRA1 را بر اساس تصوير تك كليك Docker ايجاد مي كند:
$ doctl compute droplet create docker-host

$ –image docker-18-04

$ –region fra1

$ –size c-8

$ –wait

$ –ssh-keys $(doctl compute ssh-key list –format ID –no-header | sed ‘s/$/,/’ | tr -d ‘n’ | sed ‘s/,$//’)

دستور doctl از مقدار ssh-keys استفاده مي كند تا مشخص كند كدام كليد SSH را بايد براي Droplet جديد خود اعمال كند. براي بازيابي كليدهاي SSH مرتبط با حساب DigitalOcean از يك زيرپوسته استفاده مي كنيم تا doctl compute ssh-key-list را فراخواني كنيم و سپس نتايج را با استفاده از دستور sed و tr تجزيه و تحليل مي كنيم تا داده ها را در قالب صحيح قالب بندي كنيم. اين دستور شامل كليه كليدهاي SSH حساب شما مي باشد ، اما مي توانيد دستور فرعي هايلايت شده را با اثرانگشت هر كليد موجود در حساب خود جايگزين كنيد.
پس از ايجاد دراپلت ، آدرس IP آن را در بين ساير جزئيات مشاهده خواهيد كرد:
Output
ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags Features Volumes
148681562 docker-host your_server_ip 16384 8 100 fra1 Ubuntu Docker 5:18.09.6~3 on 18.04 active

مي توانيد اطلاعات بيشتري در مورد استفاده از دستور doctl در آموزش نحوه استفاده از doctl ، كلاينت خط فرمان رسمي DigitalOcean دريافت كنيد.
وقتي دراپلت ايجاد شد ، آماده استفاده از سرور مجازي Docker خواهيد بود. براي اهداف امنيتي ، يك كاربر لينوكس ايجاد كنيد تا به جاي root استفاده شود.
ابتدا با SSH به عنوان كاربر اصلي به دراپلت وصل شويد:
$ ssh root@your_server_ip
پس از اتصال ، يك كاربر جديد اضافه كنيد. اين دستور شخصي را به نام SAMMY اضافه مي كند:
# adduser sammy

سپس كاربر را به گروه docker اضافه كنيد تا به وي اجازه اجراي دستورات روي هاست Docker را بدهد.
# sudo usermod -aG docker sammy

در آخر با تايپ كردن exit از سرور مجازي راه دور خارج شويد.
اكنون كه سرور مجازي آماده است ، اجازه دهيد دستور docker محلي را براي استفاده از آن پيكربندي كنيم.
مرحله 2 – پيكربندي Docker براي استفاده از ميزبان از راه دور
براي استفاده از ميزبان از راه دور به عنوان ميزبان Docker خود به جاي دستگاه محلي ، متغير محيط DOCKER_HOST را تنظيم كنيد تا به ميزبان از راه دور اشاره كند. اين متغير به كلاينت Docker CLI دستور مي دهد تا به سرور مجازي از راه دور متصل شود.
$ export DOCKER_HOST=ssh://sammy@your_server_ip

اكنون هر دستور Docker كه اجرا مي كنيد ، روي Droplet اجرا مي شود. به عنوان مثال ، اگر يك كانتينر وب سرور مجازي راه اندازي كنيد و يك پورت را در معرض ديد قرار دهيد ، روي Droplet اجرا خواهد شد و از طريق درگاهي كه در آدرس IP Droplet به نمايش گذاشته ايد ، قابل دسترسي خواهد بود.
براي تأييد اينكه به Droplet به عنوان ميزبان Docker دسترسي داريد ، docker info را اجرا كنيد.
$ docker info

نام ميزبان Droplet خود را كه در قسمت Name ذكر شده است ، مشاهده خواهيد كرد:
Output

Name: docker-host

نكته اي كه بايد در نظر داشته باشيد اينست كه وقتي دستور docker build را اجرا مي كنيد ، محتواي ساخت (كليه فايل ها و پوشه هاي قابل دسترسي از Dockerfile) به هاست ارسال مي شود و سپس مراحل ساخت اجرا مي شود. بسته به اندازه محتواي ساخت و ميزان فايل ها ، ممكن است در مقايسه با ساخت تصوير روي يك دستگاه محلي زمان بيشتري طول بكشد. يكي از راه حل ها اين است كه يك دايركتوري جديد اختصاص داده شده به تصوير Docker ايجاد كنيد و فقط فايل هايي را كه در تصوير استفاده خواهد شد كپي كنيد يا پيوند دهيد تا هيچ فايلغير ضروري به صورت سهوي آپلود نشود.
هنگامي كه متغير DOCKER_HOST را با استفاده از export تنظيم كرديد ، مقدار آن براي مدت زمان بخش پوسته دوام خواهد داشت. در صورت نياز به استفاده مجدد از سرور مجازي محلي Docker ، مي توانيد متغير را با دستور زير پاك كنيد:
unset DOCKER_HOST
نتيجه
شما يك ميزبان Docker از راه دور ايجاد كرده ايد و به صورت محلي به آن متصل هستيد. دفعه بعد كه باتري لپ تاپ شما رو به كاهش بود يا مجبور بوديد يك تصوير سنگين Docker بسازيد ، به جاي دستگاه محلي خود از سرور مجازي از راه دور Docker خود استفاده كنيد.
همچنين ممكن است علاقه مند به يادگيري در مورد چگونگي بهينه سازي تصاوير Docker براي توليد يا چگونگي بهينه سازي آنها به طور خاص براي Kubernetesباشيد.

 

برچسب‌ها:CPUDockerDocker CLIDroplet

بازنويسي URL را با mod_rewrite براي Apache در Debian 10

ماژول mod_rewrite در Apache به شما امكان مي دهد URL ها را با روشي تميزتر بازنويسي كنيد ، مسيرهاي قابل خواندن توسط انسان را به رشته هاي جستار سازگار با كد تبديل كنيد. همچنين به شما امكان مي دهد URL ها را بر اساس شرايط بازنويسي كنيد.
فايل .htaccess به شما امكان مي دهد بدون دسترسي به فايلهاي پيكربندي سرور مجازي ، قوانين بازنويسي را ايجاد و اعمال كنيد. با قرار دادن فايل .htaccess در ريشه وب سايت خود ، مي توانيد بازنويسي ها را بر اساس هر سايت يا هر دايركتوري مديريت كنيد.
در اين آموزش ، شما مي توانيد mod_rewrite را فعال كرده و از فايلهاي .htaccess براي ايجاد يك تغيير مسير URL اصلي استفاده كنيد و سپس چند مورد استفاده پيشرفته را جستجو كنيد.
پيش نيازها
براي دنبال كردن اين آموزش ، به موارد زير نياز داريد:
يك سرور مجازي Debian 10 با دنبال كردن راهنماي ستاپ اوليه سرور مجازي Debian 10 تنظيم شده باشد، و شامل كاربر sudo غير ريشه و يك فايروال باشد.
Apache كه طبق مراحل 1 و 2 نحوه نصب وب سرور مجازي Apache در Debian 10 نصب شده باشد.

مرحله 1 – فعال كردن mod_rewrite
براي اينكه Apache بتواند قوانين بازنويسي را درك كند ، ابتدا بايد mod_rewrite را فعال كنيم. قبلاً نصب شده است ، اما در نصب پيش فرض Apache غيرفعال است. براي فعال كردن ماژول از دستور a2enmod استفاده كنيد:
$ sudo a2enmod rewrite

با اين كار ماژول فعال مي شود يا به شما هشدار مي دهد كه ماژول از قبل فعال شده است. براي اجراي اين تغييرات ، Apache را مجدداً راه اندازي كنيد:
$ sudo systemctl restart apache2

اكنون mod_rewrite كاملاً فعال است. در مرحله بعدي يك فايل .htaccess را براي تعريف قوانين بازنويسي براي تغيير مسيرها تنظيم خواهيم كرد.
مرحله 2 – تنظيم .htaccess
فايل .htaccess به ما امكان مي دهد قوانين بازنويسي خود را بدون دسترسي به فايل هاي پيكربندي سرور مجازي اصلاح كنيم. به همين دليل ، .htaccess براي امنيت برنامه وب شما بسيار مهم است. زماني كه پيش از نام فايل وجود دارد، اطمينان مي دهد كه فايل پنهان شده است.

توجه: هر قانوني كه بتوانيد در يك فايل .htaccess قرار دهيد ، مي تواند مستقيماً در فايل هاي پيكربندي سرور مجازي قرار گيرد. در حقيقت ، مطالب رسمي Apache توصيه مي كند از فايل هاي پيكربندي سرور مجازي به جاي .htaccess به دليل زمان پردازش سريعتر استفاده كنيد.
با اين حال ، در اين مثال ساده ، افزايش عملكرد ناچيز خواهد بود. علاوه بر اين ، تنظيم قوانين در .htaccess راحت است ، به خصوص با چندين وب سايت در همان سرور مجازي. نيازي به راه اندازي مجدد سرور مجازي براي ايجاد تغييرات يا اعمال امتيازات اصلي براي ويرايش قوانين ، ساده سازي نگهداري و روند ايجاد تغييرات با يك حساب بدون امتياز نيست. نرم افزارهاي منبع باز محبوب مانند WordPress و Joomla براي ايجاد تغييرات و قوانين اضافي در صورت تقاضا به فايلهاي .htaccess متكي هستند.
قبل از شروع استفاده از فايل هاي .htaccess ، بايد تنظيمات ديگري را تنظيم و ايمن كنيد.
به طور پيش فرض ، Apache با استفاده از فايل .htaccess اعمال قوانين بازنويسي را ممنوع مي كند ، بنابراين ابتدا بايد تغييراتي در فايل اعمال كنيد. فايل پيش فرض پيكربندي Apache را با استفاده از nano يا ويرايشگر متن مورد علاقه خود باز كنيد:
$ sudo nano /etc/apache2/sites-available/000-default.conf

در داخل آن فايل ، بلوك را كه از خط اول شروع مي شود ، پيدا خواهيد كرد. در داخل آن بلوك ، بلوك جديد زير را اضافه كنيد تا فايل پيكربندي شما مانند زير شود. مطمئن شويد كه همه بلوك ها به درستي قرار گرفته اند:
/etc/apache2/sites-available/000-default.conf


Options Indexes FollowSymLinks
AllowOverride All
Require all granted

. . .

فايل را ذخيره كنيد و ببنديد. اگر از nano استفاده كرده ايد ، اين كار را با فشار دادن CTRL + X ، Y ، سپس enter انجام دهيد.
سپس ، پيكربندي خود را بررسي كنيد:
$ sudo apache2ctl configtest

اگر خطايي وجود ندارد ، Apache را مجدداً راه اندازي كنيد تا تغييرات خود را به مرحله اجرا برسانيد:
$ sudo systemctl restart apache2

اكنون ، يك فايل .htaccess را در ريشه وب ايجاد كنيد:
$ sudo nano /var/www/html/.htaccess

اين خط را در بالاي فايل جديد اضافه كنيد تا موتور بازنويسي فعال شود.
var/www/html/.htaccess
RewriteEngine on

فايل را ذخيره كرده و خارج شويد.
اكنون يك فايل .htaccess عملياتي داريد كه مي توانيد از آن استفاده كنيد تا قوانين مسيريابي برنامه وب خود را كنترل كنيد. در مرحله بعد ، يك فايل وب سايت نمونه را ايجاد خواهيم كرد كه براي نشان دادن قوانين بازنويسي استفاده خواهيم كرد.
مرحله 3 – پيكربندي بازنويسي URL
در اينجا ، يك بازنويسي URL پايه را تنظيم مي كنيم كه URL هاي زيبا را به مسيرهاي واقعي به صفحات تبديل مي كند. به طور خاص ، ما به كاربران اين امكان را مي دهيم كه به http: // your_server_ip / about دسترسي پيدا كنند و صفحه اي به نام about.html را به نمايش بگذارند.
با ايجاد فايلي با نام about.html در ريشه وب شروع كنيد:
$ sudo nano /var/www/html/about.html

كد HTML زير را در فايل كپي كنيد ، سپس آن را ذخيره كرده و ببنديد.
/var/www/html/about.html


About Us


About Us



شما مي توانيد به اين صفحه به آدرس http: //your_server_ip/about.html دسترسي پيدا كنيد ، اما توجه داشته باشيد كه اگر سعي كنيد به http: // your_server_ip / About دسترسي پيدا كنيد ، خطاي 404 Not Found  را مشاهده خواهيد كرد. در عوض براي دسترسي به صفحه با استفاده از /about، يك قانون بازنويسي ايجاد خواهيم كرد.
همه RewriteRules از اين قالب پيروي مي كنند:
General RewriteRule structure
RewriteRule pattern substitution [flags]

RewriteRule دستورالعمل را مشخص مي كند
patternيك عبارت معمولي است كه رشته مورد نظر را از URL مطابقت مي دهد ، همان چيزي است كه بيننده در مرورگر تايپ مي كند.
substitution مسير URL واقعي است ، يعني مسير فايلي كه Apache ارائه مي كند.
flags پارامترهاي اختياري هستند كه مي توانند نحوه عملكرد قانون را تغيير دهند.
بياييد قانون بازنويسي URL را ايجاد كنيم. فايل .htaccess را باز كنيد:
$ sudo nano /var/www/html/.htaccess

بعد از اولين خط ، RewriteRule زير را اضافه كنيد و فايل را ذخيره كنيد:
/var/www/html/.htaccess
RewriteEngine on
RewriteRule ^about$ about.html [NC]

در اين حالت ، ^about$ الگو است ، about.html جايگزين است ، و [NC] يك پرچم است. مثال ما از چند كاراكتر با معني خاص استفاده مي كند:
^ شروع URL را نشان مي دهد ، بعد از your_server_ip /.
$ نشانگر پايان URL است.
about با رشته “درباره” منطبق ميشود
About.html فايل واقعي است كه كاربر به آن دسترسي پيدا مي كند.
[NC] يك پرچم است كه قانون را نسبت به نمونه غير حساس مي كند.
اكنون مي توانيد به مرورگر خود به http: // your_server_ip / about دسترسي پيدا كنيد. در حقيقت ، با اين قانون كه در بالا نشان داده شده است ، آدرس هاي اينترنتي زير به about.html نيز اشاره مي كنند:
http: // your_server_ip / about ، به دليل تعريف قانون.
http: // your_server_ip / About ، چون اين قانون حساسيتي ندارد.
http: //your_server_ip/about.html ، زيرا نام اصلي فايل هميشه كار خواهد كرد.
با اين حال ، موارد زير كار نخواهد كرد:
http: // your_server_ip / about / ، زيرا اين قانون به صراحت بيان مي كند كه ممكن است هيچ چيز ديگري بعد از about وجود نداشته باشد ، زيرا كاراكتر $ بعد از آن ظاهر مي شود.
http: // your_server_ip / contact ، زيرا با رشته about در قانون مطابقت ندارد.
اكنون يك فايل .htaccess عملياتي با يك قانون پايه داريد كه مي توانيد نيازهاي خود را تغيير داده و گسترش دهيد. در بخش هاي بعدي ، دو نمونه ديگر از دستورالعمل هاي متداول را نشان خواهيم داد.
مثال 1 – ساده سازي رشته هاي پرس و جو با RewriteRule
برنامه هاي وب اغلب از رشته هاي پرس و جو استفاده مي كنند ، كه با استفاده از علامت سؤال (؟) بعد از آدرس به URL اضافه مي شوند. پارامترهاي جداگانه با استفاده از ampersand (&) محدود مي شوند. رشته هاي پرس و جو ممكن است براي انتقال داده هاي اضافي بين صفحات برنامه فردي استفاده شود.
به عنوان مثال ، يك صفحه نتيجه جستجو كه به زبان PHP نوشته شده است ، مي تواند از URL مانند http://example.com/results.php?item=shirt&season=summer استفاده كند. در اين مثال ، دو پارامتر اضافي به اسكريپت نرم افزار result.php موهومي منتقل مي شود: item ، با مقدار shirt ، و season با مقدار summer. برنامه ممكن است از اطلاعات رشته پرس و جو براي ايجاد صفحه مناسب براي بازديد كننده استفاده كند.
قوانين بازنويسي Apache اغلب براي ساده كردن پيوندهاي طولاني و ناخوشايند به عنوان مثال URL فوق به URLهاي مناسب تر كه تايپ و تفسير بصري آسان تري دارند ، به كار مي روند. در اين مثال ، ما مي خواهيم لينك بالا را ساده كنيم تا به http://example.com/shirt/summer تبديل شود. مقادير پارامتر shirt و summer هنوز در آدرس هستند ، اما بدون نام رشته و نام اسكريپت.
در اينجا يك قانون براي انجام اين كار وجود دارد:
Simple substition
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]

summer / shirt به طور واضح در آدرس درخواستي مطابقت دارد و به Apache گفته مي شود كه به جاي results.php?item=shirt&season=summer را ارائه دهد.
پرچم هاي [QSA] معمولاً در قوانين بازنويسي استفاده مي شوند. آنها به Apache مي گويند هر رشته درخواست اضافي را در URL ارائه شده اضافه كند ، بنابراين اگر بازديد كننده http://example.com/shirt/summer?page=2 را تايپ كند، سرور مجازي با results.php?item=shirt&season=summer&page=2 پاسخ مي دهد. بدون آن ، رشته پرس و جو اضافي دور ريخته مي شود.
در حالي كه اين روش به جلوه مطلوب دست مي يابد ، هم نام آيتم و هم فصل به طور خاص كدگذاري مي شوند. اين بدان معني است كه اين قانون براي ساير موارد ، مانند pants ، يا فصول ديگر مانند winter كار نخواهد كرد.
براي عمومي تر كردن اين قاعده ، مي توانيم از عبارات منظم براي مطابقت با قسمت هاي آدرس اصلي استفاده كنيم و از آن قسمت ها در الگوي جايگزين استفاده كنيم. قانون اصلاح شده به اين شكل در خواهد آمد:
Simple substition
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

اولين گروه عبارت معمول در پرانتز با رشته اي حاوي حروف الفبا و اعدادي مانند shirt يا pants مطابقت دارد و بخش منطبق را به عنوان متغير $1 ذخيره مي كند. دومين گروه عبارت معمول در پرانتز دقيقاً summer ، winter ، fall يا spring را مطابقت ميدهد و به همين ترتيب بخش سازگار را به عنوان $2 ذخيره مي كند.
بخش هاي منطبق پس از آن در URL نتيجه به صورت متغيرهاي item و season به جاي مقادير shirt و summer استفاده مي شوند.
موارد فوق مثلاً http://example.com/pants/summer را به http://example.com/results.php?item=pants&season=summer تبديل مي كند. اين مثال همچنين مناسب آينده است ، به شما امكان مي دهد چندين مورد و فصل را به طور صحيح با استفاده از يك قانون واحد بازنويسي كنيد.
مثال 2 – اضافه كردن شرايط با منطق با استفاده از RewriteConds
قوانين بازنويسي الزاماً هميشه يك به يك و بدون محدوديت ارزيابي نمي شوند. دستورالعمل RewriteCond به ما امكان مي دهد شرايطي را براي قوانين بازنويسي خود اضافه كنيم تا كنترل كنيم چه زماني اين قوانين پردازش مي شوند. كليه RewriteConds با فرمت زير عمل مي كنند:
General RewriteCond structure
RewriteCond TestString Condition [Flags]

RewriteCond دستورالعمل RewriteCond را مشخص مي كند.
TestString رشته اي است كه بايد در برابر آن آزمايش كنيد.
Condition الگو يا شرط مطابقت است.
Flags پارامترهاي اختياري هستند كه ممكن است شرايط و قوانين ارزيابي را تغيير دهند.
اگر نتيجه ارزيابي RewriteCond درست باشد ، RewriteRule بعدي در نظر گرفته مي شود. اگر درست نباشد ، اين قانون كنار گذاشته مي شود. چندين RewriteConds ممكن است يكي پس از ديگري مورد استفاده قرار گيرند ، اگرچه همه بايد براي ارزيابي قانون بعدي درست باشند.
به عنوان نمونه ، فرض مي كنيم شما مي خواهيد به جاي نشان دادن صفحه خطاي استاندارد  404 Not Found ، همه درخواست ها را به فايل ها يا ديركتوري هاي غير موجود در سايت خود برگردانيد. اين امر با قوانين زير حاصل ميشود:
Redirect all requests to non-existent files and directories to home page
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

%{REQUEST_FILENAME} رشته اي براي بررسي است. در اين حالت ، نام فايل درخواستي است ، كه متغير سيستمي براي هر درخواست ميباشد.
-f يك شرايط داخلي است كه تأييد مي كند كه آيا نام درخواست شده در ديسك وجود دارد و يك فايل است. ! يك عامل منفي كننده است. تركيب! -f فقط درصورتي كه نام مشخص شده وجود نداشته باشد يا فايل نباشد ، درست ارزيابي مي شود.
• به طور مشابه ،! -d فقط درصورتي كه نام مشخص شده وجود نداشته باشد يا ديركتوري نباشد ، درست ارزيابي مي شود.
RewriteRule در خط نهايي فقط براي درخواست به فايل ها يا دايركتوري هاي غير موجود وارد خواهد شد. خود RewriteRule بسيار ساده است و هر درخواستي را به ريشه / وب سايت هدايت مي كند.
نتيجه
mod_rewrite به شما امكان مي دهد URL هاي قابل خواندن توسط انسان ايجاد كنيد. در اين آموزش ، ياد گرفتيد كه چگونه از دستورالعمل RewriteRule براي هدايت URL ها استفاده كنيد ، از جمله آنهايي كه رشته هاي پرس و جو دارند. همچنين ياد گرفتيد كه چگونه URL ها را با استفاده از دستورالعمل RewriteCond به صورت مشروط هدايت كنيد.
اگر مي خواهيد در مورد mod_rewrite اطلاعات بيشتري كسب كنيد ، به mod_rewrite Introduction و مستندات رسمي Apache براي mod_rewrite نگاهي بيندازيد.

 

برچسب‌ها:htaccessJoomlamod_rewriteURL,

نصب وب سرور Apache در Debian 10

سرور مجازي Apache HTTP پركاربردترين وب سرور مجازي در جهان است. اين سرور مجازي بسياري از ويژگي هاي قدرتمند از جمله ماژول هاي قابل بارگيري پويا ، پشتيباني رسانه اي قوي و ادغام گسترده با ساير نرم افزارهاي محبوب را ارائه مي دهد.
در اين راهنما نحوه نصب يك وب سرور مجازي Apache را در سرور مجازي Debian 10 شما توضيح خواهيم داد.
پيش نيازها
قبل از شروع اين راهنما ، بايد يك كاربر معمولي و غير ريشه با امتيازات sudo در سرور مجازي خود داشته باشيد. علاوه بر اين ، بايد يك فايروال پايه را فعال كنيد تا پورت هاي غير ضروري را مسدود نماييد. با پيروي از راهنماي تنظيم اوليه سرور مجازي براي Debian 10 مي توانيد نحوه پيكربندي يك حساب كاربري معمولي و تنظيم فايروال را براي سرور مجازي خود بياموزيد.
هنگامي كه يك حساب كاربري در اختيار گرفتيد ، به عنوان كاربر غير ريشه خود وارد شويد.
مرحله 1 – نصب Apache
Apache در مخازن پيش فرض نرم افزار Debian موجود است و امكان نصب آن با استفاده از ابزارهاي مديريت بسته معمولي امكان پذير است.
بياييد با به روز كردن فهرست بسته محلي شروع كنيم تا آخرين تغييرات بالادست را منعكس كنيم:
⦁ $ sudo apt update

سپس بسته apache2 را نصب كنيد:
⦁ $ sudo apt install apache2

پس از تأييد نصب ، apt و تمام متعلقات مورد نياز را نصب مي كند.
مرحله 2 – تنظيم فايروال
قبل از آزمايش Apache ، لازم است تنظيمات فايروال را اصلاح كنيد تا دسترسي خارجي به پورت هاي پيش فرض وب را بدهيد. با فرض اينكه دستورالعمل هاي پيش نياز را رعايت كرده باشيد ، بايد فايروال UFW را تنظيم كرده تا دسترسي به سرور مجازي شما محدود شود.
در حين نصب ، Apache خود را با UFW ثبت مي كند تا چند پروفايل برنامه ارائه دهد كه مي تواند براي فعال يا غيرفعال كردن دسترسي به Apache از طريق فايروال استفاده شود.
پروفايل برنامه ufw را با تايپ كردن دستور زير ليست كنيد:
⦁ $ sudo ufw app list

ليستي از پروفايل هاي برنامه را مشاهده خواهيد كرد:
Output
Available applications:
AIM
Bonjour
CIFS
. . .
WWW
WWW Cache
WWW Full
WWW Secure
. . .

پروفايل هاي Apache با WWW آغاز مي شود:
WWW: اين نمايه فقط پورت 80 را باز مي كند (ترافيك وب عادي و بدون رمزگذاري)
WWW Cache: اين نمايه فقط پورت 8080 را باز مي كند (گاهي اوقات براي ذخيره سازي و پروكسي هاي وب استفاده مي شود)
WWW Full: اين نمايه هر دو پورت 80 (ترافيك وب عادي ، بدون رمزگذاري) و پورت 443 (ترافيك رمزگذاري شده TLS / SSL) را باز مي كند
WWW Secure: اين نمايه فقط پورت 443 را باز مي كند (ترافيك رمزگذاري شده TLS / SSL)
توصيه مي شود محدودترين نمايه اي را كه امكان ترافيك پيكربندي شده شما را فراهم مي كند ، فعال كنيد. از آنجا كه ما هنوز در اين راهنما SSL را براي سرور مجازي خود پيكربندي نكرده ايم ، فقط نياز به ترافيك در بندر 80 داريم:
⦁ $ sudo ufw allow ‘WWW’

مي توانيد تغيير را با تايپ دستور زير تأييد كنيد:
⦁ $ sudo ufw status

بايد ترافيك HTTP مجاز در خروجي نمايش داده شده را مشاهده كنيد:
Output
Status: active

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

همانطور كه مشاهده مي كنيد ، نمايه براي دسترسي به سرور مجازي وب فعال شده است.
مرحله 3 – بررسي سرور مجازي وب خود
در پايان مراحل نصب ، Debian 10 ، Apache را شروع مي كند. اكنون وب سرور مجازي بايد راه اندازي و در حال اجرا باشد.
با سيستم init systemed بررسي كنيد تا مطمئن شويد اين سرويس در حال اجراست ، دستور زير را تايپ كنيد:
⦁ $ sudo systemctl status apache2

Output
● apache2.service – The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2019-07-19 15:33:01 UTC; 4min 13s ago
Docs: https://httpd.apache.org/docs/2.4/

. . .

Jul 19 15:33:01 debssh systemd[1]: Starting The Apache HTTP Server…
Jul 19 15:33:01 debssh apachectl[2791]: AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‘ServerName’ directive global
Jul 19 15:33:01 debssh systemd[1]: Started The Apache HTTP Server.

همانطور كه از اين خروجي مي بينيد ، به نظر مي رسد اين سرويس با موفقيت شروع شده است. با اين حال ، بهترين راه براي آزمايش، درخواست يك صفحه از Apache است.
براي تأييد صحت اجراي نرم افزار از طريق آدرس IP خود ، مي توانيد به صفحه فرود پيش فرض Apache دسترسي پيدا كنيد. اگر آدرس IP سرور مجازي خود را نمي دانيد ، مي توانيد آن را به چند راه مختلف از خط فرمان دريافت كنيد.
سعي كنيد اين را در خط فرمان سرور مجازي خود تايپ كنيد:
⦁ $ hostname -I

چند آدرس كه با فاصله از هم جدا شده اند، دريافت مي كنيد. مي توانيد هركدام را در مرورگر وب خود امتحان كنيد تا ببينيد كه آيا كار مي كنند.
راه ديگر استفاده از ابزار curl است كه بايد آدرس IP عمومي خود را همانطور كه از مكان ديگري در اينترنت مشاهده مي شود به شما بدهد.
ابتدا ، curl را با استفاده از aptنصب كنيد:
⦁ $ sudo apt install curl

سپس از curl براي بازيابي icanhazip.com به كمك IPv4 استفاده نماييد.
⦁ $ curl -4 icanhazip.com

هنگامي كه آدرس IP سرور مجازي خود را داريد ، آن را در نوار آدرس مرورگر خود وارد كنيد:

http://your_server_ip

بايد صفحه وب پيش فرض Debian 10 Apache را ببينيد:

اين صفحه نشان مي دهد كه Apache درست كار مي كند. اين برنامه همچنين شامل برخي از اطلاعات اوليه در مورد فايل هاي مهم Apache و مكان هاي فهرست بندي است.
مرحله 4 – مديريت فرايند Apache
اكنون كه سرور مجازي وب خود را فعال و راه اندازي كرده ايد ، اجازه دهيد برخي از دستورات مديريت اصلي را مرور كنيم.
براي متوقف كردن سرور مجازي وب خود ، تايپ كنيد:
⦁ $ sudo systemctl stop apache2

براي شروع سرور مجازي وب وقتي متوقف شده است ، تايپ كنيد:
⦁ $ sudo systemctl start apache2

براي متوقف كردن و شروع مجدد سرويس ، تايپ كنيد:
⦁ $ sudo systemctl restart apache2

اگر به سادگي تغييرات پيكربندي را انجام مي دهيد ، Apache اغلب مي تواند بدون افت اتصالات مجدد لود شود. براي انجام اين كار ، از اين دستور استفاده كنيد:
⦁ $ sudo systemctl reload apache2

به طور پيش فرض ، Apache به گونه اي پيكربندي مي شود كه به طور خودكار با بوت شدن سرور مجازي شروع به كار كند. اگر اين چيزي نيست كه شما مي خواهيد ، با تايپ كردن اين دستور آن را غيرفعال كنيد:
⦁ $ sudo systemctl disable apache2

براي فعال كردن مجدد سرويس در هنگام بوت ، اين دستور را تايپ كنيد:
⦁ $ sudo systemctl enable apache2

با شروع مجدد بوت شدن سرويس دهنده ، اكنون Apache بايد به طور خودكار شروع كند.
مرحله 5 – تنظيم ميزبان هاي مجازي (توصيه مي شود(
هنگام استفاده از وب سرور مجازي Apache ، مي توانيد از هاست هاي مجازي (مشابه بلوك هاي سرور مجازي در Nginx ) براي محصور كردن جزئيات پيكربندي و ميزباني بيش از يك دامنه از يك سرور مجازي واحد استفاده كنيد. در دستورات زير ، your_domain را با نام دامنه خود جايگزين كنيد. براي كسب اطلاعات بيشتر در مورد تنظيم نام دامنه با vpsgol ، به مقدمه ما در vpsgol DNS مراجعه كنيد.
Apache در Debian 10 داراي يك بلوك سرور مجازي است كه به طور پيش فرض فعال شده است تا اسناد را از ديركتوري / var / www / html. ارائه دهد.اگرچه اين براي يك سايت واحد به خوبي كار مي كند ، اما اگر ميزبان چندين سايت باشيد ، مي تواند با مشكل روبه رو شود. به جاي اصلاح / var / www / html ، بياييد يك ساختار دايركتوري در / var / www براي سايت your_domain ايجاد كنيم ، در اين صورت / var / www / html را به عنوان دايركتوري پيش فرض قرار مي دهيم كه در صورتي كه درخواست كلاينت با هيچ سرويسي مطابقت نداشته باشد، ارائه شود.
با استفاده از پرچم -p ، براي ايجاد هر ديركتوري لازم ، ديركتوري را براي your_domain به صورت زير ايجاد كنيد:
sudo mkdir -p /var/www/your_domain
سپس ، مالكيت دايركتوري را با متغير محيطي $ USER اختصاص دهيد:
⦁ $ sudo chown -R $USER:$USER /var/www/your_domain

در صورتي كه مقدار unmask خود را تغيير نداده ايد ، مجوزهاي ريشه وب شما بايد صحيح باشد ، اما مي توانيد با تايپ دستور زير مطمئن شويد:
⦁ $ sudo chmod -R 755 /var/www/your_domain

سپس ، با استفاده از nano يا ويرايشگر مورد علاقه خود ، صفحه index.html نمونه را ايجاد كنيد:
⦁ $ nano /var/www/your_domain/index.html

در داخل ، HTML نمونه زير را اضافه كنيد:
/var/www/your_domain/index.html


Welcome to your_domain!


Success! The your_domain virtual host is working!



پس از اتمام فايل را ذخيره كنيد و ببنديد.
براي اينكه Apache بتواند اين محتوا را ارائه دهد ، بايد يك فايل ميزبان مجازي با بخشنامه هاي صحيح ايجاد كنيد. به جاي تغيير فايل پيكربندي پيش فرض واقع در /etc/apache2/sites-available/000-default.conf ، اجازه دهيد فايل جديدي را در /etc/apache2/sites-available/your_domain.conf ايجاد كنيم:
⦁ $ sudo nano /etc/apache2/sites-available/your_domain.conf

در بلوك پيكربندي زير كه مشابه پيش فرض است ، پيست كنيد اما براي ديركتوري جديد و نام دامنه آن را به روز كنيد:
/etc/apache2/sites-available/your_domain.conf

ServerAdmin admin@your_email_domain
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

توجه كنيد كه ما DocumentRoot را در دايركتوري جديد خود و ServerAdmin را به ايميلي كه به مدير سايت your_domain دسترسي دارد ، به روز كرده ايم. همچنين دو دستورالعمل اضافه كرده ايم: ServerName ، كه دامنه پايه اي را كه بايد براي اين تعريف ميزبان مجازي مطابقت داشته باشد منتشر ميكند، و ServerAlias ​​، كه نامهاي ديگري را تعريف مي كند كه بايد مطابق با نام اصلي باشند.
پس از اتمام فايل را ذخيره كنيد و ببنديد.
بياييد فايل را با ابزار a2ensite فعال كنيم:
⦁ $ sudo a2ensite your_domain.conf

سايت پيش فرض تعريف شده در 000-default.conf را غيرفعال كنيد.
⦁ $ sudo a2dissite 000-default.conf

سپس ، خطاهاي پيكربندي را آزمايش كنيد:
⦁ $ sudo apache2ctl configtest

بايد خروجي زير را مشاهده كنيد:
Output
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‘ServerName’ directive globally to suppress this message
Syntax OK

براي اجراي تغييرات مجدد Apache را راه اندازي كنيد.
⦁ $ sudo systemctl restart apache2

اكنون Apache بايد در خدمت نام دامنه شما باشد. مي توانيد با رفتن به http: // your_domain آن را تست كنيد، در آن جا بايد چيزي شبيه به اين را مشاهده كنيد :

مرحله ششم – آشنايي با فايل ها و ديركتوري هاي Apache
اكنون كه مي دانيد چگونه خود سرويس Apache را مديريت كنيد ، بايد چند دقيقه وقت بگذاريد تا با چند ديركتوري و فايل مهم آشنا شويد.
Content (محتوا)
/ var / www / html: محتواي وب واقعي ، كه به طور پيش فرض فقط شامل صفحه پيش فرض Apache است كه قبلاً ديديد ، از ديركتوري / var / www / html ارائه مي شود. با تغيير فايل هاي پيكربندي Apache مي توان اين مورد را تغيير داد.
Server Configuration )پيكربندي سرور مجازي (
/ etc / apache2: ديركتوري تنظيمات Apache است. همه فايل هاي پيكربندي Apache در اينجا قرار دارند.
/etc/apache2/apache2.conf: فايل اصلي پيكربندي Apache كه مي تواند براي ايجاد تغيير در پيكربندي جهاني Apache اصلاح شود. اين فايل وظيفه لود بسياري از فايل هاي ديگر را در ديركتوري تنظيمات دارد.
/etc/apache2/ports.conf: اين فايل پورت هايي را كه Apache در آن گوش خواهد داد را مشخص مي كند. به طور پيش فرض ، Apache درگاه 80 را گوش مي دهد و علاوه بر اين در هنگام فعال كردن ماژول قابليت هاي SSL ، درگاه 443 را نيز پيگيري ميكند.
/ etc / apache2 / sites-available /: دايركتوري كه ميزبان مجازي در هر سايت در آن قابل ذخيره است. Apache از فايل هاي پيكربندي موجود در اين ديركتوري استفاده نمي كند مگر اينكه به ديركتوري sites-enabled مرتبط باشند. به طور معمول ، تمام پيكربندي بلوك سرور مجازي در اين دايركتوري انجام مي شود ، و سپس با پيوند به ديركتوري ديگر با دستور a2ensite فعال مي شويد.
/ etc / apache2 / sites-enabled /: دايركتوري كه ميزبان مجازي فعال در هر سايت را ذخيره ميكند. به طور معمول ، با پيوند دادن به فايل هاي پيكربندي موجود در ديركتوري sites-available به a2ensite ايجاد مي شوند. Apache هنگام راه اندازي يا لود مجدد ، فايل هاي پيكربندي و پيوندهاي موجود در اين ديركتوري را مي خواند تا يك پيكربندي كامل را كامپايل كند.
/ etc / apache2 / conf-available /، / etc / apache2 / conf-enabled /: اين دايركتوري ها همانند دايركتوري هاي sites-available و sites-enabled ارتباط دارند ، اما براي ذخيره بخش هايي از پيكربندي كه به ميزبان مجازي تعلق ندارد ، استفاده مي شوند. فايل هاي موجود در ديركتوري conf-available با استفاده از دستور a2enconf مي توانند فعال شوند و با دستور a2disconf غيرفعال گردند.
/ etc / apache2 / mods-available /، / etc / apache2 / mods-enabled /: اين ديركتوري ها به ترتيب شامل ماژول هاي موجود و فعال هستند. فايل هايي كه به.load ختم ميشوند شامل بخش هايي براي بارگذاري ماژول هاي خاص هستند ، در حالي كه فايل هاي منتهي به .conf شامل پيكربندي براي اين ماژول ها هستند. ماژول ها را مي توان با استفاده از دستور a2enmod و a2dismod فعال و غيرفعال كرد.
Server Logs (ورود ها به سرور مجازي )
/var/log/apache2/access.log: به طور پيش فرض ، هر درخواستي به سرور مجازي وب شما در اين فايل log ثبت مي شود ، مگر اينكه Apache پيكربندي شده باشد كه كاري غير از اين را انجام دهد.
/var/log/apache2/error.log: به طور پيش فرض ، همه خطاها در اين فايل ثبت مي شوند. دستورالعمل LogLevel در پيكربندي Apache مشخص مي كند كه چه تعداد جزئيات ثبت خطا را شامل مي شود.
نتيجه
اكنون كه سرور مجازي وب خود را نصب كرده ايد ، گزينه هاي بسياري براي نوع محتوايي كه مي توانيد ارائه كنيد و فن آوري هايي كه مي توانيد از آنها استفاده كنيد داريد تا يك تجربه غني تر را ايجاد كنيد.
اگر مي خواهيد يك برنامه كاربردي كاملتر ايجاد كنيد ، مي توانيد به اين مقاله در مورد نحوه پيكربندي پشته LAMP در Debian 10 نگاهي بيندازيد.

 

برچسب‌ها:ApacheApache HTTPDebian 10

نصب Apache Tomcat 9 در Debian 10

Apache Tomcat يك سرور مجازي وب و كانتينر servlet است كه براي ارائه برنامه هاي جاوا استفاده مي شود. Tomcat يك اجراي منبع باز از فناوري هاي Java Servlet و JavaServer Pages است كه توسط بنياد نرم افزار Apache منتشر شده است. اين آموزش شامل نصب اوليه و برخي از تنظيمات آخرين نسخه Tomcat 9 در سرور مجازي Debian 10 ميباشد.
پيش نيازها
قبل از شروع اين راهنما ، بايد يك كاربر غير ريشه با امتيازات sudo در سرور مجازي خود داشته باشيد. مي توانيد با تكميل راهنماي تنظيم اوليه سرور مجازي Debian 10 ما اين كار را ياد بگيريد.
مرحله 1 – جاوا را نصب كنيد
Tomcat نياز دارد كه جاوا را روي سرور مجازي نصب باشد تا هر كد برنامه وب جاوا قابل اجرا باشد. ما مي توانيم با نصب OpenJDK با apt ، اين نياز را برآورده سازيم.
ابتدا ايندكس بسته apt خود را به روز كنيد:
⦁ $ sudo apt update

سپس بسته توسعه جاوا را با apt نصب كنيد:
⦁ $ sudo apt install default-jdk

اكنون كه جاوا نصب شده است ، مي توانيم يك كاربر tomcat ايجاد كنيم كه براي اجراي سرويس Tomcat استفاده خواهد شد.
مرحله 2 – ايجاد كاربر Tomcat
براي اهداف امنيتي ، Tomcat بايد به عنوان يك كاربر بدون امتيازات اجرا شود (يعني root نباشد). ما يك كاربر و گروه جديد ايجاد خواهيم كرد كه سرويس Tomcat را اجرا كند.
ابتدا ، يك گروه tomcat جديد ايجاد كنيد:
⦁ $ sudo groupadd tomcat

سپس ، يك كاربر جديد Tomcat ايجاد ميكنيم. اين كاربر را عضو گروه Tomcat ميكنيم با ديركتوري هوم / opt / tomcat (جايي كه Tomcat را نصب خواهيم كرد) و يك پوسته / bin / false (تا هيچ كس نتواند وارد حساب شود):
⦁ $ sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat

اكنون كه كاربر Tomcat ما تنظيم شده است ، اجازه دهيد Tomcat را دانلود و نصب كنيم.
مرحله 3 – Tomcat را نصب كنيد
بهترين راه براي نصب Tomcat 9 دانلود آخرين نسخه باينري و سپس پيكربندي دستي آن است.
آخرين نسخه Tomcat 9 را در صفحه دانلود Tomcat 9 پيدا كنيد. در زمان نوشتن اين مقاله، آخرين نسخه 9.0.27 است ، اما در صورت وجود بايد از نسخه پايدار بعدي استفاده كنيد. در زير بخش توزيع هاي باينري ، و سپس در زير ليست Core  ، لينك “tar.gz” را كپي كنيد.
در مرحله بعدي ، به بخش SSH خود بازگرديد و به ديركتوري / tmp در سرور مجازي خود برويد. اين يك ديركتوري خوب براي دانلود موارد زودگذر است ، مانند تاربال Tomcat ، كه ما پس از اكستركت مطالب Tomcat نيازي به آن نداريم:
⦁ $ cd /tmp

براي دانلود تاربال از ابزار خط فرمان curl استفاده خواهيم كرد. curl را نصب كنيد:
⦁ $ sudo apt install curl

اكنون ، براي دانلود پيوندي كه از وب سايت Tomcat كپي كرده ايد ، از curl استفاده كنيد:
⦁ $ curl -O http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.11/bin/apache-tomcat-9.0.11.tar.gz

ما Tomcat را در ديركتوري / opt / tomcat نصب خواهيم كرد. اين دايركتوري را ايجاد كنيد ، سپس بايگاني را با اين دستورات در آن اكستركت كنيد:
⦁ $ sudo mkdir /opt/tomcat

⦁ $ sudo tar xzvf apache-tomcat-9*tar.gz -C /opt/tomcat –strip-components=1

در مرحله بعد ، مجوزهاي كاربري مناسب را براي نصب خود تنظيم خواهيم كرد.
مرحله 4 – به روز رساني مجوزها
كاربر Tomcat كه ايجاد كرديم نياز به دسترسي به نصب Tomcat دارد. اكنون آن را تنظيم خواهيم كرد.
به دايركتوري برويد كه در آن نصب Tomcat را باز نكرديم:
⦁ $ cd /opt/tomcat

مالكيت گروه tomcat را به كل ديركتوري نصب بدهيد:
⦁ $ sudo chgrp -R tomcat /opt/tomcat

در مرحله بعد ، به گروه tomcat دسترسي به ديركتوري conf و كليه محتويات آن بدهيد و دسترسي به ديركتوري خود را اجرا كنيد:
⦁ $ sudo chmod -R g+r conf

⦁ $ sudo chmod g+x conf

كاربر Tomcat را به مالك ديركتوري هاي webapps, work, temp, و  logs تبديل كنيد:
⦁ $ sudo chown -R tomcat webapps/ work/ temp/ logs/

اكنون كه مجوزهاي مناسب تنظيم شده است ، يك فايل سرويس systemd را براي مديريت فرايند Tomcat ايجاد خواهيم كرد.
مرحله 5 – يك فايل خدمات systemd ايجاد كنيد
ما مي خواهيم بتوانيم Tomcat را به عنوان يك سرويس اجرا كنيم ، بنابراين فايل سرويس systemd را تنظيم خواهيم كرد.
Tomcat بايد بداند جاوا در كجا نصب شده است. اين مسير معمولاً به JAVA_HOME اشاره مي كند. آسانترين راه براي جستجوي آن مكان با اجراي اين دستور است:
⦁ $ sudo update-java-alternatives -l

Output
java-1.11.0-openjdk-amd64 1111 /usr/lib/jvm/java-1.11.0-openjdk-amd64

JAVA_HOME شما خروجي آخرين ستون است (در بالا هايلايت شده است). با توجه به مثال بالا ، JAVA_HOME صحيح براي اين سرور مجازي به اين صورت خواهد بود:
AVA_HOME
/usr/lib/jvm/java-1.11.0-openjdk-amd64

JAVA_HOME شما ممكن است متفاوت باشد.
با اين اطلاعات مي توانيم فايل سرويس systemd را ايجاد كنيم. با تايپ دستور زير فايلي به نام tomcat.service در ديركتوري / etc / systemd / system باز كنيد:
⦁ $ sudo nano /etc/systemd/system/tomcat.service

محتواي زير را در فايل سرويس خود پيست كنيد. در صورت لزوم مقدار JAVA_HOME را اصلاح كنيد تا با مقدار يافت شده در سيستم شما مطابقت داشته باشد. همچنين بهتر است تنظيمات تخصيص حافظه را كه در CATALINA_OPTS مشخص شده است اصلاح كنيد:
/etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment=’CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC’
Environment=’JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom’

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

پس از اتمام ، فايل را ذخيره كنيد و ببنديد.
سپس ، Daemon systemd را مجدد لود كنيد تا از تغييرات فايل سرويس ما مطلع شود:
⦁ $ sudo systemctl daemon-reload

سرويس Tomcat را با تايپ دستور زير شروع كنيد:
⦁ $ sudo systemctl start tomcat

با تايپ دستور زير مجدد بررسي كنيد كه بدون خطا شروع شده است:
⦁ $ sudo systemctl status tomcat

بايد خروجي مشابه زير را ببينيد:
Output
● tomcat.service – Apache Tomcat Web Application Container
Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2019-10-24 17:18:11 UTC; 4s ago
Process: 5962 ExecStart=/opt/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 5970 (java)
Tasks: 44 (limit: 2377)
Memory: 184.2M
CGroup: /system.slice/tomcat.service
└─5970 /usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.u

Oct 24 17:18:10 tomcat systemd[1]: Starting Apache Tomcat Web Application Container…
Oct 24 17:18:11 tomcat startup.sh[5962]: Tomcat started.
Oct 24 17:18:11 tomcat systemd[1]: Started Apache Tomcat Web Application Container.

اين خروجي تأييد مي كند كه Tomcat در سرور مجازي شما فعال و در حال اجرا است.
مرحله 6 – فايروال را تنظيم كرده و سرور مجازي Tomcat را تست كنيد
اكنون كه سرويس Tomcat آغاز شده است ، مي توانيم آزمايش كنيم تا مطمئن شويم كه صفحه پيش فرض در دسترس است.
قبل از انجام اين كار ، بايد فايروال را تنظيم كنيم تا درخواست هاي ما بتوانند به اين سرويس برسند. اگر پيش نيازها را رعايت كرده باشيد ، در حال حاضر يك فايروال ufw فعال شده داريد.
Tomcat از پورت 8080 براي پذيرش درخواستها استفاده مي كند. با تايپ كردن دستور زير اجازه دسترسي به آن پورت را بدهيد:
⦁ $ sudo ufw allow 8080

با اصلاح فايروال ، مي توانيد با رفتن به دامنه يا آدرس IP خود پس از 8080: در مرورگر وب، به صفحه splash پيش فرض دسترسي پيدا كنيد:
Open in web browser
http://server_domain_or_IP:8080

علاوه بر اطلاعات ديگر ، صفحه پيش فرض Tomcat splash را نيز خواهيد ديد. با اين حال ، اگر به عنوان مثال روي پيوندها براي برنامه Manager كليك كنيد ، از دسترسي محروم خواهيد شد. ما ميتوانيم اين دسترسي را در مرحله بعد پيكربندي كنيم.
اگر توانستيد با موفقيت به Tomcat دسترسي پيدا كنيد ، اكنون زمان مناسبي براي فعال كردن فايل خدمات است به گونه اي كه Tomcat به طور خودكار از بوت شروع شود:
⦁ $ sudo systemctl enable tomcat

مرحله 7 – رابط مديريت وب Tomcat را پيكربندي كنيد
براي استفاده از برنامه وب منيجر كه همراه Tomcat است ، بايد وارد سرور مجازي Tomcat خود شويم. اين كار را با ويرايش فايل tomcat-users.xml انجام خواهيم داد:
⦁ $ sudo nano /opt/tomcat/conf/tomcat-users.xml

بهتر است كاربري را اضافه كنيد كه بتواند به manager-gui و admin-gui دسترسي پيدا كند (برنامه هاي وب كه با Tomcat همراه هستند). شما مي توانيد اين كار را با تعريف يك كاربر ، مشابه مثال زير ، بين برچسب هاي tomcat-users انجام دهيد. حتماً نام كاربري و رمز عبور را به چيزي امن تغيير دهيد:
tomcat-users.xml

. . .

پس از اتمام فايل را ذخيره كنيد و ببنديد.
به طور پيش فرض ، نسخه هاي جديدتر Tomcat دسترسي به برنامه هاي Manager و Host Manager را به اتصالات سرور مجازي خود محدود مي كند. از آنجا كه ما روي يك دستگاه از راه دور آن را نصب مي كنيم ، احتمالاً مي خواهيد اين محدوديت را حذف كنيد يا تغيير دهيد. براي تغيير محدوديت هاي آدرس IP در اين مورد ، فايل هاي مناسب.xml را باز كنيد.
براي برنامه منيجر ، تايپ كنيد:
⦁ $ sudo nano /opt/tomcat/webapps/manager/META-INF/context.xml

براي برنامه هاست منيجر ، تايپ كنيد:
⦁ $ sudo nano /opt/tomcat/webapps/host-manager/META-INF/context.xml

در داخل ، محدوديت آدرس IP را باطل كنيد تا از هرجاي ديگر بتوانيد اتصالات برقرار كنيد. از طرف ديگر ، اگر مايل هستيد به اتصالات حاصل از آدرس IP شخصي خود دسترسي بدهيد، مي توانيد آدرس IP عمومي خود را به اين ليست اضافه كنيد:
context.xml files for Tomcat webapps

allow=”127.d+.d+.d+|::1|0:0:0:0:0:0:0:1″ />–>

پس از اتمام ، فايل ها را ذخيره كنيد و ببنديد.
براي اعمال تغييرات خود ، سرويس Tomcat را مجدداً راه اندازي كنيد:
⦁ $ sudo systemctl restart tomcat

مرحله 8 – دسترسي به رابط وب
اكنون كه يك كاربر ايجاد كرده ايم ، مي توانيم دوباره در يك مرورگر وب به رابط مديريت وب دسترسي پيدا كنيم. يك بار ديگر ، مي توانيد با وارد كردن نام دامنه سرور مجازي يا آدرس IP همراه با پورت 8080 در مرورگر خود ، به رابط صحيح برسيد:
Open in web browser
http://server_domain_or_IP:8080

صفحه اي كه مي بينيد بايد همان صفحه اي باشد كه هنگام آزمايش قبلي به شما نشان داده شده است:

بياييد نگاهي به برنامه منيجر بيندازيم كه از طريق لينك يا http: // server_domain_or_IP: 8080 / manager / html قابل دسترسي است. لازم است اعتبارات حساب كه به فايل tomcat-users.xml اضافه كرديد را وارد نماييد. پس از آن ، بايد صفحه اي را مشاهده كنيد كه به شكل زير است:

Web Application Manager براي مديريت برنامه هاي جاوا استفاده مي شود. مي توانيد در اينجا اقدام به شروع ، توقف ، بارگيري مجدد ، استقرار و عدم استقرار نماييد. همچنين مي توانيد برخي از تشخيص ها را در برنامه هاي خود اجرا كنيد (مثلا پيدا كردن نشت حافظه). در آخر ، اطلاعات مربوط به سرور مجازي شما در انتهاي همين صفحه موجود است.
حال اجازه دهيد، از طريق لينك يا http://server_domain_or_IP:8080/host-manager/html/ نگاهي به هاست منيجر بيندازيم.

از صفحه Virtual Host Manager ، مي توانيد ميزبان هاي مجازي را براي ارائه برنامه هاي خود اضافه كنيد.
نتيجه
نصب شما از Tomcat پايان يافته است! اكنون مي توانيد برنامه هاي وب جاوا خود را مستقر كنيد.
در حال حاضر ، نصب Tomcat شما كاربردي است ، اما كاملاً بدون رمزگذاري ميباشد. اين بدان معني است كه تمام داده ها ، از جمله موارد حساس مانند گذرواژه‌ها ، با متن ساده ارسال مي شوند كه توسط طرفين ديگر در اينترنت قابل رهگيري و خواندن هستند. براي جلوگيري از وقوع اين اتفاق ، اكيداً توصيه مي شود كه اتصالات خود را با SSL رمزگذاري كنيد. با پيروي از اين راهنما مي توانيد نحوه رمزگذاري اتصالات خود با Tomcat را ياد بگيريد (توجه داشته باشيد: اين راهنما رمزگذاري Tomcat 8 را در Ubuntu 16.04 پوشش مي دهد).

 

برچسب‌ها:Apache TomcatAPTOpenJDKopt

راه اندازي سرور اوليه با Debian 10

در اين آموزش مي آموزيد كه چگونه عناصر را با JSX توصيف كنيد. JSX انتزاعي است كه به شما امكان مي دهد دستور مشابه HTML را در كد جاوا اسكريپت خود بنويسيد و شما را قادر ميسازد تا مولفه هاي React را كه شبيه علائم استاندارد HTML هستند ، بسازيد. JSX زبان تمپليت مولفه هاي React است و بنابراين پايه و اساس هر نشانه گذاري اي است كه React به برنامه شما ارائه مي دهد.
از آنجايي كه JSX شما را قادر مي سازد جاوا اسكريپت را نيز در نشانه گذاري خود بنويسيد ، مي توانيد از توابع و روش هاي JavaScript ، از جمله نگاشت آرايه و ارزيابي اتصال كوتاه براي شرطي ها استفاده كنيد.
به عنوان بخشي از آموزش ، رويدادهاي كليك را مستقيماً در نشانه گذاري روي دكمه ها ضبط مي كنيد و مواردي را مشاهده مي كنيد كه تركيب دقيقاً مطابق با HTML استاندارد نباشد ، مانند كلاس هاي CSS. در پايان اين آموزش ، يك برنامه كاري داريد كه از انواع مختلفي از ويژگيهاي JSX استفاده مي كند تا ليستي از مولفه هايي را كه داراي يك شنونده كليك داخلي هستند ، نمايش دهد. اين يك الگوي رايج در برنامه هاي React است كه شما اغلب در طول يادگيري چارچوب استفاده خواهيد كرد. همچنين مي توانيد عناصر استاندارد HTML را با جاوا اسكريپت مخلوط كنيد تا ببينيد چگونه React به شما امكان ايجاد كد هاي كوچك و قابل استفاده مجدد را مي دهد.
پيش نيازها
• به محيط توسعه در حال اجراي Node.js نياز داريد. اين آموزش بر روي Node.js نسخه 10.19.0 و npm نسخه 6.13.4 تست شده است. براي نصب اين برنامه در maغير مجاز مي باشد يا Ubuntu 18.04 ، مراحل نحوه نصب Node.js و ايجاد محيط توسعه محلي را در maغير مجاز مي باشد يا نصب با استفاده از بخش PPA در آموزش نحوه نصب Node.js در اوبونتو 18.04 را دنبال كنيد.
• بايد با  Create React App قادر به ايجاد برنامه باشيد. مي توانيد دستورالعمل نصب را در نحوه ايجاد يك پروژه React با  Create React App پيدا كنيد.
• همچنين به دانش پايه از JavaScript نياز خواهيد داشت كه مي توانيد در نحوه كدنويسي در JavaScript بياموزيد و به دانش پايه از HTML و CSS نيز احتياج داريد. يك منبع مناسب براي HTML و CSS ، شبكه توسعه دهنده Mozilla ميباشد.
مرحله 1 – اضافه كردن نشانه گذاري به يك مولفه React
همانطور كه قبلاً نيز اشاره شد ، React يك زبان نشانه گذاري خاص به نام JSX دارد. پ تركيبي از نحو HTML و JavaScript است كه چيزي شبيه به اين ميباشد:


{inventory.filter(item => item.available).map(item => (

{item.name}

{item.price}


))
}

برخي از قابليت هاي JavaScript مانند .filter و .map و همچنين برخي HTML هاي استاندارد مانند

را خواهيد شناخت. اما بخش هاي ديگري مانند و className نيز وجود دارند كه شبيهHTML و JavaScript به نظر مي رسد.
اين زبان JSX است ، يعني زبان نشانه گذاري ويژه اي كه به مولفه هاي React حس HTML را با قدرت JavaScript مي دهد.
در اين مرحله ، مي آموزيد كه تركيب HTML مانند پايه را به مولفه موجود React اضافه كنيد. براي شروع ، مولفه هاي HTML استاندارد را به يك تابع JavaScript اضافه خواهيد كرد ، سپس كد كامپايل شده را در يك مرورگر مشاهده مي كنيد. همچنين عناصر را گروه بندي مي كنيد تا React بتواند آنها را با حداقل نشانه گذاري كامپايل كند ، و HTML تميزي را ارائه كند.
براي شروع ، يك پروژه جديد درست كنيد. در خط فرمان خود ، اسكريپت زير را اجرا كنيد تا يك پروژه تازه با استفاده از create-react-app نصب كنيد:
⦁ $ npx create-react-app jsx-tutorial

پس از اتمام پروژه ، دايركتوري را تغيير دهيد:
⦁ $ cd jsx-tutorial

در يك ترمينال يا پنجره جديد ، پروژه را با استفاده از اسكريپت شروع Create React App شروع كنيد. مرورگر بعد از تغييرات مجدداً ريفرش ميشود ، بنابراين در تمام مدت كار شما اين اسكريپت را رها ميكند:
⦁ $ npm start

يك سرور مجازي محلي در حال اجرا دريافت خواهيد كرد. اگر پروژه در پنجره مرورگر باز نشد ، مي توانيد آن را در http: // localhost: 3000 / پيدا كنيد. اگر اين كار را از يك سرور مجازي از راه دور انجام مي دهيد ، آدرس http: // your_IP_address: 3000 خواهد بود.
مرورگر شما با يك برنامه React به عنوان بخشي از Create React App لود مي شود.

شما در حال ساخت مجموعه كاملاً جديدي از مولفه هاي سفارشي هستيد ، بنابراين بايد با پاك كردن برخي از كد هاي متن استاندارد شروع كنيد تا بتوانيد يك پروژه خالي داشته باشيد. براي شروع App.js ار در ويرايشگر متن باز كنيد. اين قسمت اصلي است كه به صفحه تزريق مي شود. همه مؤلفه ها از اينجا شروع مي شوند.
در يك ترمينال جديد ، وارد پوشه پروژه شويد و src / App.js را با دستور زير باز كنيد:
⦁ $ nano src/App.js

فايلي مانند اين را مشاهده خواهيد كرد:
jsx-tutorial/src/App.js
import React from ‘react’;
import logo from ‘./logo.svg’;
import ‘./App.css’;

function App() {
return (



”logo”


Edit src/App.js and save to reload.


className=”App-link”
href=”https://reactjs.org”
target=”_blank”
rel=”noopener noreferrer”
>
Learn React



);
}

export default App;

اكنون پس از عبارت بازگشت در تابع ، خط import logo from ‘./logo.svg و هر چيز ديگر را حذف كنيد. آن را به null تغيير دهيد. كد نهايي به شرح زير خواهد بود:
jsx-tutorial/src/App.js
import React from ‘react’;
import ‘./App.css’;

function App() {
return null;
}

export default App;

ويرايشگر متن را ذخيره كرده و از آن خارج شويد.
در آخر ، لوگو را حذف كنيد. در پنجره ترمينال دستور زير را تايپ كنيد:
⦁ $ rm src/logo.svg

شما در برنامه خود از اين فايل SVG استفاده نخواهيد كرد و بايد هنگام كار ، فايل هاي بلااستفاده را حذف كنيد. بهتر است در طولاني مدت كد خود را سازماندهي كنيد.
اكنون كه اين قسمت از پروژه شما حذف شده است ، مي توانيد به جستجو در جنبه هاي ديگر JSX بپردازيد. اين زبان نشانه گذاري توسط React كامپايل شده و در نهايت تبديل به HTML مي شود كه در يك صفحه وب مشاهده مي كنيد. بدون وارد شدن عميق داخلي React ، JSX را مي گيرد و الگويي از صفحه شما را ايجاد مي كند ، سپس عناصر لازم را ايجاد كرده و آنها را به صفحه اضافه مي كند.
اين بدان معني است كه مي توانيد چيزي را بنويسيد كه شبيه HTML است و انتظار داشته باشيد كه HTML ارائه شده مشابه باشد. با اين حال ، چند مرحله وجود دارد.
ابتدا ، اگر به سربرگ يا پنجره سرور مجازي خود نگاه كنيد ، اين را مشاهده خواهيد كرد
Output

./src/App.js
Line 1:8: ‘React’ is defined but never used no-unused-vars

اين linter به شما مي گويد كه از كد React وارد شده استفاده نمي كنيد. هنگامي كه خط import React from ‘react’ را به كد خود اضافه مي كنيد ، كد JavaScript را وارد مي كنيد كه JSX را به React code تبديل مي كند. اگر JSX وجود نداشته باشد ، ديگر نيازي به ورودي نيست.
بياييد با اضافه كردن مقدار كمي JSX اين مسئله را تغيير دهيم. با جايگزين كردن null با يك مثال hello, world شروع كنيد:
jsx-tutorial/src/App.js
import React from ‘react’;
import ‘./App.css’;

function App() {
return

Hello, World

;
}

export default App;

فايل را ذخيره كنيد. اگر به ترمينال با سرور مجازي در حال اجرا نگاه كنيد ، پيام اخطار از بين خواهد رفت. اگر از مرورگر خود بازديد كنيد ، پيام را به عنوان مولفه h1 مشاهده خواهيد كرد.

سپس ، در زير برچسب

، يك برچسب پاراگراف اضافه كنيد كه شامل رشته I am writing JSX است. كد به صورت زير خواهد بود:
jsx-tutorial/src/App.js
import React from ‘react’;
import ‘./App.css’;

function App() {
return(

Hello, World


I am writing JSX


)
}

export default App;

از آنجايي كه JSX چندين خط دارد ، نياز است عبارت در پرانتز قرار داده شود.
فايل را ذخيره كنيد. هنگامي كه اين كار را كرديد، خطايي در اجراي سرور مجازي خود در ترمينال مشاهده مي كنيد:
Output
./src/App.js
Line 7:5: Parsing error: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>…?

5 | return(
6 |

Hello, World


> 7 |

I am writing JSX


| ^
8 | )
9 | }
10 |

وقتي JSX را از يك تابع يا عبارت باز مي گردانيد ، بايد يك مولفه واحد را برگردانيد. اين مولفه ممكن است بخش هاي لانه گزيده باشد ، اما اگر يك مولفه سطح بالا باشد. در اين حالت ، دو مولفه را بر مي گردانيد.
fix يك تغيير كد جزيي است. با يك برچسب خالي كد را محصور كنيد. برچسب خالي يك مولفه HTML است كه هيچ كلمه اي ندارد. به اين شكل: <>
به./src/App.js در ويرايشگر خود برويد و برچسب خالي را اضافه كنيد:
jsx-tutorial/src/App.js
import React from ‘react’;
import ‘./App.css’;

function App() {
return(
<>

Hello, World


I am writing JSX



)
}

export default App;

برچسب خالي يك مولفه واحد ايجاد مي كند ، اما وقتي كد كامپايل شد ، به نشانه گذاري نهايي اضافه نمي شود. اين كار باعث مي شود كدهاي شما در عين حال كه يك مولفه واحد به React مي دهند ، صحيح باقي بمانند.
توجه: شما مي توانيد به جاي برچسب هاي خالي ، كد را با يك div محصور كنيد ، مادامي كه كد يك مولفه را برگرداند. در اين مثال ، يك برچسب خالي اين مزيت را دارد كه نشانه گذاري اضافي به خروجي تجزيه نشده اضافه نمي كند.

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

اكنون JSX اساسي را به مؤلفه خود اضافه كرده ايد و ياد گرفته ايد كه چگونه بايد همه JSX در يك مؤلفه مستقر شود. در مرحله بعد ، يك ظاهر طراحي را به مؤلفه خود اضافه مي كنيد.
مرحله 2 – اضافه كردن طراحي به يك مولفه به همراه ويژگي ها
در اين مرحله ، به عناصر موجود در مؤلفه خود مي پردازيد تا ياد بگيريد كه چگونه ويژگي هاي HTML با JSX كار مي كنند. در React گزينه هاي بسياري براي طراحي وجود دارد. برخي از آنها شامل نوشتن CSS در جاوا اسكريپت است، بو رخي ديگر از پيش پردازنده استفاده مي كنند. در اين آموزش با كلاس هاي CSS و CSS وارد شده كار خواهيد كرد.
اكنون كه كد خود را داريد ، وقت آن است كه يك ظاهر طراحي شده اضافه كنيد. App.css را در ويرايشگر متن خود باز كنيد:
⦁ $ nano src/App.css

از آنجا كه شما با JSX جديد شروع مي كنيد ، CSS فعلي به عناصري اشاره مي كند كه ديگر وجود ندارند. از آنجا كه به CSS احتياج نداريد ، مي توانيد آن را حذف كنيد.
پس از حذف كد ، فايلي خالي خواهيد داشت.
در مرحله بعد ، مي توانيد طراحي به مركز متن اضافه كنيد. در src / App.css كد زير را اضافه كنيد:
jsx-tutorial/src/App.css
.container {
display: flex;
flex-direction: column;
align-items: center;
}

در اين بلوك كد ، شما  CSS class selector را با نام .container ايجاد كرده ايد و از آن براي در مركز قرار دادن محتوا با استفاده از display: flex استفاده كرده ايد.
فايل را ذخيره كرده و خارج شويد. مرورگر بروزرساني مي شود ، اما هيچ چيز تغيير نخواهد كرد. قبل از مشاهده تغيير ، بايد كلاس CSS را به مؤلفه React خود اضافه كنيد. كد JavaScript مولفه را انتخاب كنيد:
⦁ $ nano src/App.js

كد CSS قبلاً با خط import ‘./App.css’ وارد شده است. اين بدان معني است كه webpack براي ساختن يك صفحه طراحي نهايي، كد را وارد مي كنند ، اما براي اعمال CSS روي عناصر خود ، بايد كلاس ها را اضافه كنيد.
ابتدا ، در ويرايشگر متن ، برچسب هاي خالي ، <> را به

تغيير دهيد.
jsx-tutorial/src/App.js
import React from ‘react’;
import ‘./App.css’;

function App() {
return(


Hello, World


I am writing JSX



)
}

export default App;

در اين كد تگ هاي خالي – <> – را با برچسب هاي div جايگزين كرده ايد. تگ هاي خالي براي گروه بندي كد شما بدون اضافه كردن برچسب هاي اضافي مفيد هستند ، اما در اينجا شما بايد از div استفاده كنيد زيرا برچسب هاي خالي هيچ ويژگي HTML را نمي پذيرند.
در مرحله بعد بايد نام كلاس را اضافه كنيد. اينجاست كه JSX شروع به واگرايي از HTML مي كند. اگر مي خواهيد يك كلاس را به يك مولفه HTML معمولي اضافه كنيد ، اين كار را اينگونه انجام مي دهيد:


Copy

اما از آنجا كه JSX جاوا اسكريپت است ، محدوديت هايي دارد. يكي از محدوديت ها اين است كه جاوا اسكريپت كلمات كليدي خود را رزرو كرده است. اين بدان معناست كه شما نمي توانيد از كلمات خاصي در هر كد JavaScript استفاده كنيد. به عنوان مثال ، شما نمي توانيد يك متغير به نام null ايجاد كنيد زيرا اين كلمه در حال حاضر محفوظ است.
يكي از كلمات رزرو شده class است. React با كمي تغيير دادن اين كلمه كار خود را انجام ميدهد. به جاي اضافه كردن مشخصه class ، className را اضافه مي كنيد. به عنوان يك قاعده ، اگر يك مشخصه (attribute) همانطور كه انتظار مي رود كار نمي كند ، سعي كنيد نسخه camel case را اضافه كنيد. مشخصه ديگري كه كمي متفاوت است مشخصه for ميباشد كه براي برچسب ها استفاده ميكنيد. چند مورد ديگر نيز وجود دارد ، اما خوشبختانه اين ليست نسبتاً كوتاه است.
توجه: در React ، مشخصه ها اغلب prps خوانده مي شوند. Props داده هايي هستند كه مي توانيد به ساير مؤلفه هاي سفارشي منتقل كنيد. آنها مشابه مشخصه ها هستند به جز اينكه با هيچ يك از مشخصات HTML مطابقت ندارند. در اين آموزش ، آنها را مشخصه مي ناميم زيرا عمدتا مانند مشخصه هاي استاندارد HTML استفاده مي شوند. اين امر آنها را از propهايي كه مانند مشخصه هاي HTML رفتار نمي كنند ، متمايز مي كند ، كه بعداً در اين مجموعه پوشش داده مي شود.

اكنون كه مي دانيد چگونه از مشخصه calss در React استفاده مي شود ، مي توانيد كد خود را به روز كنيد تا طراحي ها را درج كنيد. در ويرايشگر متن خود ، className=”container” را به برچسب div اضافه كنيد
jsx-tutorial/src/App.js
import React from ‘react’;
import ‘./App.css’;

function App() {
return(


Hello, World


I am writing JSX



)
}

export default App;

فايل را ذخيره كنيد. با انجام اين كار ، صفحه مجدد لودد مي شود و محتوا در مركز قرار مي گيرد ..

ويژگي className در React بي نظير است. شما مي توانيد اكثر ويژگيهاي HTML را بدون هيچ تغييري به JSX اضافه كنيد. به عنوان نمونه ، به ويرايشگر متن خود برگرديد و شناسه greeting را به مولفه

خود اضافه كنيد. مانند HTML استاندارد به نظر مي رسد:
jsx-tutorial/src/App.js
import React from ‘react’;
import ‘./App.css’;

function App() {
return(


Hello, World


I am writing JSX



)
}

export default App;

صفحه را ذخيره كرده و مرورگر را مجدد لود كنيد. مشابه قبلي خواهد بود.
تاكنون ، JSX به عنوان نشانه گذاري استاندارد به نظر مي رسيد ، اما مزيت JSX اين است كه حتي اگر شبيهHTML به نظر مي رسد ، قدرت جاوا اسكريپت را دارد. اين بدان معناست كه مي توانيد متغيرها را اختصاص دهيد و آنها را در مشخصه هاي خود ارجاع دهيد. براي ارجاع به يك مشخصه ، آن را به جاي نقل قولها در پرانتزهاي به شكل {} قرار دهيد.
در ويرايشگر متن خود ، خطوط هايلايت شده زير را به عنوان يك مشخصه اضافه كنيد:
jsx-tutorial/src/App.js
import React from ‘react’;
import ‘./App.css’;

function App() {
const greeting = “greeting”;
return(


Hello, World


I am writing JSX



)
}

export default App;

در اين كد ، در بالاي عبارت return يك متغير به نام greeting با مقدار “greeting” ايجاد كرده ايد ، سپس متغير را در مشخصه id برچسب

خود ارجاع داده ايد.
فايل را ذخيره كنيد و از آن خارج شويد. صفحه همان خواهد بود، اما برچسب id خواهد داشت.

تاكنون با چند مولفه به تنهايي كار كرده ايد ، اما مي توانيد از JSX همچنين براي اضافه كردن بسياري از عناصر HTML استفاده كرده و آنها را براي ايجاد صفحات پيچيده مستقر نماييد.
براي نشان دادن اين موضوع ، مي توانيد با ليستي از ايموجي ها صفحه اي ايجاد كنيد. اين شكلك ها با يك مولفه









  • )
    }

    export default App;

    در اينجا شما براي نگه داشتن ليستي از ايموجي ها برچسب

      ايجاد كرده ايد. هر ايموجي در يك مولفه
    • جداگانه قرار دارد و با يك مولفه


    • onClick={event => alert(event.target.id)}
      >
      ????



    • onClick={event => alert(event.target.id)}
      >
      ????




    )
    }

    export default App;

    از آنجا كه اين JSX است ، onclick را به صورت camelCased درمي آوريد ، به اين معني كه آن را به صورت onClick اضافه كرده ايد. اين مشخصه onClick از يك تابع ناشناس براي بازيابي اطلاعات در مورد آيتمي كه كليك شده است استفاده مي كند.
    شما يك تابع فلش ناشناس اضافه كرديد كه اين رويداد را از روي دكمه كليك شده درياقن مي كند و رويداد داراي هدفي خواهد بود كه مولفه است. اطلاعات مورد نياز در مشخصه id است كه مي توانيد با event.target.id به آنها دسترسي پيدا كنيد. با تابع () alert مي توانيد هشدار را فعال كنيد.
    فايل را ذخيره كنيد. در مرورگر خود ، روي يكي از ايموجي ها كليك كرده و هشداري را به همراه نام دريافت خواهيد كرد.

    مي توانيد با يكبار اعلام تابع و انتقال آن به هر تابع onClick ، ​​ تكرار را كاهش دهيد. از آنجايي كه اين تابع به چيزي غير از ورودي و خروجي متكي نيست ، مي توانيد آن را خارج از تابع مؤلفه اصلي اعلام كنيد. به عبارت ديگر ، تابع نيازي به دسترسي به حوزه مولفه ندارد. مزيت جدا كردن آنها اين است كه تابع كامپوننت شما كمي كوتاه تر است و مي توانيد در صورت نياز بعدا تابع را به يك فايل جداگانه منتقل كنيد.
    در ويرايشگر متن خود ، تابعي به نام displayEmojiName ايجاد كنيد كه اين رويداد را بگيرد و تابع ()alert را با شناسه فراخواني كند. سپس تابع را به هر مشخصه onClick منتقل كنيد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    const displayEmojiName = event => alert(event.target.id);

    function App() {
    const greeting = “greeting”;
    return(


    Hello, World


    I am writing JSX




    • onClick={displayEmojiName}
      >
      ????



    • onClick={displayEmojiName}
      >
      ????



    • onClick={displayEmojiName}
      >
      ????




    )
    }

    export default App;

    فايل را ذخيره كنيد. در مرورگر خود ، روي emoji كليك كنيد و همان هشدار را مشاهده خواهيد كرد.
    در اين مرحله ، شما به هر مولفه رويدادهايي اضافه كرديد. همچنين ديديد كه چگونه JSX از اسامي كمي متفاوت براي رويدادهاي مولفه استفاده مي كند ، و با گرفتن تابع و استفاده مجدد از آن بر روي چندين مولفه ، شروع به نوشتن كد قابل استفاده مجدد كرديد. در مرحله بعد ، يك تابع قابل استفاده مجدد خواهيد نوشت كه به جاي نوشتن هر مولفه به صورت دستي، عناصر JSX را برمي گرداند. اين امر بيشتر باعث كاهش تكرار خواهد شد.
    مرحله 4 – نگاشت روي داده ها براي ايجاد عناصر
    در اين مرحله ، استفاده از JSX فراتر از نشانه گذاري ساده خواهد رفت. ياد مي گيريد كه آن را با جاوا اسكريپت تركيب كنيد تا نشانه گذاري پويا ايجاد كنيد كه كد را كوچك مي كند و خوانايي را بهبود مي بخشد. مي توانيد كد خود را در آرايه اي كه براي ايجاد عناصر HTML حلقه مي كنيد ، آناليز كنيد.
    JSX شما را به يك تركيب مشابه HTML محدود نمي كند. همچنين امكان استفاده مستقيم از JavaScript را در نشانه گذاري به شما مي دهد. اين كار را تا حدي با وارد كردن توابع به مشخصه ها امتحان كرده ايد. همچنين از متغيرها براي استفاده مجدد از داده ها استفاده كرده ايد. اكنون زمان آن رسيده كه JSX را مستقيماً از داده ها با استفاده از كد استاندارد JavaScript بسازيد.
    در ويرايشگر متن خود ، بايد آرايه اي از داده هاي ايموجي را در فايل src / App.js ايجاد كنيد. اگر بسته است ، فايل را مجدداً باز كنيد:
    ⦁ $ nano src/App.js

    آرايه اي را اضافه كنيد كه شامل آبجكت هاي داراي ايموجي و نام ايموجي باشد. توجه داشته باشيد كه ايموجي ها بايد با علامت نقل قول احاطه شوند. اين آرايه را فراتر از تابع app ايجاد كنيد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    const displayEmojiName = event => alert(event.target.id);
    const emojis = [
    {
    emoji: “????”,
    name: “grinning face”
    },
    {
    emoji: “????”,
    name: “party popper”
    },
    {
    emoji: “????”,
    name: “woman dancing”
    }
    ];

    function App() {

    }

    export default App;

    اكنون كه داده داريد مي توانيد از طريق آن حلقه بزنيد. براي استفاده از JavaScript در داخل JSX ، بايد آن را در پرانتز {} قرار دهيد. مشابه زماني است كه توابع را به مشخصه ها اضافه كرديد.
    براي ايجاد مؤلفه هاي React ، بايد داده ها را به عناصر JSX تبديل كنيد. براي انجام اين كار ، روي داده ها نگاشت مي كنيد و يك مولفه JSX را برمي گردانيد. چند نكته وجود دارد كه هنگام نوشتن كد بايد آنها را به خاطر بسپاريد.
    ابتدا ، يك گروه از آيتم ها بايد توسط يك كانتينر

    احاطه شوند. سپس ، هر آيتم به يك مشخصه خاص به نام key نياز دارد. Key نياز به يك سري داده منحصر به فرد دارد كه React مي تواند از آنها استفاده كند تا عناصر را رديابي كند و بداند چه موقع به روز رساني اين مؤلفه را انجام دهد. اين كليد از HTML كامپايل شده خارج مي شود ، زيرا فقط براي اهداف داخلي است. هر زمان كه با حلقه كار مي كنيد ، بايد يك رشته ساده را به عنوان كليد اضافه كنيد.
    در اينجا مثال ساده اي وجود دارد كه ليستي از نام ها را در يك
    نگاشت مي كند:

    const names = [
    “Atul Gawande”,
    “Stan Sakai”,
    “Barry Lopez”
    ];

    return(


    {names.map(name =>
    {name}
    )}

    )

    HTML حاصل از اين قرار است:


    Atul Gawande

    Stan Sakai

    Barry Lopez


    تبديل ليست ايموجي مشابه خواهد بود.

      كانتينر خواهد بود. روي داده ها نگاشت مي كنيد و
    • را با كليد نام كوتاه ايموجي برميگردانيد. شما داده هاي به سختي كد شده را در برچسب هاي

    • ))
      }


    )
    }
    export default App;
    Copy

    در اين كد ، شما بر روي آرايه emojis در برچسب

      نگاشت كرديد و
    • را برگردانديد. در هر
    • از نام ايموجي به عنوان مشخصه key استفاده كرده ايد. دكمه همان تابع عادي را خواهد داشت. در مولفه ، aria-label و id را با name جايگزين كنيد. محتواي برچسب بايد ايموجي باشد.
      فايل را ذخيره كنيد. پنجره شما ريفرش خواهد شد و داده ها را مشاهده خواهيد كرد. توجه كنيد كه كليد در HTML توليد شده وجود ندارد.

      تركيب JSX با استاندارد JavaScript ابزارهاي زيادي را در اختيار شما قرار مي دهد تا بصورت ديناميكي محتوا را ايجاد كنيد و مي توانيد از هر JavaScript استاندارد مورد نظر خود استفاده كنيد. در اين مرحله ، JSX سخت كد گذاري شده را با يك آرايه و يك حلقه جايگزين كرديد تا HTML به صورت پويا ايجاد شود. در مرحله بعد ، با استفاده از اتصال كوتاه ، اطلاعات را به صورت مشروط نشان مي دهيد.
      مرحله 5 – نمايش مشروط عناصر با اتصال كوتاه
      در اين مرحله ، از اتصال كوتاه براي نمايش مشروط عناصر HTML استفاده خواهيد كرد. اين كار به شما امكان مي دهد تا مؤلفه هايي ايجاد كنيد كه بتوانند HTML را بر اساس اطلاعات اضافي پنهان كند يا نشان دهد ، و به انعطاف پذيري مولفه هاي شما براي رسيدگي به موقعيت هاي مختلف مي پردازند.
      مواقعي وجود دارد كه شما براي نشان دادن اطلاعات در بعضي آيتم ها به مؤلفه نياز داريد و در آيتم هاي ديگر احتيج نيست. به عنوان مثال ، فقط در صورت صحت برخي موارد ممكن است بخواهيد براي كاربر پيام هشدار نشان دهيد ، يا ممكن است بخواهيد برخي از اطلاعات حساب را براي ادمين نمايش دهيد كه نمي خواهيد يك كاربر عادي آن را ببيند.
      براي اين كار از گردش كوتاه استفاده خواهيد كرد. اين بدان معناست كه شما از يك شرط استفاده خواهيد كرد و اگر قسمت اول صادق باشد ، اطلاعات را در قسمت دوم برمي گرداند.
      در اينجا يك مثال مطرح شده است. اگر مي خواهيد يك دكمه را فقط در صورت ورود كاربر به سيستم نشان دهيد ، اين مولفه را در پرانتز {} قرار دهيد و شرايط را قبل از آن اضافه مي كنيد.
      {isLoggedIn && }
      Copy

      در اين مثال ، شما در حال استفاده از عملگر && هستيد كه اگر همه چيز صادق باشد ، آخرين مقدار را به شما بازمي گرداند. در غير اين صورت ، false را برگردانده ، كه به React مي گويند هيچ نشانه گذاري اضافي را برنگرداند. اگر isLoggedIn صادق باشد ، React دكمه را نشان مي دهد. اگر isLoggedIn غلط باشد ، دكمه را نشان نمي دهد.
      براي امتحان كردن اين مسئله ، خطوط هايلايت شده زير را اضافه كنيد:
      jsx-tutorial/src/App.js
      import React from ‘react’;
      import ‘./App.css’;

      function App() {
      const greeting = “greeting”;
      const displayAction = false;
      return(


      Hello, World


      {displayAction &&

      I am writing JSX

      }




      )
      }

      export default App;

      در ويرايشگر متن خود متغيري به نام displayAction با مقدار false ايجاد كرده ايد. سپس برچسب

      را در {} قرار داديد. در شروع پرانتزها ، براي ايجاد شرط ، displayAction && را اضافه كرديد.
      فايل را ذخيره كنيد و خواهيد ديد كه مولفه در مرورگر شما ناپديد مي شود. مهم است بدانيد ، در HTML توليد شده نيز ظاهر نمي شود. اين مخفي كردن يك مولفه با CSS نيست. اصلاً در نشانه گذاري نهايي وجود نخواهد داشت.

      در حال حاضر مقدار displayAction سخت كدنويسي شده است ، اما مي توانيد آن مقدار را به عنوان حالت ذخيره كرده يا آن را به عنوان يك پايه در قسمت مولفه هاي بالاسري منتقل كنيد.
      در اين مرحله ياد گرفتيد كه چگونه عناصر را به صورت مشروط نشان دهيد. اين به شما امكان مي دهد تا مؤلفه هايي را تنظيم كنيد كه براساس اطلاعات ديگر قابل تنظيم هستند.
      نتيجه
      در اين آموزش ، يك برنامه سفارشي با JSX ايجاد كرديد. آموختيد كه چگونه عناصر HTML مانند، را به مولفه هاي خود اضافه كنيد ، يك ظاهر طراحي را به آن عناصر اضافه كنيد ، ويژگي هايي را براي ايجاد نشانه گذاري معنايي و در دسترس اضافه كنيد و رويدادها را به مؤلفه ها اضافه نماييد. سپس جاوا اسكريپت را با JSX خود تركيب كرديد تا كد تكراري را كاهش داده و عناصر را به طور مشروط نشان داده و مخفي كند.
      اين مبنايي است كه شما براي ساختن مولفه هاي آينده نياز داريد. با استفاده از تركيبي از JavaScript و HTML ، مي توانيد مولفه هاي پويا ايجاد كنيد كه قابل انعطاف باشند و به شما امكان مي دهد برنامه تان رشد و تغيير يابد.
      اگر مي خواهيد در مورد React اطلاعات بيشتري كسب كنيد ، از صفحه موضوع React ما ديدن كنيد.

       

    برچسب‌ها:Create React AppHTMLJavaScript,

    چگونه با JSX عناصر واقعي ايجاد كنيم

    در اين آموزش مي آموزيد كه چگونه عناصر را با JSX توصيف كنيد. JSX انتزاعي است كه به شما امكان مي دهد دستور مشابه HTML را در كد جاوا اسكريپت خود بنويسيد و شما را قادر ميسازد تا مولفه هاي React را كه شبيه علائم استاندارد HTML هستند ، بسازيد. JSX زبان تمپليت مولفه هاي React است و بنابراين پايه و اساس هر نشانه گذاري اي است كه React به برنامه شما ارائه مي دهد.
    از آنجايي كه JSX شما را قادر مي سازد جاوا اسكريپت را نيز در نشانه گذاري خود بنويسيد ، مي توانيد از توابع و روش هاي JavaScript ، از جمله نگاشت آرايه و ارزيابي اتصال كوتاه براي شرطي ها استفاده كنيد.
    به عنوان بخشي از آموزش ، رويدادهاي كليك را مستقيماً در نشانه گذاري روي دكمه ها ضبط مي كنيد و مواردي را مشاهده مي كنيد كه تركيب دقيقاً مطابق با HTML استاندارد نباشد ، مانند كلاس هاي CSS. در پايان اين آموزش ، يك برنامه كاري داريد كه از انواع مختلفي از ويژگيهاي JSX استفاده مي كند تا ليستي از مولفه هايي را كه داراي يك شنونده كليك داخلي هستند ، نمايش دهد. اين يك الگوي رايج در برنامه هاي React است كه شما اغلب در طول يادگيري چارچوب استفاده خواهيد كرد. همچنين مي توانيد عناصر استاندارد HTML را با جاوا اسكريپت مخلوط كنيد تا ببينيد چگونه React به شما امكان ايجاد كد هاي كوچك و قابل استفاده مجدد را مي دهد.
    پيش نيازها
    • به محيط توسعه در حال اجراي Node.js نياز داريد. اين آموزش بر روي Node.js نسخه 10.19.0 و npm نسخه 6.13.4 تست شده است. براي نصب اين برنامه در maغير مجاز مي باشد يا Ubuntu 18.04 ، مراحل نحوه نصب Node.js و ايجاد محيط توسعه محلي را در maغير مجاز مي باشد يا نصب با استفاده از بخش PPA در آموزش نحوه نصب Node.js در اوبونتو 18.04 را دنبال كنيد.
    • بايد با  Create React App قادر به ايجاد برنامه باشيد. مي توانيد دستورالعمل نصب را در نحوه ايجاد يك پروژه React با  Create React App پيدا كنيد.
    • همچنين به دانش پايه از JavaScript نياز خواهيد داشت كه مي توانيد در نحوه كدنويسي در JavaScript بياموزيد و به دانش پايه از HTML و CSS نيز احتياج داريد. يك منبع مناسب براي HTML و CSS ، شبكه توسعه دهنده Mozilla ميباشد.
    مرحله 1 – اضافه كردن نشانه گذاري به يك مولفه React
    همانطور كه قبلاً نيز اشاره شد ، React يك زبان نشانه گذاري خاص به نام JSX دارد. پ تركيبي از نحو HTML و JavaScript است كه چيزي شبيه به اين ميباشد:


    {inventory.filter(item => item.available).map(item => (

    {item.name}

    {item.price}


    ))
    }

    برخي از قابليت هاي JavaScript مانند .filter و .map و همچنين برخي HTML هاي استاندارد مانند

    را خواهيد شناخت. اما بخش هاي ديگري مانند و className نيز وجود دارند كه شبيهHTML و JavaScript به نظر مي رسد.
    اين زبان JSX است ، يعني زبان نشانه گذاري ويژه اي كه به مولفه هاي React حس HTML را با قدرت JavaScript مي دهد.
    در اين مرحله ، مي آموزيد كه تركيب HTML مانند پايه را به مولفه موجود React اضافه كنيد. براي شروع ، مولفه هاي HTML استاندارد را به يك تابع JavaScript اضافه خواهيد كرد ، سپس كد كامپايل شده را در يك مرورگر مشاهده مي كنيد. همچنين عناصر را گروه بندي مي كنيد تا React بتواند آنها را با حداقل نشانه گذاري كامپايل كند ، و HTML تميزي را ارائه كند.
    براي شروع ، يك پروژه جديد درست كنيد. در خط فرمان خود ، اسكريپت زير را اجرا كنيد تا يك پروژه تازه با استفاده از create-react-app نصب كنيد:
    ⦁ $ npx create-react-app jsx-tutorial

    پس از اتمام پروژه ، دايركتوري را تغيير دهيد:
    ⦁ $ cd jsx-tutorial

    در يك ترمينال يا پنجره جديد ، پروژه را با استفاده از اسكريپت شروع Create React App شروع كنيد. مرورگر بعد از تغييرات مجدداً ريفرش ميشود ، بنابراين در تمام مدت كار شما اين اسكريپت را رها ميكند:
    ⦁ $ npm start

    يك سرور مجازي محلي در حال اجرا دريافت خواهيد كرد. اگر پروژه در پنجره مرورگر باز نشد ، مي توانيد آن را در http: // localhost: 3000 / پيدا كنيد. اگر اين كار را از يك سرور مجازي از راه دور انجام مي دهيد ، آدرس http: // your_IP_address: 3000 خواهد بود.
    مرورگر شما با يك برنامه React به عنوان بخشي از Create React App لود مي شود.

    شما در حال ساخت مجموعه كاملاً جديدي از مولفه هاي سفارشي هستيد ، بنابراين بايد با پاك كردن برخي از كد هاي متن استاندارد شروع كنيد تا بتوانيد يك پروژه خالي داشته باشيد. براي شروع App.js ار در ويرايشگر متن باز كنيد. اين قسمت اصلي است كه به صفحه تزريق مي شود. همه مؤلفه ها از اينجا شروع مي شوند.
    در يك ترمينال جديد ، وارد پوشه پروژه شويد و src / App.js را با دستور زير باز كنيد:
    ⦁ $ nano src/App.js

    فايلي مانند اين را مشاهده خواهيد كرد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import logo from ‘./logo.svg’;
    import ‘./App.css’;

    function App() {
    return (



    ”logo”


    Edit src/App.js and save to reload.


    className=”App-link”
    href=”https://reactjs.org”
    target=”_blank”
    rel=”noopener noreferrer”
    >
    Learn React



    );
    }

    export default App;

    اكنون پس از عبارت بازگشت در تابع ، خط import logo from ‘./logo.svg و هر چيز ديگر را حذف كنيد. آن را به null تغيير دهيد. كد نهايي به شرح زير خواهد بود:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    function App() {
    return null;
    }

    export default App;

    ويرايشگر متن را ذخيره كرده و از آن خارج شويد.
    در آخر ، لوگو را حذف كنيد. در پنجره ترمينال دستور زير را تايپ كنيد:
    ⦁ $ rm src/logo.svg

    شما در برنامه خود از اين فايل SVG استفاده نخواهيد كرد و بايد هنگام كار ، فايل هاي بلااستفاده را حذف كنيد. بهتر است در طولاني مدت كد خود را سازماندهي كنيد.
    اكنون كه اين قسمت از پروژه شما حذف شده است ، مي توانيد به جستجو در جنبه هاي ديگر JSX بپردازيد. اين زبان نشانه گذاري توسط React كامپايل شده و در نهايت تبديل به HTML مي شود كه در يك صفحه وب مشاهده مي كنيد. بدون وارد شدن عميق داخلي React ، JSX را مي گيرد و الگويي از صفحه شما را ايجاد مي كند ، سپس عناصر لازم را ايجاد كرده و آنها را به صفحه اضافه مي كند.
    اين بدان معني است كه مي توانيد چيزي را بنويسيد كه شبيه HTML است و انتظار داشته باشيد كه HTML ارائه شده مشابه باشد. با اين حال ، چند مرحله وجود دارد.
    ابتدا ، اگر به سربرگ يا پنجره سرور مجازي خود نگاه كنيد ، اين را مشاهده خواهيد كرد
    Output

    ./src/App.js
    Line 1:8: ‘React’ is defined but never used no-unused-vars

    اين linter به شما مي گويد كه از كد React وارد شده استفاده نمي كنيد. هنگامي كه خط import React from ‘react’ را به كد خود اضافه مي كنيد ، كد JavaScript را وارد مي كنيد كه JSX را به React code تبديل مي كند. اگر JSX وجود نداشته باشد ، ديگر نيازي به ورودي نيست.
    بياييد با اضافه كردن مقدار كمي JSX اين مسئله را تغيير دهيم. با جايگزين كردن null با يك مثال hello, world شروع كنيد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    function App() {
    return

    Hello, World

    ;
    }

    export default App;

    فايل را ذخيره كنيد. اگر به ترمينال با سرور مجازي در حال اجرا نگاه كنيد ، پيام اخطار از بين خواهد رفت. اگر از مرورگر خود بازديد كنيد ، پيام را به عنوان مولفه h1 مشاهده خواهيد كرد.

    سپس ، در زير برچسب

    ، يك برچسب پاراگراف اضافه كنيد كه شامل رشته I am writing JSX است. كد به صورت زير خواهد بود:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    function App() {
    return(

    Hello, World


    I am writing JSX


    )
    }

    export default App;

    از آنجايي كه JSX چندين خط دارد ، نياز است عبارت در پرانتز قرار داده شود.
    فايل را ذخيره كنيد. هنگامي كه اين كار را كرديد، خطايي در اجراي سرور مجازي خود در ترمينال مشاهده مي كنيد:
    Output
    ./src/App.js
    Line 7:5: Parsing error: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>…?

    5 | return(
    6 |

    Hello, World


    > 7 |

    I am writing JSX


    | ^
    8 | )
    9 | }
    10 |

    وقتي JSX را از يك تابع يا عبارت باز مي گردانيد ، بايد يك مولفه واحد را برگردانيد. اين مولفه ممكن است بخش هاي لانه گزيده باشد ، اما اگر يك مولفه سطح بالا باشد. در اين حالت ، دو مولفه را بر مي گردانيد.
    fix يك تغيير كد جزيي است. با يك برچسب خالي كد را محصور كنيد. برچسب خالي يك مولفه HTML است كه هيچ كلمه اي ندارد. به اين شكل: <>
    به./src/App.js در ويرايشگر خود برويد و برچسب خالي را اضافه كنيد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    function App() {
    return(
    <>

    Hello, World


    I am writing JSX



    )
    }

    export default App;

    برچسب خالي يك مولفه واحد ايجاد مي كند ، اما وقتي كد كامپايل شد ، به نشانه گذاري نهايي اضافه نمي شود. اين كار باعث مي شود كدهاي شما در عين حال كه يك مولفه واحد به React مي دهند ، صحيح باقي بمانند.
    توجه: شما مي توانيد به جاي برچسب هاي خالي ، كد را با يك div محصور كنيد ، مادامي كه كد يك مولفه را برگرداند. در اين مثال ، يك برچسب خالي اين مزيت را دارد كه نشانه گذاري اضافي به خروجي تجزيه نشده اضافه نمي كند.

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

    اكنون JSX اساسي را به مؤلفه خود اضافه كرده ايد و ياد گرفته ايد كه چگونه بايد همه JSX در يك مؤلفه مستقر شود. در مرحله بعد ، يك ظاهر طراحي را به مؤلفه خود اضافه مي كنيد.
    مرحله 2 – اضافه كردن طراحي به يك مولفه به همراه ويژگي ها
    در اين مرحله ، به عناصر موجود در مؤلفه خود مي پردازيد تا ياد بگيريد كه چگونه ويژگي هاي HTML با JSX كار مي كنند. در React گزينه هاي بسياري براي طراحي وجود دارد. برخي از آنها شامل نوشتن CSS در جاوا اسكريپت است، بو رخي ديگر از پيش پردازنده استفاده مي كنند. در اين آموزش با كلاس هاي CSS و CSS وارد شده كار خواهيد كرد.
    اكنون كه كد خود را داريد ، وقت آن است كه يك ظاهر طراحي شده اضافه كنيد. App.css را در ويرايشگر متن خود باز كنيد:
    ⦁ $ nano src/App.css

    از آنجا كه شما با JSX جديد شروع مي كنيد ، CSS فعلي به عناصري اشاره مي كند كه ديگر وجود ندارند. از آنجا كه به CSS احتياج نداريد ، مي توانيد آن را حذف كنيد.
    پس از حذف كد ، فايلي خالي خواهيد داشت.
    در مرحله بعد ، مي توانيد طراحي به مركز متن اضافه كنيد. در src / App.css كد زير را اضافه كنيد:
    jsx-tutorial/src/App.css
    .container {
    display: flex;
    flex-direction: column;
    align-items: center;
    }

    در اين بلوك كد ، شما  CSS class selector را با نام .container ايجاد كرده ايد و از آن براي در مركز قرار دادن محتوا با استفاده از display: flex استفاده كرده ايد.
    فايل را ذخيره كرده و خارج شويد. مرورگر بروزرساني مي شود ، اما هيچ چيز تغيير نخواهد كرد. قبل از مشاهده تغيير ، بايد كلاس CSS را به مؤلفه React خود اضافه كنيد. كد JavaScript مولفه را انتخاب كنيد:
    ⦁ $ nano src/App.js

    كد CSS قبلاً با خط import ‘./App.css’ وارد شده است. اين بدان معني است كه webpack براي ساختن يك صفحه طراحي نهايي، كد را وارد مي كنند ، اما براي اعمال CSS روي عناصر خود ، بايد كلاس ها را اضافه كنيد.
    ابتدا ، در ويرايشگر متن ، برچسب هاي خالي ، <> را به

    تغيير دهيد.
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    function App() {
    return(


    Hello, World


    I am writing JSX



    )
    }

    export default App;

    در اين كد تگ هاي خالي – <> – را با برچسب هاي div جايگزين كرده ايد. تگ هاي خالي براي گروه بندي كد شما بدون اضافه كردن برچسب هاي اضافي مفيد هستند ، اما در اينجا شما بايد از div استفاده كنيد زيرا برچسب هاي خالي هيچ ويژگي HTML را نمي پذيرند.
    در مرحله بعد بايد نام كلاس را اضافه كنيد. اينجاست كه JSX شروع به واگرايي از HTML مي كند. اگر مي خواهيد يك كلاس را به يك مولفه HTML معمولي اضافه كنيد ، اين كار را اينگونه انجام مي دهيد:


    Copy

    اما از آنجا كه JSX جاوا اسكريپت است ، محدوديت هايي دارد. يكي از محدوديت ها اين است كه جاوا اسكريپت كلمات كليدي خود را رزرو كرده است. اين بدان معناست كه شما نمي توانيد از كلمات خاصي در هر كد JavaScript استفاده كنيد. به عنوان مثال ، شما نمي توانيد يك متغير به نام null ايجاد كنيد زيرا اين كلمه در حال حاضر محفوظ است.
    يكي از كلمات رزرو شده class است. React با كمي تغيير دادن اين كلمه كار خود را انجام ميدهد. به جاي اضافه كردن مشخصه class ، className را اضافه مي كنيد. به عنوان يك قاعده ، اگر يك مشخصه (attribute) همانطور كه انتظار مي رود كار نمي كند ، سعي كنيد نسخه camel case را اضافه كنيد. مشخصه ديگري كه كمي متفاوت است مشخصه for ميباشد كه براي برچسب ها استفاده ميكنيد. چند مورد ديگر نيز وجود دارد ، اما خوشبختانه اين ليست نسبتاً كوتاه است.
    توجه: در React ، مشخصه ها اغلب prps خوانده مي شوند. Props داده هايي هستند كه مي توانيد به ساير مؤلفه هاي سفارشي منتقل كنيد. آنها مشابه مشخصه ها هستند به جز اينكه با هيچ يك از مشخصات HTML مطابقت ندارند. در اين آموزش ، آنها را مشخصه مي ناميم زيرا عمدتا مانند مشخصه هاي استاندارد HTML استفاده مي شوند. اين امر آنها را از propهايي كه مانند مشخصه هاي HTML رفتار نمي كنند ، متمايز مي كند ، كه بعداً در اين مجموعه پوشش داده مي شود.

    اكنون كه مي دانيد چگونه از مشخصه calss در React استفاده مي شود ، مي توانيد كد خود را به روز كنيد تا طراحي ها را درج كنيد. در ويرايشگر متن خود ، className=”container” را به برچسب div اضافه كنيد
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    function App() {
    return(


    Hello, World


    I am writing JSX



    )
    }

    export default App;

    فايل را ذخيره كنيد. با انجام اين كار ، صفحه مجدد لودد مي شود و محتوا در مركز قرار مي گيرد ..

    ويژگي className در React بي نظير است. شما مي توانيد اكثر ويژگيهاي HTML را بدون هيچ تغييري به JSX اضافه كنيد. به عنوان نمونه ، به ويرايشگر متن خود برگرديد و شناسه greeting را به مولفه

    خود اضافه كنيد. مانند HTML استاندارد به نظر مي رسد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    function App() {
    return(


    Hello, World


    I am writing JSX



    )
    }

    export default App;

    صفحه را ذخيره كرده و مرورگر را مجدد لود كنيد. مشابه قبلي خواهد بود.
    تاكنون ، JSX به عنوان نشانه گذاري استاندارد به نظر مي رسيد ، اما مزيت JSX اين است كه حتي اگر شبيهHTML به نظر مي رسد ، قدرت جاوا اسكريپت را دارد. اين بدان معناست كه مي توانيد متغيرها را اختصاص دهيد و آنها را در مشخصه هاي خود ارجاع دهيد. براي ارجاع به يك مشخصه ، آن را به جاي نقل قولها در پرانتزهاي به شكل {} قرار دهيد.
    در ويرايشگر متن خود ، خطوط هايلايت شده زير را به عنوان يك مشخصه اضافه كنيد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    function App() {
    const greeting = “greeting”;
    return(


    Hello, World


    I am writing JSX



    )
    }

    export default App;

    در اين كد ، در بالاي عبارت return يك متغير به نام greeting با مقدار “greeting” ايجاد كرده ايد ، سپس متغير را در مشخصه id برچسب

    خود ارجاع داده ايد.
    فايل را ذخيره كنيد و از آن خارج شويد. صفحه همان خواهد بود، اما برچسب id خواهد داشت.

    تاكنون با چند مولفه به تنهايي كار كرده ايد ، اما مي توانيد از JSX همچنين براي اضافه كردن بسياري از عناصر HTML استفاده كرده و آنها را براي ايجاد صفحات پيچيده مستقر نماييد.
    براي نشان دادن اين موضوع ، مي توانيد با ليستي از ايموجي ها صفحه اي ايجاد كنيد. اين شكلك ها با يك مولفه









  • )
    }

    export default App;

    در اينجا شما براي نگه داشتن ليستي از ايموجي ها برچسب

      ايجاد كرده ايد. هر ايموجي در يك مولفه
    • جداگانه قرار دارد و با يك مولفه


    • onClick={event => alert(event.target.id)}
      >
      ????



    • onClick={event => alert(event.target.id)}
      >
      ????




    )
    }

    export default App;

    از آنجا كه اين JSX است ، onclick را به صورت camelCased درمي آوريد ، به اين معني كه آن را به صورت onClick اضافه كرده ايد. اين مشخصه onClick از يك تابع ناشناس براي بازيابي اطلاعات در مورد آيتمي كه كليك شده است استفاده مي كند.
    شما يك تابع فلش ناشناس اضافه كرديد كه اين رويداد را از روي دكمه كليك شده درياقن مي كند و رويداد داراي هدفي خواهد بود كه مولفه است. اطلاعات مورد نياز در مشخصه id است كه مي توانيد با event.target.id به آنها دسترسي پيدا كنيد. با تابع () alert مي توانيد هشدار را فعال كنيد.
    فايل را ذخيره كنيد. در مرورگر خود ، روي يكي از ايموجي ها كليك كرده و هشداري را به همراه نام دريافت خواهيد كرد.

    مي توانيد با يكبار اعلام تابع و انتقال آن به هر تابع onClick ، ​​ تكرار را كاهش دهيد. از آنجايي كه اين تابع به چيزي غير از ورودي و خروجي متكي نيست ، مي توانيد آن را خارج از تابع مؤلفه اصلي اعلام كنيد. به عبارت ديگر ، تابع نيازي به دسترسي به حوزه مولفه ندارد. مزيت جدا كردن آنها اين است كه تابع كامپوننت شما كمي كوتاه تر است و مي توانيد در صورت نياز بعدا تابع را به يك فايل جداگانه منتقل كنيد.
    در ويرايشگر متن خود ، تابعي به نام displayEmojiName ايجاد كنيد كه اين رويداد را بگيرد و تابع ()alert را با شناسه فراخواني كند. سپس تابع را به هر مشخصه onClick منتقل كنيد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    const displayEmojiName = event => alert(event.target.id);

    function App() {
    const greeting = “greeting”;
    return(


    Hello, World


    I am writing JSX




    • onClick={displayEmojiName}
      >
      ????



    • onClick={displayEmojiName}
      >
      ????



    • onClick={displayEmojiName}
      >
      ????




    )
    }

    export default App;

    فايل را ذخيره كنيد. در مرورگر خود ، روي emoji كليك كنيد و همان هشدار را مشاهده خواهيد كرد.
    در اين مرحله ، شما به هر مولفه رويدادهايي اضافه كرديد. همچنين ديديد كه چگونه JSX از اسامي كمي متفاوت براي رويدادهاي مولفه استفاده مي كند ، و با گرفتن تابع و استفاده مجدد از آن بر روي چندين مولفه ، شروع به نوشتن كد قابل استفاده مجدد كرديد. در مرحله بعد ، يك تابع قابل استفاده مجدد خواهيد نوشت كه به جاي نوشتن هر مولفه به صورت دستي، عناصر JSX را برمي گرداند. اين امر بيشتر باعث كاهش تكرار خواهد شد.
    مرحله 4 – نگاشت روي داده ها براي ايجاد عناصر
    در اين مرحله ، استفاده از JSX فراتر از نشانه گذاري ساده خواهد رفت. ياد مي گيريد كه آن را با جاوا اسكريپت تركيب كنيد تا نشانه گذاري پويا ايجاد كنيد كه كد را كوچك مي كند و خوانايي را بهبود مي بخشد. مي توانيد كد خود را در آرايه اي كه براي ايجاد عناصر HTML حلقه مي كنيد ، آناليز كنيد.
    JSX شما را به يك تركيب مشابه HTML محدود نمي كند. همچنين امكان استفاده مستقيم از JavaScript را در نشانه گذاري به شما مي دهد. اين كار را تا حدي با وارد كردن توابع به مشخصه ها امتحان كرده ايد. همچنين از متغيرها براي استفاده مجدد از داده ها استفاده كرده ايد. اكنون زمان آن رسيده كه JSX را مستقيماً از داده ها با استفاده از كد استاندارد JavaScript بسازيد.
    در ويرايشگر متن خود ، بايد آرايه اي از داده هاي ايموجي را در فايل src / App.js ايجاد كنيد. اگر بسته است ، فايل را مجدداً باز كنيد:
    ⦁ $ nano src/App.js

    آرايه اي را اضافه كنيد كه شامل آبجكت هاي داراي ايموجي و نام ايموجي باشد. توجه داشته باشيد كه ايموجي ها بايد با علامت نقل قول احاطه شوند. اين آرايه را فراتر از تابع app ايجاد كنيد:
    jsx-tutorial/src/App.js
    import React from ‘react’;
    import ‘./App.css’;

    const displayEmojiName = event => alert(event.target.id);
    const emojis = [
    {
    emoji: “????”,
    name: “grinning face”
    },
    {
    emoji: “????”,
    name: “party popper”
    },
    {
    emoji: “????”,
    name: “woman dancing”
    }
    ];

    function App() {

    }

    export default App;

    اكنون كه داده داريد مي توانيد از طريق آن حلقه بزنيد. براي استفاده از JavaScript در داخل JSX ، بايد آن را در پرانتز {} قرار دهيد. مشابه زماني است كه توابع را به مشخصه ها اضافه كرديد.
    براي ايجاد مؤلفه هاي React ، بايد داده ها را به عناصر JSX تبديل كنيد. براي انجام اين كار ، روي داده ها نگاشت مي كنيد و يك مولفه JSX را برمي گردانيد. چند نكته وجود دارد كه هنگام نوشتن كد بايد آنها را به خاطر بسپاريد.
    ابتدا ، يك گروه از آيتم ها بايد توسط يك كانتينر

    احاطه شوند. سپس ، هر آيتم به يك مشخصه خاص به نام key نياز دارد. Key نياز به يك سري داده منحصر به فرد دارد كه React مي تواند از آنها استفاده كند تا عناصر را رديابي كند و بداند چه موقع به روز رساني اين مؤلفه را انجام دهد. اين كليد از HTML كامپايل شده خارج مي شود ، زيرا فقط براي اهداف داخلي است. هر زمان كه با حلقه كار مي كنيد ، بايد يك رشته ساده را به عنوان كليد اضافه كنيد.
    در اينجا مثال ساده اي وجود دارد كه ليستي از نام ها را در يك
    نگاشت مي كند:

    const names = [
    “Atul Gawande”,
    “Stan Sakai”,
    “Barry Lopez”
    ];

    return(


    {names.map(name =>
    {name}
    )}

    )

    HTML حاصل از اين قرار است:


    Atul Gawande

    Stan Sakai

    Barry Lopez


    تبديل ليست ايموجي مشابه خواهد بود.

      كانتينر خواهد بود. روي داده ها نگاشت مي كنيد و
    • را با كليد نام كوتاه ايموجي برميگردانيد. شما داده هاي به سختي كد شده را در برچسب هاي

    • ))
      }


    )
    }
    export default App;
    Copy

    در اين كد ، شما بر روي آرايه emojis در برچسب

      نگاشت كرديد و
    • را برگردانديد. در هر
    • از نام ايموجي به عنوان مشخصه key استفاده كرده ايد. دكمه همان تابع عادي را خواهد داشت. در مولفه ، aria-label و id را با name جايگزين كنيد. محتواي برچسب بايد ايموجي باشد.
      فايل را ذخيره كنيد. پنجره شما ريفرش خواهد شد و داده ها را مشاهده خواهيد كرد. توجه كنيد كه كليد در HTML توليد شده وجود ندارد.

      تركيب JSX با استاندارد JavaScript ابزارهاي زيادي را در اختيار شما قرار مي دهد تا بصورت ديناميكي محتوا را ايجاد كنيد و مي توانيد از هر JavaScript استاندارد مورد نظر خود استفاده كنيد. در اين مرحله ، JSX سخت كد گذاري شده را با يك آرايه و يك حلقه جايگزين كرديد تا HTML به صورت پويا ايجاد شود. در مرحله بعد ، با استفاده از اتصال كوتاه ، اطلاعات را به صورت مشروط نشان مي دهيد.
      مرحله 5 – نمايش مشروط عناصر با اتصال كوتاه
      در اين مرحله ، از اتصال كوتاه براي نمايش مشروط عناصر HTML استفاده خواهيد كرد. اين كار به شما امكان مي دهد تا مؤلفه هايي ايجاد كنيد كه بتوانند HTML را بر اساس اطلاعات اضافي پنهان كند يا نشان دهد ، و به انعطاف پذيري مولفه هاي شما براي رسيدگي به موقعيت هاي مختلف مي پردازند.
      مواقعي وجود دارد كه شما براي نشان دادن اطلاعات در بعضي آيتم ها به مؤلفه نياز داريد و در آيتم هاي ديگر احتيج نيست. به عنوان مثال ، فقط در صورت صحت برخي موارد ممكن است بخواهيد براي كاربر پيام هشدار نشان دهيد ، يا ممكن است بخواهيد برخي از اطلاعات حساب را براي ادمين نمايش دهيد كه نمي خواهيد يك كاربر عادي آن را ببيند.
      براي اين كار از گردش كوتاه استفاده خواهيد كرد. اين بدان معناست كه شما از يك شرط استفاده خواهيد كرد و اگر قسمت اول صادق باشد ، اطلاعات را در قسمت دوم برمي گرداند.
      در اينجا يك مثال مطرح شده است. اگر مي خواهيد يك دكمه را فقط در صورت ورود كاربر به سيستم نشان دهيد ، اين مولفه را در پرانتز {} قرار دهيد و شرايط را قبل از آن اضافه مي كنيد.
      {isLoggedIn && }
      Copy

      در اين مثال ، شما در حال استفاده از عملگر && هستيد كه اگر همه چيز صادق باشد ، آخرين مقدار را به شما بازمي گرداند. در غير اين صورت ، false را برگردانده ، كه به React مي گويند هيچ نشانه گذاري اضافي را برنگرداند. اگر isLoggedIn صادق باشد ، React دكمه را نشان مي دهد. اگر isLoggedIn غلط باشد ، دكمه را نشان نمي دهد.
      براي امتحان كردن اين مسئله ، خطوط هايلايت شده زير را اضافه كنيد:
      jsx-tutorial/src/App.js
      import React from ‘react’;
      import ‘./App.css’;

      function App() {
      const greeting = “greeting”;
      const displayAction = false;
      return(


      Hello, World


      {displayAction &&

      I am writing JSX

      }




      )
      }

      export default App;

      در ويرايشگر متن خود متغيري به نام displayAction با مقدار false ايجاد كرده ايد. سپس برچسب

      را در {} قرار داديد. در شروع پرانتزها ، براي ايجاد شرط ، displayAction && را اضافه كرديد.
      فايل را ذخيره كنيد و خواهيد ديد كه مولفه در مرورگر شما ناپديد مي شود. مهم است بدانيد ، در HTML توليد شده نيز ظاهر نمي شود. اين مخفي كردن يك مولفه با CSS نيست. اصلاً در نشانه گذاري نهايي وجود نخواهد داشت.

      در حال حاضر مقدار displayAction سخت كدنويسي شده است ، اما مي توانيد آن مقدار را به عنوان حالت ذخيره كرده يا آن را به عنوان يك پايه در قسمت مولفه هاي بالاسري منتقل كنيد.
      در اين مرحله ياد گرفتيد كه چگونه عناصر را به صورت مشروط نشان دهيد. اين به شما امكان مي دهد تا مؤلفه هايي را تنظيم كنيد كه براساس اطلاعات ديگر قابل تنظيم هستند.
      نتيجه
      در اين آموزش ، يك برنامه سفارشي با JSX ايجاد كرديد. آموختيد كه چگونه عناصر HTML مانند، را به مولفه هاي خود اضافه كنيد ، يك ظاهر طراحي را به آن عناصر اضافه كنيد ، ويژگي هايي را براي ايجاد نشانه گذاري معنايي و در دسترس اضافه كنيد و رويدادها را به مؤلفه ها اضافه نماييد. سپس جاوا اسكريپت را با JSX خود تركيب كرديد تا كد تكراري را كاهش داده و عناصر را به طور مشروط نشان داده و مخفي كند.
      اين مبنايي است كه شما براي ساختن مولفه هاي آينده نياز داريد. با استفاده از تركيبي از JavaScript و HTML ، مي توانيد مولفه هاي پويا ايجاد كنيد كه قابل انعطاف باشند و به شما امكان مي دهد برنامه تان رشد و تغيير يابد.
      اگر مي خواهيد در مورد React اطلاعات بيشتري كسب كنيد ، از صفحه موضوع React ما ديدن كنيد.

       

    برچسب‌ها:Create React AppHTMLJavaScript,

    اجراي چندين نسخه PHP بر روي يك سرور Debian 10

    سرور مجازي وب Apache از هاست هاي مجازي براي مديريت دامنه هاي متعدد در يك مثال استفاده مي كند. به طور مشابه ، PHP-FPM از يك Daemon براي مديريت چندين نسخه PHP در يك نمونه واحد استفاده مي كند. مي توانيد از Apache و PHP-FPM با هم براي ميزباني چند برنامه وب PHP استفاده كنيد ، هر يك با استفاده از نسخه متفاوت PHP ، همه در يك سرور مجازي يكسان و همه به طور همزمان. اين كار از آن جهت مفيد است كه برنامه هاي مختلف ممكن است به نسخه هاي مختلف PHP نياز داشته باشند ، اما برخي از پشته هاي سرور مجازي ، مانند پشته LAMP كه به طور مرتب پيكربندي شده است ، فقط مي تواند يكي را مديريت كند. تركيب Apache با PHP-FPM نيز يك راه حل مقرون به صرفه تر نسبت به ميزباني هر برنامه به طور خاص است.
    PHP-FPM همچنين گزينه هاي پيكربندي براي ورود به سيستم stderr و stdout ، ريستارت اضطراري و spawning روند تطبيقي ​​را ارائه مي دهد ، كه براي سايت هاي داراي بار سنگين مفيد است. در حقيقت ، استفاده از Apache با PHP-FPM يكي از بهترين پشته ها براي ميزباني برنامه هاي PHP است ، به خصوص وقتي صحبت از عملكرد ميشود.
    در اين آموزش دو سايت PHP را به صورت يكجا تنظيم خواهيد كرد. هر سايت از دامنه خود استفاده مي كند و هر دامنه نسخه PHP خود را مستقر مي كند. اولي ، site1.your_domain ، PHP 7.0 را مستقر مي كند. دومي ، site2.your_domain ، PHP 7.2 را مستقر مي كند.
    پيش نيازها
    • يك سرور مجازي Debian 10 با حداقل 1 گيگابايت رم كه طبق راهنماي راه اندازي سرور مجازي اوليه با Debian 10تنظيم شده باشد و شامل كاربر sudo غير ريشه و فايروال تنظيم شده باشد.
    • سرور مجازي وب Apache كه با دنبال كردن نحوه نصب وب سرور مجازي Apache در Debian 10تنظيم و پيكربندي شده است.
    • نام دامنه تنظيم شده كه به سرور مجازي Debian 10 شما اشاره كند. براي اهداف اين آموزش ، ما از دو زير دامنه استفاده خواهيم كرد كه هر يك با يك ركورد A در تنظيمات DNS ما مشخص شده اند: site1.your_domain و site2.your_domain.
    مرحله 1 – نصب PHP نسخه هاي 7.0 و 7.2 با PHP-FPM
    با تكميل پيش نيازها، اكنون نسخه هاي PHP 7.0 و 7.2 و همچنين PHP-FPM و چندين پسوند اضافي را نصب خواهيد كرد. اما براي تحقق اين امر ، ابتدا بايد مخزن Sury php را به سيستم خود اضافه كنيد.
    ابتدا چندين بسته مورد نياز از جمله curl ، wget و gnupg2 را نصب كنيد:
    ⦁ $ sudo apt-get install curl wget gnupg2 ca-certificates lsb-release apt-transport-https -y

    بسته هاي فوق به شما امكان مي دهد تا به مخزن Sury php دسترسي پيدا كنيد و اين كار را با اطمينان انجام دهيد. sury php يك مخزن شخص ثالث يا PPA (بايگاني بسته هاي شخصي) است كه PHP 7.4 ، 7.3 ، 7.2 ، 7.1 و 7.0 را براي سيستم عامل Debian ارائه مي دهد. همچنين نسخه هاي به روز تر PHP را نسبت به مخازن رسمي Debian 10 ارائه مي دهد و به شما امكان مي دهد نسخه هاي مختلف PHP را روي همان سيستم نصب كنيد.
    سپس ، كليد بسته را وارد كنيد:
    ⦁ $ wget https://packages.sury.org/php/apt.gpg

    ⦁ $ sudo apt-key add apt.gpg

    اكنون مخزن Sury php را به سيستم خود اضافه كنيد:
    ⦁ $ echo “deb https://packages.sury.org/php/ $(lsb_release -sc) main” | sudo tee /etc/apt/sources.list.d/php7.list

    مخزن را به روز كنيد:
    ⦁ $ sudo apt-get update -y

    سپس ، php7.0 ، php7.0-fpm ، php7.0-mysql ، libapache2-mod-php7.0 و libapache2-mod-fcgid را با دستورات زير نصب كنيد:
    ⦁ php7.0 ابربسته اي است كه مي تواند براي اجراي برنامه هاي PHP استفاده شود.
    ⦁ php7.0-fpm مفسر مديريت سريع فرآيند را فراهم مي كند كه به عنوان يك Daemon اجرا مي شود و درخواست هاي سريع / CGI را دريافت مي كند.
    ⦁ php7.0-mysql PHP را به پايگاه داده MySQL متصل مي كند.
    ⦁ libapahce2-mod-php7.0 ماژول PHP را براي وب سرور مجازي Apache ارائه مي دهد.
    ⦁ libapache2-mod-fcgid شامل يك mod_fcgid است كه تعدادي از نمونه هاي برنامه CGI را براي رسيدگي به درخواست هاي همزمان شروع مي كند.
    حالا فرايند را براي نسخه PHP 7.2 تكرار كنيد. php7.2 ، php7.2-fpm ، php7.2-mysql و libapache2-mod-php7.2 را نصب كنيد.
    ⦁ $ sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 -y

    پس از نصب هر دو نسخه PHP ، سرويس php7.0-fpm را شروع كنيد:
    ⦁ $ sudo systemctl start php7.0-fpm

    بعد ، وضعيت سرويس php7.0-fpm را بررسي كنيد:
    ⦁ $ sudo systemctl status php7.0-fpm

    خروجي زير را مشاهده خواهيد كرد:
    Output
    ● php7.0-fpm.service – The PHP 7.0 FastCGI Process Manager
    Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)
    Active: active (running) since Sat 2020-04-04 08:51:47 UTC; 1min 17s ago
    Docs: man:php-fpm7.0(8)
    Main PID: 13016 (php-fpm7.0)
    Status: “Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec”
    Tasks: 3 (limit: 1149)
    Memory: 19.1M
    CGroup: /system.slice/php7.0-fpm.service
    ├─13016 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
    ├─13017 php-fpm: pool www
    └─13018 php-fpm: pool www

    Apr 04 08:51:47 debian10 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager…
    Apr 04 08:51:47 debian10 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.

    با تكرار اين روند ، اكنون سرويس php7.2-fpm را شروع كنيد:
    ⦁ $ sudo systemctl start php7.2-fpm

    و سپس وضعيت سرويس php7.2-fpm را بررسي كنيد:
    ⦁ $ sudo systemctl status php7.2-fpm

    خروجي زير را مشاهده خواهيد كرد:
    Output
    ● php7.2-fpm.service – The PHP 7.2 FastCGI Process Manager
    Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
    Active: active (running) since Sat 2020-04-04 08:52:52 UTC; 1min 32s ago
    Docs: man:php-fpm7.2(8)
    Process: 22207 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.2/fpm/pool.d/www.conf 72 (code=exite
    Main PID: 22204 (php-fpm7.2)
    Status: “Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec”
    Tasks: 3 (limit: 1149)
    Memory: 12.0M
    CGroup: /system.slice/php7.2-fpm.service
    ├─22204 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
    ├─22205 php-fpm: pool www
    └─22206 php-fpm: pool www

    Apr 04 08:52:52 debian10 systemd[1]: Starting The PHP 7.2 FastCGI Process Manager…
    Apr 04 08:52:52 debian10 systemd[1]: Started The PHP 7.2 FastCGI Process Manager.

    در آخر ، بايد چندين ماژول را فعال كنيد تا سرويس Apache2 شما بتواند با چندين نسخه PHP كار كند:
    ⦁ $ sudo a2enmod actions fcgid alias غير مجاز مي باشد_fcgi

    ⦁ actions براي اجراي اسكريپت هاي CGI بر اساس نوع رسانه يا روش درخواست استفاده مي شود.
    ⦁ fcgid يك جايگزين با كارايي بالا براي mod_cgi است كه تعداد كافي از نمونه هاي برنامه CGI را براي رسيدگي به درخواست هاي همزمان شروع مي كند.
    ⦁ alias براي نگاشت قسمت هاي مختلف سيستم فايل ميزبان در درخت سند و هدايت URL ارائه ميشود.
    ⦁ غير مجاز مي باشد_fcgi به Apache امكان مي دهد تا درخواست ها را به PHP-FPM ارسال كند.
    اكنون سرويس Apache را مجدداً راه اندازي كنيد تا تغييرات خود را اعمال كنيد:
    ⦁ $ sudo systemctl restart apache2

    در اين مرحله شما دو نسخه PHP را روي سرور مجازي خود نصب كرده ايد. در مرحله بعد ، براي هر وب سايتي كه مي خواهيد مستقر شويد ، يك ساختار دايركتوري ايجاد خواهيد كرد.
    مرحله 2 – ايجاد ساختارهاي ديركتوري براي هر دو وب سايت
    در اين بخش ، يك دايركتوري اصلي اسناد و صفحه فهرست براي هر دو وب سايت خود ايجاد مي كنيد.
    ابتدا دايركتوري هاي اصلي سند را براي site.your_domain و site2.your_domain ايجاد كنيد:
    ⦁ $ sudo mkdir /var/www/site1.your_domain

    ⦁ $ sudo mkdir /var/www/site2.your_domain

    به طور پيش فرض ، وب سرور مجازي Apache به عنوان يك كاربر www-data و گروه www-data به كار مي رود. براي اطمينان از مالكيت صحيح و مجوزهاي ديركتوري هاي root وب سايت خود ، دستورات زير را اجرا كنيد:
    ⦁ $ sudo chown -R www-data:www-data /var/www/site1.your_domain

    ⦁ $ sudo chown -R www-data:www-data /var/www/site2.your_domain

    ⦁ $ sudo chmod -R 755 /var/www/site1.your_domain

    ⦁ $ sudo chmod -R 755 /var/www/site2.your_domain

    در مرحله بعد يك فايل info.php را در داخل هر ديركتوري اصلي وب سايت ايجاد مي كنيد. با اين كار اطلاعات نسخه PHP هر وب سايت نمايش داده مي شود. با site1 شروع كنيد:
    ⦁ $ sudo nano /var/www/site1.your_domain/info.php

    خط زير را اضافه كنيد:
    /var/www/site1.your_domain/info.php

    فايل را ذخيره كنيد و ببنديد. اكنون فايل info.php كه در سايت2 ايجاد كرده ايد را كپي كنيد:
    ⦁ $ sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

    اكنون وب سرور مجازي شما بايد ديركتوري هاي ريشه اسناد را كه هر سايت براي ارائه اطلاعات به بازديد كنندگان نياز دارد در اختيار داشته باشد. در مرحله بعدي ، وب سرور مجازي Apache خود را پيكربندي خواهيد كرد تا با دو نسخه مختلف PHP كار كند.
    مرحله 3 – پيكربندي Apache براي هر دو وب سايت
    در اين بخش دو فايل پيكربندي ميزبان مجازي ايجاد خواهيد كرد. با اين كار دو وب سايت شما قادر خواهند بود همزمان با دو نسخه مختلف PHP كار كنند.
    براي اينكه Apache بتواند اين محتوا را ارائه دهد ، بايد يك فايل ميزبان مجازي با بخشنامه هاي صحيح ايجاد كنيد. به جاي تغيير فايل پيكربندي پيش فرض واقع در /etc/apache2/sites-available/000-default.conf ، دو فايل جديد را در ديركتوري / etc / apache2 / سايتهاي موجود ايجاد خواهيد كرد.
    ابتدا يك فايل پيكربندي ميزبان مجازي جديد براي وب سايت site1.your_domain ايجاد كنيد. در اينجا شما Apache را به ارائه محتوا با استفاده از php7.0 هدايت مي كنيد:
    ⦁ $ sudo nano /etc/apache2/sites-available/site1.your_domain.conf

    محتواي زير را اضافه كنيد. اطمينان حاصل كنيد كه مسير ديركتوري وب سايت ، نام سرور مجازي و نسخه PHP با تنظيمات شما مطابقت دارد:
    /etc/apache2/sites-available/site1.your_domain.conf


    ServerAdmin admin@site1.your_domain
    ServerName site1.your_domain
    DocumentRoot /var/www/site1.your_domain
    DirectoryIndex info.php


    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all


    # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
    SetHandler “غير مجاز مي باشد:unix:/run/php/php7.0-fpm.sock|fcgi://localhost”

    ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log
    CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined

    در اين فايل ، DocumentRoot را به دايركتوري جديد و ServerAdmin را به ايميلي كه ادمين سايت your_domain مي تواند به آن دسترسي داشته باشد ، به روز كرده ايد. همچنين ServerName را به روز كرده ايد ، كه دامنه پايه را براي اين پيكربندي ميزبان مجازي ايجاد مي كند ، و يك دستورالعمل SetHandler براي اجراي PHP به عنوان سرور مجازي فرآيند fastCGI اضافه كرده ايد.
    فايل را ذخيره كنيد و ببنديد.
    در مرحله بعدي ، يك فايل پيكربندي ميزبان مجازي جديد براي وب سايت site2.your_domain ايجاد كنيد. براي استقرار php7.2 اين زير دامنه را مشخص مي كنيد:
    ⦁ $ sudo nano /etc/apache2/sites-available/site2.your_domain.conf

    محتواي زير را اضافه كنيد. دوباره مطمئن شويد كه مسير ديركتوري وب سايت ، نام سرور مجازي و نسخه PHP با اطلاعات منحصر به فرد شما مطابقت دارد:
    /etc/apache2/sites-available/site2.your_domain.conf

    ServerAdmin admin@site2.your_domain
    ServerName site2.your_domain
    DocumentRoot /var/www/site2.your_domain
    DirectoryIndex info.php


    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all


    # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
    SetHandler “غير مجاز مي باشد:unix:/run/php/php7.2-fpm.sock|fcgi://localhost”

    ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log
    CustomLog ${APACHE_LOG_DIR}/site2.your_domain_access.log combined

    پس از اتمام فايل را ذخيره و ببنديد. سپس فايل پيكربندي Apache را براي هرگونه خطاي نحوي بررسي كنيد:
    ⦁ $ sudo apachectl configtest

    خروجي زير را مشاهده خواهيد كرد:
    Output
    Syntax OK
    سپس ، هر دو فايل پيكربندي ميزبان مجازي را فعال كنيد:
    ⦁ $ sudo a2ensite site1.your_domain

    ⦁ $ sudo a2ensite site2.your_domain

    اكنون سايت پيش فرض را غيرفعال كنيد ، زيرا به آن نياز نخواهيد داشت:
    ⦁ $ sudo a2dissite 000-default.conf

    در آخر ، سرويس Apache را مجدداً اجرا كنيد تا تغييرات خود را به اجرا درآوريد:
    ⦁ $ sudo systemctl restart apache2

    اكنون كه Apache را براي سرويس دهي به هر سايت پيكربندي كرده ايد ، آنها را آزمايش مي كنيد تا مطمئن شويد كه نسخه هاي مناسب PHP در حال اجرا هستند.
    مرحله 4 – آزمايش هر دو وب سايت
    در اين مرحله ، شما براي اجراي دو نسخه مختلف از PHP ، دو وب سايت پيكربندي كرده ايد. حالا نتايج را آزمايش كنيد.
    مرورگر وب خود را باز كنيد و از هر دو سايت http: //site1.your_domain و http: //site2.your_domain بازديد كنيد. دو صفحه را مشاهده خواهيد كرد كه به شكل زير است:

    عناوين را يادداشت كنيد. صفحه اول نشان مي دهد كه site1.your_domain نسخه 7.0 PHP را مستقر كرده است. دومي نشان مي دهد كه site2.your_domain نسخه 7.2 PHP را مستقر كرده است.
    اكنون كه سايت هاي خود را آزمايش كرده ايد ، فايل هاي info.php را حذف كنيد. از آنجا كه حاوي اطلاعات حساس در مورد سرور مجازي شما هستند و براي كاربران غيرمجاز قابل دسترس ميباشند ، يك تهديد امنيتي به حساب خواهند آمد. براي حذف هر دو فايل ، دستورات زير را اجرا كنيد:
    ⦁ $ sudo rm -rf /var/www/site1.your_domain/info.php

    ⦁ $ sudo rm -rf /var/www/site2.your_domain/info.php

    اكنون يك سرور مجازي Debian 10 منزوي داريد كه داراي دو وب سايت با دو نسخه مختلف PHP است. با اين حال PHP-FPM به اين يك برنامه محدود نمي شود.
    نتيجه
    اكنون ميزبان هاي مجازي و PHP-FPM را براي ارائه خدمات به چندين وب سايت و نسخه هاي مختلف PHP در يك سرور مجازي واحد تركيب كرده ايد. تنها محدوديت عملي روي تعداد سايت هاي PHP و نسخه هاي PHP كه سرويس Apache شما قادر به كنترل آن است قدرت پردازش نمونه شماست.
    از اينجا ممكن است به بررسي ويژگيهاي پيشرفته تر PHP-FPM بپردازيد ، مانند فرآيند spawning تطبيقي آن يا اينكه چگونه مي تواند sdtout و stderr را وارد كند. از طرف ديگر ، اكنون مي توانيد وب سايت هاي خود را ايمن كنيد. براي انجام اين كار ، مي توانيد آموزش ما در مورد چگونگي تأمين امنيت سايتهاي خود با مجوزهاي رايگان TLS / SSL را از Let’s Encrypt دنبال كنيد.

     

    برچسب‌ها:ApacheDaemonDebianDebian 10PHP-FPMPPAspawningsury php

    نصب و ايمن سازي phpMyAdmin در اوبونتو 18