آرشیو فروردین ماه 1399

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

استفاده از سرور از راه دور 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

    تنظيم برنامه Node.js براي توليد در CentOS 7

    Node.js يك محيط زمان اجراي جاواسكريپت منبع باز است كه مي توانيد برنامه هاي شبكه و سرور مجازي را به راحتي بسازيد. اين پلتفرم روي لينوكس ، OS X ، FreeBSD و ويندوز اجرا مي شود و برنامه هاي آن به زبان JavaScript نوشته شده اند. برنامه هاي Node.js را مي توان در خط فرمان اجرا كرد اما ما به شما ياد مي دهيم كه چگونه آنها را به عنوان يك سرويس اجرا كنيد ، بنابراين به صورت خودكار در هنگام ريبوت يا خرابي مجدداً راه اندازي مي شوند ، و مي توانيد از آنها در يك محيط توليد استفاده كنيد.
    در اين آموزش ، تنظيم محيط Node.js آماده توليد را كه از دو سرور مجازي CentOS 7 تشكيل شده است ، پوشش خواهيم داد. يك سرور مجازي برنامه هاي Node.js را مديريت مي كند كه توسط PM2 اداره مي شود ، و ديگري دسترسي به برنامه را از طريق يك پروكسي معكوس Nginx به سرور مجازي برنامه فراهم مي كند.
    نسخه اوبونتو اين آموزش را مي توان در اين لينك پيدا كرد.
    پيش نيازها
    اين راهنما از دو سرور مجازي CentOS 7 با شبكه خصوصي (در يك مركز داده) استفاده مي كند. شبكه هاي خصوصي را مي توان در هنگام ايجاد (در بخش Select additional options) روي سرور مجازي هاي جديد پيكربندي كرد. با نامهاي زير را به آنها ميدهيم:
    app: سرور مجازي ي كه در آن Node.js ، برنامه Node.js و PM2 را نصب خواهيم كرد .
    web: سرور مجازيي كه در آن سرور مجازي وب Nginx را نصب خواهيم كرد ، كه به عنوان يك پروكسي معكوس براي برنامه شما عمل مي كند. كاربران براي دريافت برنامه Node.js شما به آدرس IP عمومي اين سرور مجازي دسترسي پيدا مي كنند.
    توجه: -گر قصد داريد از يك سرور مجازي موجود كه در حال حاضر شبكه هاي خصوصي پيكربندي شده ندارد ، استفاده كنيد، به مستندات vpsgol تحت عنوان نحوه فعال سازي شبكه خصوي روي دراپلت مراجعه كنيد .
    قبل از شروع اين راهنما ، بايد يك كاربر معمولي غير ريشه داشته باشيد كه داراي امتيازات sudo و روي هر دو سرور مجازي شما تنظيم شده باشد – اين همان كاربري است كه بايد با آن به سرور مجازي خود وارد شويد. با پيروي از راهنماي تنظيم اوليه سرور مجازي CentOS 7 مي توانيد نحوه پيكربندي يك حساب كاربري معمولي را ياد بگيريد.
    دستورات اجرا شده بر روي سرور مجازي app:
    ⦁ $ an_example_command_on_app

    دستورات اجرا شده بر روي سرور مجازي web:
    ⦁ $ an_example_command_on_web

    استفاده از يك سرور مجازي واحد براي اين آموزش امكان پذير است ، اما بايد در طول مسير چند تغيير ايجاد كنيد. هر جايي كه از آدرس IP خصوصي سرور مجازي app استفاده ميشود، به سادگي از آدرس IP localhost ، يعني 127.0.0.1 استفاده كنيد.
    در اينجا نموداري از تنظيمات شما پس از دنبال كردن اين آموزش آورده شده است:

    اگر مي خواهيد به جاي آدرس IP عمومي آن ، از طريق نام دامنه به سرور مجازي وب خود دسترسي پيدا كنيد ، يك نام دامنه خريداري كنيد و سپس اين آموزش ها را دنبال كنيد:
    • نحوه تنظيم نام ميزبان با vpsgol
    • چگونه از ثبت كنندگان دامنه به نام سرور مجازي vpsgol اشاره كنيم
    بياييد با نصب ران تايم Node.js در سرور مجازي app شروع كنيم.
    مرحله 1 – نصب Node.js
    آخرين نسخه LTS Node.js را بر روي سرور مجازي app نصب خواهيم كرد.
    با استفاده از كاربر معمولي و غير ريشه با امتيازات sudo به سرور مجازي app خود SSH كنيد.
    در سرور مجازي app ، اجازه دهيد براي دانلود فايل پيكربندي مخزن NodeSource RPM از Curl استفاده كنيم:
    ⦁ $ curl -L -o nodesource_setup.sh https://rpm.nodesource.com/setup_10.x

    CURL از پروتكل HTTPS براي دانلود اسكريپت ستاپ بر روي سرور مجازي شما استفاده مي كند ، و خروجي شامل اطلاعات مربوط به دانلود ميباشد:
    Output
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 11109 100 11109 0 0 70128 0 –:–:– –:–:– –:–:– 70757

    در مرحله بعد ، بايد محتواي اسكريپت را بازرسي كنيد. دستور زير اسكريپت راه اندازي NodeSource را در كنسول سرور مجازي هاي شما باز مي كند ، كه مي توانيد با استفاده از اسكريپت راه اندازي NodeSource (از مخزن Github توزيع هاي NodeSource) براي تأييد صحت اسكريپتي كه به درستي دانلود كرده است ، cross-reference انجام دهيد:
    ⦁ $ vi nodesource_setup.sh

    پس از رضايت از فايل ، با تايپ كردن: q از vi خارج شويد تا به خط فرمان بازگرديد.
    اكنون بياييد اسكريپت تنظيم را اجرا كنيم تا مخزن NodeSource RPM را نصب كنيم. اين كار ما را قادر مي سازد از داخل مدير بسته yum به مخزن NodeSource دسترسي پيدا كنيم:
    ⦁ $ sudo -E bash nodesource_setup.sh

    اسكريپت براي مرجع ما اطلاعات مربوط به ستاپ را صادر مي كند:
    Output
    ## Installing the NodeSource Node.js 10.x repo…

    ## Inspecting system…

    + rpm -q –whatprovides redhat-release || rpm -q –whatprovides centos-release || rpm -q –whatprovides cloudlinux-release || rpm -q –whatprovides sl-release
    + uname -m

    ## Confirming “el7-x86_64” is supported…

    + curl -sLf -o /dev/null ‘https://rpm.nodesource.com/pub_10.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm’

    ## Downloading release setup RPM…

    + mktemp
    + curl -sL -o ‘/tmp/tmp.2aCcULVx8n’ ‘https://rpm.nodesource.com/pub_10.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm’

    ## Installing release setup RPM…

    + rpm -i –nosignature –force ‘/tmp/tmp.2aCcULVx8n’

    ## Cleaning up…

    + rm -f ‘/tmp/tmp.2aCcULVx8n’

    ## Checking for existing installations…

    + rpm -qa ‘node|npm’ | grep -v nodesource

    ## Run `sudo yum install -y nodejs` to install Node.js 10.x and npm.
    ## You may also need development tools to build native addons:
    sudo yum install gcc-c++ make
    ## To install the Yarn package manager, run:
    curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
    sudo yum install yarn

    قبل از نصب Node.js مهم است كه تمام اطلاعات ذخيره شده از yum را پاك كنيد. پاك كردن حافظه نهان اطمينان حاصل خواهد كرد كه yum از اتصال شبكه براي دريافت Node.js از مخازن جديد NodeSource ما استفاده مي كند (كه از بروز هرگونه درگيري احتمالي ناشي از بسته هاي منسوخ شده جلوگيري مي كند):
    ⦁ $ sudo yum clean all

    در مرحله بعد همه ابرداده ها را براي repo هاي yum فعال شده دانلود و استفاده خواهيم كرد. اين كار اطمينان حاصل مي كند كه جستارهاي yum ما در اسرع وقت تكميل ميشوند:
    ⦁ $ sudo yum makecache fast

    براي كامپايل و نصب add-ons بومي از npm نيز بايد ابزارهاي ساخت را نصب كنيم:
    ⦁ $ sudo yum install -y gcc-c++ make

    اكنون مي توانيم آخرين نسخه بسته Node.js را نصب كنيم:
    ⦁ $ sudo yum install -y nodejs

    با بررسي نسخه خود با اين دستور ، تأييد كنيد كه Node نصب شده است:
    ⦁ $ node -v

    خروجي شما شماره نسخه شما را نشان مي دهد:
    اكنون ران تايم Node.js نصب شده است و آماده اجراي يك برنامه است. بياييد يك برنامه Node.js بنويسيم.
    مرحله 2 – ايجاد برنامه Node.js
    اكنون يك برنامه Hello World ايجاد خواهيم كرد كه به سادگي “Hello World” را به هر درخواست HTTP باز مي گرداند. اين يك برنامه نمونه است كه به شما در راه اندازي Node.js كمك مي كند ، كه مي توانيد برنامه خود را جايگزين آن كنيد فقط مطمئن شويد كه برنامه خود ر به گونه اي اصلاح كرده ايد كه به آدرس هاي IP و پورت هاي مناسب گوش دهيد.
    از آنجا كه مي خواهيم برنامه Node.js ما درخواستهايي را كه از سرور مجازي پروكسي معكوس (web) مي آيند ، ارائه كند ، ما از رابط شبكه خصوصي سرور مجازي app خود براي ارتباطات بين سرور مجازي استفاده خواهيم كرد. آدرس شبكه خصوصي سرور مجازي app خود را جستجو كنيد.
    اگر از يك دراپلت vpsgol به عنوان سرور مجازي خود استفاده مي كنيد ، مي توانيد آدرس IP خصوصي سرور مجازي را از طريق سرويس Metadata جستجو كنيد. در سرور مجازي app ، از دستور curl براي بازيابي آدرس IP استفاده كنيد:
    ⦁ $ curl -sw “n” http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address

    بهتر است خروجي (آدرس IP خصوصي) را كپي كنيد ، زيرا براي پيكربندي برنامه Node.js استفاده خواهد شد.
    در مرحله بعد ، برنامه Node.js خود را براي ويرايش ايجاد و باز كنيد. براي اين آموزش از vi براي ويرايش يك برنامه نمونه به نام hello.js استفاده خواهيم كرد:
    ⦁ $ vi hello.js

    كد زير را در فايل وارد كنيد و حتما آدرس IP خصوصي سرور مجازي app را براي هر دو مورد هايلايت شده APP_PRIVATE_IP_ADDRESS جايگزين كنيد. در صورت تمايل ، مي توانيد در هر دو مكان ، پورت هايلايت شده ، 8080 را جايگزين كنيد (حتما از پورت غير ادمين ، يعني 1024 يا بالاتر استفاده كنيد):
    hello.js
    var http = require(‘http’);
    http.createServer(function (req, res) {
    res.writeHead(200, {‘Content-Type’: ‘text/plain’});
    res.end(‘Hello Worldn’);
    }).listen(8080, ‘APP_PRIVATE_IP_ADDRESS’);
    console.log(‘Server running at http://APP_PRIVATE_IP_ADDRESS:8080/’);

    اكنون با فشار دادن ESC براي خروج از حالت –INSERT—فايل را ذخيره كنيد و از آن خارج شويد ، و پس از آن: wq را براي نوشتن و ترك برنامه در يك فرمان واحد وارد كنيد.
    اين برنامه Node.js به سادگي آدرس و پورت IP مشخص شده را دنبال مي دهد و “Hello World” را با يك كد موفقيت 200 HTTP برمي گرداند. بدان معنا كه برنامه فقط از سرور مجازي هاي همان شبكه خصوصي مانند سرور مجازي وب ما قابل دسترسي است.
    اگر مي خواهيد تست كنيد كه برنامه شما كار مي كند ، اين دستور node را روي سرور مجازي app اجرا كنيد:
    ⦁ $ node hello.js

    توجه: اجراي يك برنامه Node.js به اين روش ، دستورات اضافي را مسدود مي كند تا اينكه با فشار دادن CTRL + C ، برنامه بسته شود.

    اگر براي اولين بارآزمايش كنيم كه سرور مجازي web ما قادر به برقراري ارتباط با برنامه Node.js در app است ، مقدار زيادي از اشكال زدايي Nginx ذخيره مي شود.
    براي تست برنامه ، بخش ترمينال ديگري را باز كرده و به سرور مجازي web خود متصل شويد. از آنجا كه سرور مجازي web در همان شبكه خصوصي قرار دارد ، بايد بتواند با استفاده از curl به آدرس IP خصوصي سرور مجازي app برسد. حتماً در آدرس IP سرور مجازي app ، APP_PRIVATE_IP_ADDRESS و پورت را در صورت تغيير جايگزين كنيد:
    ⦁ $ curl http://APP_PRIVATE_IP_ADDRESS:8080

    اگر خروجي زير را مشاهده كنيد ، برنامه به درستي كار مي كند و آدرس و پورت IP مناسب را گوش مي دهد:
    Node Application Output
    Hello World

    اگر خروجي مناسب را نمي بينيد ، مطمئن شويد كه برنامه Node.js شما در حال اجرا است و براي گوش دادن به آدرس IP و درگاه مناسب پيكربندي شده است.
    در سرور مجازي app ، با فشار دادن CTRL + C ، برنامه را به اجبار ببنديد.
    مرحله 3 – نصب و استفاده از PM2
    اكنون PM2 را نصب خواهيم كرد كه يك مدير پروسه براي برنامه هاي Node.js است. PM2 روشي آسان براي مديريت و daemon كردن برنامه ها (اجراي آنها به عنوان يك سرويس) فراهم مي كند.
    ما براي نصب PM2 روي سرور مجازي app خود از ماژول هاي بسته بندي شده Node (NPM) استفاده خواهيم كرد كه در واقع يك مدير بسته براي ماژول هاي Node است كه با Node.js نصب مي كند. براي نصب PM2 از اين دستور استفاده كنيد:
    ⦁ $ sudo npm install pm2@latest -g

    ما چند كاربرد اصلي PM2 را پوشش خواهيم داد.
    اولين كاري كه بايد انجام دهيد اينست كه از دستور pm2 start براي اجراي برنامه خود ، hello.js ، در پس زمينه استفاده كنيد:
    ⦁ $ pm2 start hello.js

    اين كار همچنين برنامه شما را به ليست فرآيند PM2 اضافه مي كند ، كه با هر بار شروع برنامه، خروجي به بيرون ميفرستد:
    Output
    ┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
    │ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
    ├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
    │ hello │ 0 │ fork │ 30099 │ online │ 0 │ 0s │ 14.227 MB │ disabled │
    └──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘

    همانطور كه مشاهده مي كنيد ، PM2 بطور خودكار نام برنامه (بر اساس نام فايل ، بدون پسوند .js) و شناسه PM2 را اختصاص مي دهد. PM2 همچنين اطلاعات ديگري مانند PID روند ، وضعيت فعلي آن و استفاده از حافظه را نگه ميدارد.
    برنامه هايي كه تحت PM2 در حال اجرا هستند در صورت خراب شدن برنامه يا بسته شدن برنامه به صورت خودكار مجدداً راه اندازي مي شوند ، اما براي شروع برنامه (بوت يا ريبوت)، بايد يك گام ديگر انجام شود. خوشبختانه ، PM2 با فرمان startup  راهي آسان براي انجام اين كار فراهم مي كند.
    فرمان فرعي startup  براي راه اندازي PM2 و فرآيندهاي مديريت شده آن روي بوت هاي سرور مجازي ، يك اسكريپت راه اندازي ايجاد و پيكربندي مي كند. در مورد مثال ما ، بايد سيستم اوليه در حال اجرا كه systemd است را مشخص كنيد:
    ⦁ $ sudo pm2 startup systemd

    خروجي مانند زير را مشاهده خواهيد كرد ، كه نشان مي دهد سرويس PM2 نصب شده است:
    Output
    [PM2] Generating system init script in /etc/systemd/system/pm2.service
    [PM2] Making script booting at startup…
    [PM2] -systemd- Using the command:
    su root -c “pm2 dump && pm2 kill” && su root -c “systemctl daemon-reload && systemctl enable pm2 && systemctl start pm2”
    [PM2] Dumping processes
    [PM2] Stopping PM2…
    [PM2] All processes have been stopped and deleted
    [PM2] PM2 stopped
    [PM2] Done.

    براي اطمينان از اينكه PM2 مي داند از چه برنامه هايي براي شروع كار استفاده مي كند ، بايد ليست روند فعلي را ذخيره كنيم. براي ذخيره ليست:
    ⦁ $ pm2 save

    خروجي مانند زير را مشاهده خواهيد كرد ، كه نشان مي دهد ليست فرآيند PM2 ذخيره شده است:
    Output
    [PM2] Saving current process list…
    [PM2] Successfully saved in /home/deployer/.pm2/dump.pm2

    اكنون برنامه هاي مديريت شده PM2 شما بايد بطور خودكار در بوت شروع شوند.
    PM2 فرمان هاي فرعي زيادي را در اختيار شما قرار مي دهد تا بتوانيد اطلاعات مربوط به برنامه هاي خود را مديريت و جستجو كنيد. توجه داشته باشيد كه اجراي PM2 بدون هيچگونه آرگوماني ، صفحه راهنمايي شامل استفاده مثال را نمايش مي دهد كه استفاده از PM2 را با جزئيات بيشتر از اين بخش از آموزش پوشش مي دهد.
    يك برنامه را با اين دستور متوقف كنيد (نام برنامه يا شناسه PM2 برنامه را مشخص كنيد):
    ⦁ $ pm2 stop example

    برنامه را با اين دستور مجدداً راه اندازي كنيد (نام برنامه يا شناسه PM2 برنامه را مشخص كنيد):
    ⦁ $ pm2 restart example

    ليست برنامه هايي كه در حال حاضر توسط PM2 مديريت مي شوند را مي توان با فرمان فرعي list جستجو كرد:
    ⦁ $ pm2 list

    با استفاده از فرمان فرعي info مي توانيد اطلاعات بيشتري در مورد يك برنامه خاص را پيدا كنيد (نام يا شناسه برنامه PM2 را مشخص كنيد):
    ⦁ $ pm2 info example

    مانيتور فرآيند PM2 را مي توان با فرمان فرعي monit انجام داد. اين كار وضعيت برنامه ، CPU و استفاده از حافظه را نشان مي دهد:
    ⦁ $ pm2 monit

    توجه: اجراي دستور monit PM2 دستورات اضافي را مسدود مي كند تا برنامه با فشار دادن CTRL + C بسته شود.
    اكنون كه برنامه Node.js شما در حال اجرا و توسط PM مديريت مي شود، بياييد پروكسي معكوس را تنظيم كنيم.
    مرحله 4 – تنظيم سرور مجازي پروكسي معكوس Nginx
    اكنون كه برنامه شما در حال اجراست و يك آدرس IP خصوصي را شنود ميكنيد، بايد راهي براي دسترسي كاربران خود تنظيم كنيد. ما يك سرور مجازي وب Nginx را به عنوان يك پروكسي معكوس براي اين منظور تنظيم مي كنيم. اين آموزش يك سرور مجازي Nginx را از scratchتنظيم مي كند. اگر قبلاً تنظيمات سرور مجازي Nginx را انجام داده ايد ، مي توانيد فقط بلوك location را در بلوك سرور مجازي مورد نظر خود كپي كنيد (اطمينان حاصل كنيد كه location با هيچ بخشي از محتواي موجود سرور مجازي وب شما مغايرت نداشته باشد).
    در سرور مجازي web ، بياييد بسته epel-releaseرا با استفاده از yum نصب كنيم:
    ⦁ $ sudo yum install epel-release

    سپس Nginx را نصب كنيد:
    ⦁ $ sudo yum install nginx

    اكنون فايل پيكربندي Nginx را براي ويرايش باز كنيد:
    ⦁ $ sudo vi /etc/nginx/nginx.conf

    ابتدا خطي را كه server_name تعريف شده است ، در بلوك پيش فرض سرور مجازي پيدا كنيد. بايد چيزي شبيه به اين باشد:
    nginx.conf excerpt — server_name (before)
    server_name _;

    نام سرور مجازي را به روز كنيد تا زيرنويس (_) را با نام دامنه خود براي دستور server_name جايگزين كنيد (يا اگر آدرس دامنه نداريد آدرس IP را جايگزين كنيد).
    nginx.conf excerpt — server_name (after)
    server_name your-domain;

    سپس خطي را كه location/ تعريف شده است (معمولاً چند خط زير server_name) ، در همان بلوك پيش فرض سرور مجازي پيدا كنيد. بايد چيزي شبيه به اين باشد:
    nginx.conf excerpt — location / (before)
    location / {
    }

    آن را با بلوك كد زير جايگزين كنيد و مطمئن شويد آدرس IP خصوصي سرور مجازي app را جايگزين APP_PRIVATE_IP_ADDRESS كنيد. علاوه بر اين ، در صورت تنظيم برنامه براي گوش دادن به پورت هاي مختلف، پورت (8080) را تغيير دهيد:
    /etc/nginx/nginx.conf excerpt — location / (after)
    location / {
    غير مجاز مي باشد_pass http://APP_PRIVATE_IP_ADDRESS:8080;
    غير مجاز مي باشد_http_version 1.1;
    غير مجاز مي باشد_set_header Upgrade $http_upgrade;
    غير مجاز مي باشد_set_header Connection ‘upgrade’;
    غير مجاز مي باشد_set_header Host $host;
    غير مجاز مي باشد_cache_bypass $http_upgrade;
    }

    اين كار سرور مجازي web را پيكربندي مي كند تا به عنوان ريشه به درخواست ها پاسخ دهد. با فرض اينكه سرور مجازي ما در your-domain موجود است ، دسترسي به http://your-domain/ از طريق يك مرورگر وب ، درخواست را به آدرس IP خصوصي سرور مجازي app در پورت 8080 ارسال مي كند ، كه توسط Node.js دريافت و به آن پاسخ داده ميشود.
    براي دسترسي به ساير برنامه ها در همان سرور مجازي web ، مي توانيد بلوك هاي location بيشتري را به همان سرور مجازي اضافه كنيد. به عنوان مثال ، اگر برنامه node.js ديگري را در سرور مجازي app در پورت 8081 اجرا كرده ايد ، مي توانيد اين بلوك location را اضافه كنيد تا از طريق http: // your-domain / app2 به آن دسترسي داشته باشيد:
    Nginx Configuration — Additional Locations
    location /app2 {
    غير مجاز مي باشد_pass http://APP_PRIVATE_IP_ADDRESS:8081;
    غير مجاز مي باشد_http_version 1.1;
    غير مجاز مي باشد_set_header Upgrade $http_upgrade;
    غير مجاز مي باشد_set_header Connection ‘upgrade’;
    غير مجاز مي باشد_set_header Host $host;
    غير مجاز مي باشد_cache_bypass $http_upgrade;
    }

    پس از انجام ويرايش بلوك (هاي) مكان براي برنامه (هاي) خود ، آن را ذخيره كنيد با فشار دادن ESC از حالت –INSERT– ، خارج شويد ، به دنبال آن: wq را براي نوشتن و ترك كردن در يك فرمان واحد تايپ كنيد.
    در سرور مجازي وب ، Nginx را مجدداً راه اندازي كنيد:
    $ sudo systemctl start nginx

    سپس مي خواهيم اطمينان حاصل كنيم كه Nginx هر زمان كه سرور مجازي ريستارت شود ، اجرا خواهد شد:
    ⦁ $ sudo systemctl enable nginx

    دستور enable بايد خروجي زير را ارائه دهد
    Output
    Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

    همچنين با درخواست وضعيت آن از systemctl مي توانيد تأييد كنيد كه Nginx در حال اجرا و فعال است.
    ⦁ $ sudo systemctl status nginx

    دستور وضعيت اطلاعات پيكربندي را براي سرويس Nginx ارائه مي دهد
    Output
    ● nginx.service – The nginx HTTP and reverse غير مجاز مي باشد server
    Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
    Active: active (running) since Mon 2019-10-14 09:37:23 UTC; 3min 29s ago
    Main PID: 12818 (nginx)
    CGroup: /system.slice/nginx.service
    ├─12818 nginx: master process /usr/sbin/nginx
    └─12819 nginx: worker process

    Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 systemd[1]: Starting The nginx HTTP and reverse غير مجاز مي باشد server…
    Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 nginx[12814]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 nginx[12814]: nginx: configuration file /etc/nginx/nginx.conf test is successful
    Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 systemd[1]: Failed to read PID from file /run/nginx.pid: Invalid argument
    Oct 14 09:37:23 centos-s-1vcpu-1gb-sgp1-01 systemd[1]: Started The nginx HTTP and reverse غير مجاز مي باشد server.

    سرانجام ، امكان انتقال مجدد ترافيك از طريق لينوكس با امنيت بالا (SELinux) را به Nginx ارائه ميدهد. SELinux يك لايه امنيتي را فراهم مي كند كه كنترل دسترسي اجباري (MAC) را در هسته لينوكس پياده سازي مي كند. هر شيء سيستم عامل (پردازش ، توصيف كننده فايل ، فايل و غيره) با يك مفهوم SELinux برچسب گذاري شده است كه مجوزها و عملكردهايي را كه شي مي تواند انجام دهد ، مشخص مي كند.
    Nginx با متن httpd_t برچسب گذاري شده است و در نتيجه ، پيكربندي هايي دارد توسط SELinux مسدود شده است ، مگر اينكه صريحاً مجاز باشد. براي نشان دادن اين مسئله، دستور زير را اجرا كنيد تا تأييد كنيد كه سرويس Nginx داراي برچسب httpd_t است:
    ⦁ $ ps -eZ

    اين دستور اطلاعات مربوط به وضعيت فرآيند را ارائه مي دهد ، اطلاعات مربوط به فرآيند خاص Nginx را براي ديدن برچسب جستجو ميكند. شما httpd_t را به روشي مشابه زير مشاهده خواهيد كرد:
    Output

    system_u:system_r:httpd_t:s0 10208 ? 00:00:00 nginx
    system_u:system_r:httpd_t:s0 10209 ? 00:00:00 nginx

    اكنون بياييد وضعيت بولي هاي پيش فرض (متغير دو بايتي) مربوط به برچسب httpd_t SELinux را بررسي كنيم. مي توانيم با اجراي دستور زير اين اطلاعات را نشان دهيم:
    ⦁ $ $ getsebool -a

    براي اين آموزش فقط به بولي هاي مربوط به httpd علاقه مند هستيم:
    Output

    httpd_anon_write –> off
    httpd_builtin_scripting –> on
    httpd_can_check_spam –> off
    httpd_can_connect_ftp –> off
    httpd_can_connect_ldap –> off
    httpd_can_connect_mythtv –> off
    httpd_can_connect_zabbix –> off
    httpd_can_network_connect –> off
    httpd_can_network_connect_cobbler –> off
    httpd_can_network_connect_db –> off
    httpd_can_network_memcache –> off
    httpd_can_network_relay –> off
    httpd_can_sendmail –> off
    httpd_dbus_avahi –> off
    httpd_dbus_sssd –> off
    httpd_dontaudit_search_dirs –> off
    httpd_enable_cgi –> on
    httpd_enable_ftp_server –> off
    httpd_enable_homedirs –> off
    httpd_execmem –> off
    httpd_graceful_shutdown –> on
    httpd_manage_ipa –> off
    httpd_mod_auth_ntlm_winbind –> off
    httpd_mod_auth_pam –> off
    httpd_read_user_content –> off
    httpd_run_ipa –> off
    httpd_run_preupgrade –> off
    httpd_run_stickshift –> off
    httpd_serve_cobbler_files –> off
    httpd_setrlimit –> off
    httpd_ssi_exec –> off
    httpd_sys_script_anon_write –> off
    httpd_tmp_exec –> off
    httpd_tty_comm –> off
    httpd_unified –> off
    httpd_use_cifs –> off
    httpd_use_fusefs –> off
    httpd_use_gpg –> off
    httpd_use_nfs –> off
    httpd_use_openstack –> off
    httpd_use_sasl –> off
    httpd_verify_dns –> off

    اين دو بولي خاص ، httpd_can_network_connect و httpd_can_network_relay هستند. مستندات Redhat جزئيات مربوط به هر يك از بولي هاي httpd و عملكرد مرتبط با آنها را ارائه مي دهد (در صورتي كه تمايل به كسب اطلاعات بيشتر در مورد هر بولي داريد) ، اگرچه در زير توضيحات دو بولي كه مربوط به اين آموزش است آورده شده است:

    httpd_can_network_connect: When disabled, this Boolean prevents HTTP scripts and modules from initiating a connection to a network or remote port. Enable this Boolean to allow this access.
    httpd_can_network_relay: Enable this Boolean when httpd is being used as a forward or reverse غير مجاز مي باشد.

    از آنجا كه پيكربندي ما فقط ترافيك را رله مي كند ، فقط بايد به SELinux بگوييم كه سرور مجازي httpd ، در مورد ما Nginx ، مي تواند از شبكه براي رله ترافيك در پيكربندي پروكسي معكوسي كه تنظيم كرده ايم استفاده كند. ما از پرچم -P استفاده خواهيم كرد ، تا اطمينان حاصل شود كه تغييرات دائمي هستند (حذف اين پرچم منجر به بازگشت httpd_can_network_relay به حالت پيش فرض آن ، يعني خاموش ، با راه اندازي مجدد سرور مجازي خواهد شد):
    ⦁ $ sudo setsebool -P httpd_can_network_relay on

    با فرض اينكه برنامه Node.js شما در حال اجرا است ، و برنامه شما و تنظيمات Nginx صحيح هستند ، بايد بتوانيد از طريق پروكسي معكوس سرور مجازي web به برنامه خود دسترسي پيدا كنيد. با دسترسي به URL سرور مجازي web خود (آدرس IP عمومي يا نام دامنه) آن را امتحان كنيد.
    توجه: اگر همچنين قصد داشتيد از سرور مجازي web خود براي ميزباني سايتهاي ديگر (به عنوان ميزبان مجازي معمولي) استفاده كنيد ، لازم است كه httpd_can_network_connect را روشن كنيد.

    نتيجه
    اكنون برنامه Node.js شما در پس يك پروكسي معكوس Nginx در حال اجرا است. اين تنظيم پروكسي معكوس به اندازه كافي انعطاف پذير است تا دسترسي كاربران شما به ديگر برنامه ها يا محتواي وب استاتيك را كه مي خواهيد به اشتراك بگذاريد ، فراهم نمايد.
    همچنين اگر به دنبال انتقالات رمزگذاري شده بين سرور مجازي وب و كاربران خود هستيد ، در اينجا آموزشي مطرح شده است كه به شما كمك مي كند تا پشتيباني HTTPS (TLS / SSL) را تنظيم كنيد

     

    برچسب‌ها:CurlFreeBSDIPlocalhostNginxOS Xweb

    ايمن كردن Apache با Let’s Encrypt در Debian 10

    Let’s Encrypt يك مجوز صدور گواهينامه (CA) است كه روشي آسان براي به دست آوردن و نصب مجوزهاي رايگان TLS / SSL فراهم مي كند ، از اين طريق HTTPS رمزگذاري شده را روي سرورهاي وب فعال مي كند. در واقع با ارائه يك كلاينت نرم افزاري ، Certbot ، كه سعي در خودكارسازي اكثر مراحل لازم ميكند ، فرايند را ساده مي كند. در حال حاضر ، كل مراحل اخذ و نصب گواهينامه هم در Apache و هم در Nginx كاملا به صورت اتوماتيك انجام مي شود.
    در اين آموزش از Certbot براي دريافت گواهينامه رايگان SSL براي Apache روي Debian 10 استفاده مي كنيد و گواهي خود را براي تمديد خودكار تنظيم مي كنيد.
    در اين آموزش به جاي فايل پيكربندي پيش فرض از يك فايل ميزبان مجازي Apache جداگانه استفاده خواهد شد. توصيه مي كنيم براي هر دامنه فايل هاي جديد ميزبان مجازي Apache ايجاد كنيد زيرا اين امر به جلوگيري از اشتباهات رايج كمك مي كند و فايل هاي پيش فرض را به عنوان پيكربندي برگشت پذير حفظ مي كند.
    پيش نيازها
    براي دنبال كردن اين آموزش ، به موارد زير نياز داريد:
    • يك سرور Debian 10 كه با دنبال كردن راهنماي ستاپ اوليه سرور براي Debian 10 تنظيم شده و شامل يك كاربر غير root با امتيازات sudo و فايروال باشد.
    • نام دامنه كاملاً ثبت شده. در اين آموزش ، از your_domain به عنوان نمونه استفاده مي شود. مي توانيد نام دامنه را در Namecheap خريداري كنيد ، يكي از آنها را به صورت رايگان در Freenom دريافت كنيد ، يا از ثبت دامنه مورد نظر خود استفاده كنيد.
    • هر دو فايل DNS زير كه براي سرور شما تنظيم شده اند. براي انجام اين كار ، مي توانيد دستورالعمل هاي اضافه كردن دامنه ها و سپس دستورالعمل هاي ايجاد ركوردهاي DNS را دنبال كنيد.
    o يك ركورد A با your_domain كه به آدرس IP عمومي سرور شما اشاره كند.
    o يك ركورد A با www.your_domain كه به آدرس IP عمومي سرور شما اشاره كند.
    • Apache كه با دنبال كردن نحوه نصب Apache در Debian 10 نصب شده باشد. مطمئن شويد كه يك فايل ميزبان مجازي براي دامنه خود تنظيم كرده ايد. در اين آموزش از /etc/apache2/sites-available/your_domain.conf به عنوان نمونه استفاده مي شود.
    مرحله 1 – نصب Certbot
    اولين قدم براي استفاده از Let’s Encrypt جهت دريافت گواهينامه SSL ، نصب نرم افزار Certbot در سرور شماست.
    در حال حاضر ، Certbot به طور پيش فرض از مخازن نرم افزار Debian در دسترس نيست. براي دانلود نرم افزار با استفاده از apt ، بايد مخازن backport را به فايل Source.list خود اضافه كنيد كه apt به دنبال منابع بسته ميباشد. backport ها بسته هايي از تست دبيان و توزيع هاي ناپايدار هستند كه دوباره كامپايل مي شوند بنابراين بدون كتابخانه هاي جديد در توزيع هاي دبيان پايدار اجرا مي شوند.
    براي اضافه كردن مخزن backports ، فايل sources.list را در ديركتوري / etc / apt / خود باز كنيد (يا ايجاد كنيد):
    $ sudo nano /etc/apt/sources.list

    در انتهاي فايل خط زير را اضافه كنيد:
    /etc/apt/sources.list.d/sources.list
    . . .
    deb http://mirrors.vpsgol.com/debian buster-backports main
    deb-src http://mirrors.vpsgol.com/debian buster-backports main
    deb http://ftp.debian.org/debian buster-backports main

    شامل بسته هاي اصلي مي باشد كه سازگار با دستورالعمل هاي نرم افزار رايگان Debian (DFSG) و همچنين مولفه هاي non-free و contrib هستند كه خود يا مطابق DFSG نيستند و يا متعلقاتي در اين دسته دارند.
    فايل را با فشار دادن CTRL + X ، Y ، سپس enter ، ذخيره كرده و ببنديد ، سپس ليست بسته هاي خود را به روز كنيد:
    $ sudo apt update

    سپس Certbot را با دستور زير نصب كنيد. توجه داشته باشيد كه گزينه -t به apt ميگويد كه با جستجوي مخزن backports كه اخيراً اضافه كرديد به دنبال بسته باشد:
    $ sudo apt install python-certbot-apache -t buster-backports

    Certbot اكنون آماده استفاده است اما براي اينكه SSL براي Apache پيكربندي شود ، بايد تأييد كنيم كه Apache به درستي پيكربندي شده است.
    مرحله 2 – تنظيم گواهي SSL
    Certbot بايد بتواند ميزبان مجازي صحيح را در پيكربندي Apache شما پيدا كند تا SSL را به صورت خودكار پيكربندي كند. به طور خاص ، اين كار را با جستجوي يك دستورالعمل ServerName انجام مي دهد كه با دامنه اي مطابق است كه ميخواهيد براي آن مجوز بگيريد.
    اگر مرحله آموزش ميزبان مجازي را در آموزش نصب Apache دنبال كرديد ، بايد يك بلوك VirtualHost براي دامنه خود در /etc/apache2/sites-available/your_domain.conf با دستورالعمل ServerName كه قبلاً به طور مناسب تنظيم شده است، داشته باشيد.
    براي بررسي ، فايل ميزبان مجازي را براي دامنه خود با استفاده از nano يا ويرايشگر متن مورد علاقه خود باز كنيد:
    $ sudo nano /etc/apache2/sites-available/your_domain.conf

    خط ServerName موجود را پيدا كنيد. بايد مانند اين به نظر برسد و نام دامنه شما به جاي your_domain قرار بگيرد:
    /etc/apache2/sites-available/your_domain.conf

    ServerName your_domain;

    اگر قبلاً اين كار را انجام نداده ايد ، دستورالعمل ServerName را به روز كنيد تا به نام دامنه شما اشاره كنيد. سپس فايل را ذخيره كنيد ، از ويرايشگر خود خارج شويد و تركيب ويرايش هاي پيكربندي خود را تأييد كنيد:
    $ sudo apache2ctl configtest

    اگر خطايي در نحو وجود نداشته باشد ، آن را در خروجي خود مشاهده خواهيد كرد:
    Output
    Syntax OK

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

    Certbot اكنون مي تواند بلوك صحيح VirtualHost را پيدا كرده و آن را به روز كند.
    در مرحله بعد ، بياييد فايروال را به روز كنيم تا امكان ترافيك HTTPS را بدهيم.
    مرحله 3 – اجازه دادن به HTTPS از طريق فايروال
    اگر فايروال ufw را فعال كرده باشيد ، همانطور كه توسط راهنماهاي پيش نياز توصيه شده است ، براي تنظيم ترافيك HTTPS ، بايد تنظيماتي را انجام دهيد. خوشبختانه ، وقتي روي Debian نصب شده باشد ، ufw با چند پروفايل بسته بندي مي شود كه به ساده كردن روند تغيير قوانين فايروال براي ترافيك HTTP و HTTPS كمك مي كند.
    با تايپ دستور زير مي توانيد تنظيم فعلي را مشاهده كنيد:
    $ sudo ufw status

    اگر از مرحله 2 راهنماي ما در مورد چگونگي نصب Apache در Debian 10 استفاده كرده باشيد، خروجي دستور اينگونه خواهد بود ، نشان مي دهد كه فقط ترافيك HTTP به سرور وب مجاز است:
    Output
    Status: active

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

    براي اجزاه ترافيك HTTPS بيشتر، به پروفايل “WWW Full” مجوز بدهيد و بخش اضافي “WWW” را حذف كنيد:
    $ sudo ufw allow ‘WWW Full’

    $ sudo ufw delete allow ‘WWW’

    وضعيت شما اكنون بايد به اين شكل باشد:
    $ sudo ufw status

    Output
    Status: active

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

    سپس ، بياييد Certbot را اجرا كنيم و گواهينامه هايمان را دريافت كنيم.
    مرحله 4 – اخذ گواهينامه SSL
    Certbot روشهاي مختلفي براي گرفتن گواهينامه هاي SSL از طريق افزونه ها ارائه مي دهد. افزونه Apache از تنظيم مجدد Apache و بارگيري مجدد تنظيمات در صورت لزوم مراقبت خواهد كرد. براي استفاده از اين افزونه ، دستور زير را تايپ كنيد:
    $ sudo certbot –apache -d your_domain -d www.your_domain

    اين كار Certbot را با افزونه –apache با استفاده از -d براي مشخص كردن نام هايي كه معتبر آن هستند اجرا ميكند.
    اگر اين اولين بار است كه Certbot را اجرا ميكنيد ، از شما خواسته مي شود كه آدرس ايميل را وارد كنيد و با شرايط سرويس ها موافقت كنيد. علاوه بر اين ، از شما سؤال خواهد كرد كه آيا مي خواهيد آدرس ايميل خود را با بنياد الكترونيكي Frontier ، يك سازمان غيرانتفاعي كه از حقوق ديجيتال دفاع مي كند و همچنين سازنده Certbot است به اشتراك بگذاريد يا خير. براي اشتراك آدرس ايميل Y و براي رد اين اعلان N را وارد كنيد.
    بعد از انجام اين كار ، certbot با سرور Let’S Encrypt ارتباط برقرار مي كند ، سپس براي تأييد اينكه دامنه مورد نظر خود را كنترل مي كنيد ، يك چالش اجرا كنيد.
    اگر موفقيت آميز باشد ، certbot از شما مي پرسد كه چگونه مي خواهيد تنظيمات HTTPS خود را پيكربندي كنيد:
    Output
    Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
    ——————————————————————————-
    1: No redirect – Make no further changes to the webserver configuration.
    2: Redirect – Make all requests redirect to secure HTTPS access. Choose this for
    new sites, or if you’re confident your site works on HTTPS. You can undo this
    change by editing your web server’s configuration.
    ——————————————————————————-
    Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):

    گزينه خود را انتخاب كنيد و سپس ENTER بزنيد. پيكربندي به طور خودكار به روز مي شود ، و Apache براي انتخاب تنظيمات جديد مجدد لود مي شود. certbot با پيغامي همراه خواهد بود كه به شما مي گويد روند موفقيت آميز بوده و گواهي نامه هاي شما در كجا ذخيره شده است:
    Output
    IMPORTANT NOTES:
    – Congratulations! Your certificate and chain have been saved at:
    /etc/letsencrypt/live/your_domain/fullchain.pem
    Your key file has been saved at:
    /etc/letsencrypt/live/your_domain/privkey.pem
    Your cert will expire on 2019-10-20. To obtain a new or tweaked
    version of this certificate in the future, simply run certbot again
    with the “certonly” option. To non-interactively renew *all* of
    your certificates, run “certbot renew”
    – Your account credentials have been saved in your Certbot
    configuration directory at /etc/letsencrypt. You should make a
    secure backup of this folder now. This configuration directory will
    also contain certificates and private keys obtained by Certbot so
    making regular backups of this folder is ideal.
    – If you like Certbot, please consider supporting our work by:

    Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le

    گواهينامه هاي شما دانلود ، نصب و لود مي شوند. سعي كنيد وب سايت خود را با استفاده از https: // مجدد لود كنيد و به نشانگر امنيتي مرورگر خود توجه كنيد. بايد نشان دهد كه سايت به طور صحيح ايمن است ، معمولاً با نماد قفل سبز انجام ميشود. اگر سرور خود را با استفاده از SSL Labs Server Test آزمايش كنيد ، درجه A دريافت مي كند.
    بياييد با آزمايش روند تجديد كار را به پايان برسانيم.
    مرحله 5 – تأييد تمديد خودكار Certbot
    گواهي هاي Let’s Encrypt فقط براي نود روز اعتبار دارند. اين امر براي ترغيب كاربران به اتوماسيون كردن فرايند تجديد گواهينامه ميباشد. بسته certbot كه نصب كرديم با اضافه كردن يك اسكريپت تجديد به /etc/cron.d از اين امر مراقبت مي كند. اين اسكريپت روزانه دو بار اجرا مي شود و به طور خودكار هر مدركي را كه كمتر از سي روز از انقضاي آن مانده ، تمديد مي كند.
    براي آزمايش فرايند تجديد ، مي توانيد با استفاده از certbot اين دستور را اجرا كنيد:
    $ sudo certbot renew –dry-run

    اگر خطايي نمي بينيد ، همه تنظيمات انجام شده است. در صورت لزوم ، Certbot گواهي هاي شما را تمديد كرده و Apache را مجدد لود مي كند تا تغييرات را اعمال كند. اگر فرايند تمديد خودكار زماني از كار نافتد ، Let’s Encrypt پيامي را به ايميلي كه مشخص كرده ايد ، ارسال مي كند و به شما هشدار مي دهيد كه گواهي شما رو به پايان است.
    نتيجه
    در اين آموزش ، كلاينت lets Encrypt certbot را نصب كرديد ، گواهينامه هاي SSL را براي دامنه خود دانلود كرديد ، Apache را براي استفاده از اين گواهينامه ها پيكربندي كرده و تمديد خودكار گواهي نامه را فعال نموديد. اگر سؤال ديگري در مورد استفاده از Certbot داريد ، مراجعه به مطالب مربوطه آنها توصيه ميشود.

     

    برچسب‌ها:CertbotDFSGnon-freeroot