ლარაველის პროექტის სერვერზე გამართვა
Last updated
Last updated
და დგება ის მომენტი, როდესაც შენს აპლიკაციას სული უნდა შთაჰბერო, სერვერზე გამართო, დომენი მიაბა და -ზე შესვლა შენსგარდა სხვასაც შეეძლოს.
ჩვენ ვიცით ლოკალურად როგორ უნდა გავუშვათ დეველოპმენტ სერვერი: php artisan serve
და ეგ არი.
მაგრამ… პროდაქშენის სერვერზეც ვიზამთ მსგავსად?
ჰმმ.. კი შეგვიძლია. მაგრმ არ უნდა ვქნათ. ამაზე ოდნავ მერე.
პროდაქშენში უნდა გამოვიყენოთ სხვადასხვა ხელსასწყო იმისათვის, რომ სერვერზე ჩვენი აპლიკაცია საათვით მუშაობდეს. ამ ხელსაწყოებს წარმოადგენს nginx და php-fpm.
ეს ორი ხელსაწყო უზრუნველყოფს იმას, რომ ჩვენმა აპლიკაციამ ოპტიმალურად გამოიყენოს სერვერის რესურსი, გვაძლევს საშუალებას არაერთი აპლიკაცია გავმართოთ სერვერზე, გვქონდეს ქეშირება და ა.შ.
პირველ რიგში, როდესაც დავლოგინდებით სერვერზე საჭიროა, რომ გავუშვათ ბრძანება:
sudo apt update
ეს ბრძანება ფექიჯების შესახებ ინფორმაციას დაააფდეითებს სერვერზე იმისათვის, რომ შემდგომში sudo apt install something
-ს რომ გავუშვებთ, იცოდეს ეს something
საიდან გადმოწეროს.
შემდგომ გვჭირდება, რომ php-ის custom რეპოზიტორია დავამატოთ უბუნტუს package manager-ში, იმისათვის, რომ უახლესი php დავაინსტალიროთ.
გავუშვათ ბრძანება:
sudo add-apt-repository ppa:ondrej/php
შემდეგ კი დავაინსტალიროთ php-ის 8 ვერსია რამოდენიმე ექსთენშენთან ერთად:
sudo apt install php8.3 php8.3-curl php8.3-mbstring php8.3-xml php8.3-sqlite3 php8.3-zip
apt რეპოზიტორიის დამატების შემდგომ სტანდარტულად აპაჩეს ვებსერვერიც ყენდება, ჩვენ აპაჩე არ გვჭირდება და წავშალოთ სისტემიდან შემდეგი ბრძანებით:
sudo apt purge apache2
გარდა ამისა, რამოდენიმე დამატებითი ფექიჯიც, იმისათვის, რომ ამ ყველაფერმა გამართულად იმუშაოს:
sudo apt install zip sqlite3
ჩვენს home ფოლდერში შევქმნათ apps ფოლდერი სადაც გვექნება აპლიკაციები, რომელსაც ჩვენს სერვერზე გავმართავთ. შემდეგ შევიდეთ apps ფოლდერში და დავკლონოთ გიტჰაბიდან რეპოზიტორია:
cd ~
mkdir apps
cd apps
git clone https://github.com/my-app.git
თუ ვნახავთ apps ფოლდერის შიგთავსს, დავინახავთ, რომ გვაქვს ჩამოტვირთული ჩვენი პროექტი. შევიდეთ ჩვენს პროექტში და დავიწყოთ მისი გამართვა.
თუ ძველი პროექტია და ვიყენებთ webpack-ს vite-ის ნაცვლად, მომდევნო ბრძანებებში npm run build -ის ნაცვლად უნდა გავუშვად npm run prod
cd my-app
composer install
npm install
npm run build
cp .env.example .env
php artisan key:generate
php artisan storage:link
touch database/database.sqlite
ამ ქომანდების შემდეგ გვჭირდება, რომ .env ფაილი შევცვალოთ და sqlite დავაყენოთ ჩვენს ბაზად(სტანდარტულად mysql არის მონაცემთა ბაზის დრაივერი).
როდესაც .env -ს შევცვლით გავუშვათ შემდეგი ბრძანებები:
php artisan optimize
php artisan migrate
და ასევე ნებისმიერი ბრძანება, რაც ჩვენს პროექტს სჭირდება.
ჩვენ შეგვიძლია შევიდეთ ახლა ჩვენს პროექტში და გავუშვათ შედეგი ბრძანება:
cd ~/apps/my-app
sudo php artisan serve --host=0.0.0.0 --port=80
ამის შემდგომ თუ შევალთ ჩვენი სერვერის IP-ზე დავინახავთ ჩვენს პროექტს.
შესაბამისად php artisan serve
-ის გამოყენება პროდაქშენში სავსებით შესაძლებელია.
და, რატომ არ უნდა გამოვიყენოთ? მავანმა, ამ კითხვაზე შეიძლება პასუხების ვრცელი ნუსხა გაჩვენოთ, მაგრამ ჩვენ დავკონცენტრირდეთ მთავარ მომენტებზე რაც ჩვენს რეალობაშსთანაა შესაბამისობაში:
პირველი და მთავარი მიზეზი: PHP სტანდარტულად არ არის მრავალნაკადიანი(სრედიანი) ენა, რაც იმას ნიშნავს, რომ როდესაც php artisan serve
-ს ვუშვებთ ჩვენი პროექტი გაშვებულია მხოლოდ და მხოლოდ პროცესორის ერთ ნაკადზე.
წარმოიდგინეთ — გაქვთ არანორმალურად მძლავრი სერვერი, მაგალითისთვის ვთქვათ — 32 ნაკადიანი პროცესორით. ჩვენ თუ ამ სერვერზე php artisan serve
-ით გვექნება ჩვენი ლარაველის პროექტი გაშვებული გამოდის, რომ 32 ნაკადიდან მხოლოდ ერთს ვიყენებ. ეს იმასაც ნიშნავს, რომ სერვერი მომენტში მხოლოდ ერთ რექვესთს დაამუშავებს. და თუ ერთდროულად1-ის ნაცვლად 100 რექვესთი მიიღო — შესაბამისად დანარჩენი 99 რექვესთი რიგში უნდა ჩადგეს, რაც იმას ნიშნავს, რომ იქმნება bottleneck და მომხმარებელს უწევს ლოდინი სანამ საიტი ჩაეტვირთება.
ვერ დავაყენებთ SSL-ს რაიმე დამატებითი ხელსაწყოს გარეშე, როგორიცაა Nginx, Apache ან სერვისი მაგალითად — cloudflare.
ვერ გავუშვებთ სერვერზე ერთზე მეტ ვებგვერდს(ერთი და იმავე პორტზე).
ვერ გვექნება სწრაფი სტატიკური ფაილების serving-ი
ასევე სტატიკური ფაილების ქეშირება: Cache Control Policy
ეს მიზეზები საკმაოდ საკმარისია, იმისათვის, რომ ცოტა nginx-სა და php-fpm-სკენ გავიხედოთ.
რა ურთიერთ დამოკიდებულებაში არიან Nginx, PHP-FPM და Laravel- ი?
განვიხილოთ 2 ვარიანტი.
შემდეგ შვილი FPM პროცესი დაამუშავებს ამ რექვესთს: გააკეთებს მონაცემთა ბაზასთან კომუნიკაციას, ბლეიდით ააწყობს html-ს და ა.შ. და ბოლოს დააბრუნებს Response-ს უკან.
Master პროცესი პასუხს Nginx-ს დაუბრუნებს, ხოლო Nginx ბრაუზერს.
აქედან ვხედავთ, რომ რა პრობლემაც php artisan serve
-ს ჰქონდა, ეგ პრობლემა PHP FPM-ის შვილი პროცესებით არის მოგვარებული. გვაქვს დასტარტული ბევრი შევილი პროცესი და როგორც კი შემოვა რექვესთი, რომელი შვილი პროცესიც თავისუფალია მასთან ვამისამართებთ და ვამუშავებინებთ რექვესთს.
პირველრიგში უნდა დავაინსტალიროთ PHP FPM:
sudo apt install php8.3-fpm
სერვერზე შევიდეთ შემდეგ ფოლდერში:
cd /etc/php/8.3/fpm/pool.d
წავშალოთ სტანდარტული კონფიგურაცია:
rm www.conf
შევქმნათ ახალი ფაილი:
touch my-app.conf
და შიგნით ჩავწეროთ შემდეგი კონფიგურაცია:
შეინახეთ ფაილი და გადატვირთეთ fpm-ის პროცესი:
sudo systemctl restart php8.3-fpm.service
გადატვირთვისას შეიქმნებოდა unix-ის სოკეტი:
/run/php/php8.3-my-app-fpm.sock
პირველ რიგში დავინსტალიროთ nginx:
sudo apt install nginx
სერვერზე შევიდეთ შემდეგ ფოლდერში:
cd /etc/nginx/sites-enabled
წავშალოთ არსებული default კონფიგურაციის ფაილი:
sudo rm default
შევქმნათ ახალი კონფიგურაციის ფაილი:
touch my-app.ge
და შიგნით ჩავწეროთ შემდეგი კონფიგურაცია:
ასევე საჭიროა, რომ nginx-ის მომხმარებელს მივცეთ წვდომა ჩვენი მომხმარებლის ფოლდერებსა და ფაილებზე იმისათვის, რომ ჩვენი აპლიკაციის დამუშავებისათვის ჰქონდეს შესაბამისი უფლებები. ამისათვის გაუშვით ქვემოთ შემდეგი ორი ბრძანება:
იმისათვის, რომ LetsEncrypt-ის სერტიფიკატი დავაყენოთ ჩვენს საიტზე, საჭიროა, რომ რამოდენიმე ფექიჯი დავაინსტალიროთ:
sudo apt install certbot python3-certbot-nginx
შემდგომ გავუშვათ ბრძანება:
sudo certbot
და მივყვეთ certbot-ის ინსტრუქციებს.
ლარაველის პროექტის Production სერვერზე გასამართად ჩასატარებელია რიგი პროცედურები:
სერვერზე საჭირო ფექიჯების დაყენება
პროექტის ჩამოტვირთვა და შესაბამისი dependencies-ების დაინსტალირება
PHP FPM-ის კონფიგურაცია
Nginx-ის კონფიგურაცია
LetsEncrypt-ით SSL-ის დაყენება
აბა თქვენ იცით, ღმერთი თქვენსკენ 🙏
ამათ გარდა გვჭირდება კომპოუზერი და ნოუდიც. კომპოუზერის დაინსტალირებისთვის გავუშვათ შემდეგი ბრძანებები:
curl
| php
sudo mv composer.phar /usr/bin/composer
ნოუდისათვის კი:
curl
| sudo bash
sudo apt install nodejs
ვთქვათ, ვაგზავნით რექვესთს -ზე. სადაც blade-ით უნდა დაგენერირდეს მანქანების html სია და უნდა შეიცავდეს მანქანების შესახებ ინფორმაციას, რომელიც უნდა იქნას წამოღებული მონაცემთა ბაზიდან.
როდესაც ბრაუზერიდან გავაგზავნით რექვესთს,
პირველი რაც შეხვდება რექვესთს არის Nginx.
ვებსერვერი, ამ შემთხვევაში nginx ნახავს url-ს, სერვერზე თუ არსებობს მსგავსი ფაილი შეამოწმებს — ამ შემთხვევაში:
/home/user/apps/my-project/public/
cars/list
რაიმე ასეთი ფაილი თუ არსებობს. თუ ნახა, რომ არ არსებს Nginx ამ რექვესთს გადაამისამართებს PHP FPM-თან. შესაბამისად
მეორე რაც რექვეთს შეხვდება არის PHP FPM. არსებობს ერთი მთავარი PHP FPM პროცესი, რომელსაც ქვია Master Process და ამ მთავარი პროცესის გარდა არიან შვილი პროცესები — child processes.
მთავარი პროცესი ამენეჯებს შვილ პროცესებს და როდესაც რექვესთი შემოდის ერთ-ერთთან გადაამისამართებს.
ახლა განვიხილოთ მეორე ვარიანტი.
ვთქვათ, ვაგზავნით რექვესთს — ზე.
ამ შემთხვევაში Nginx შეამოწმებს რაიმე ფაილი თუ არსებობს შემდეგ მისამართზე: /home/user/my-project/public/
css/app.css
და თუ ნახავს, რომ ასეთი ფაილი არსებობს უკვე პირდაპირ ბრაუზერს თითონ გაუგზავნის ამ ფაილს და php-ს და ლარაველს საერთოდ აღარც შეეხება.