.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) را تنظيم كنيد