Perfect Stack for WordPress

გამარჯობა, დღეს შევეცდები დავწერო ვორდპრესის იდეალურ სტეკზე.
სწორი ოპტიმიზაციის შემთხვევაში პატარა VPS – სერვერს შეუძლია საშუალოდ დღეში მინიმუმ 100 000 ვიზიტორის ატანა. წინასწარ გაფრთხილებთ რომ ეს დოკუმენტი არ არის დამწყებებისთვის და ცოტაოდენი ლინუქსის ცოდნა სასურველია, ასევე ამ ყველაფრისთვის დაგვჭირდება საშუალოდ 1 საათი, მოიმარჯვეთ ყავა და დავიწყოთ.

ასევე წინასწარ დავწერ რომ იდეების მოწოდებისთვის დიდ მადლობას ვუხდი Jack Lenox – ს Automattic-დან 🙂

ჩვენ დღეს გამოვიყენებთ Centos 7 – ს იმიტომ რომ სტაბილურია და ყველას ძალიან გვიყვარს. ( სტატიის წერის დროს Centos 8 გამოსული არ არის ჯერ და როდესაც დარელიზდება აუცილებლად გავაახლებ სტატიას )

პირველ რიგში დავიწყოთ ვებ სერვერით, ჩვენ არ გამოვიყენებთ Varnish-ს იმიტომ რომ ჩვენ შემთხვევაში უბრალოდ ზედმეტი თავის ტკივილია და მინიმუმ 10-20ms – ით შეგვინელებს საიტს. არც Fastcgi ქეშს არ გამოვიყენებთ იმ მარტივი მიზეზის გამო რომ ზედმეტად რთულად მეჩვენება და 1 პატარა VPS-ის გამო თავის აკტიება არ ღირს.

ჩვენ გამოვიყენებთ ჩვეულებრივ Nginx – ვებ სერვერს და Cache Enabler Plugin-ს რომლის საშუალებითაც საიტი მთლიანად დაიქეშება და დაგენერირდება HTML ფაილები. იმ შემთხვევაში თუ არ გამოვიყენებთ WP-ის ჩაშენებულ კომენტარებს და გადავალთ Facebook-ის კომენტარებზე საშუალოდ Cache – ს hit rate 95-98% – ს აღწევს. ეს იმას ნიშნავს რომ nginx-ის 98% request-ები უბრალო სტატიკური ფაილები იქნება და რასაც nginx – ძალიან მარტივად ართმევს თავს. ასევე nginx-ს დავაკონფიგურებთ ისე რომ პირდაპირ html ფაილებს მიაკითხავს და უმეტეს შემთხვევაში php-ს საერთოდ არ გაივლის რაც ძალიან შეგვიმსუბუქებს დატვირთვას სერვერზე.

რაც შეეხება მთლიან სტეკს საბოლოო ჯამში უნდა მივიღოთ –
Centos 7 + Nginx Mainline + PHP 7.3 + Opcache + Percona + Redis
ჩვენ ასევე გამოვიყენებთ – wp-cli, certbot, firewalld

ჩვენ ასევე დაგვჭირდება FQDN. მაგალითისთვის გამოვიყენებთ blog.rednet.ge – ს.

დავიწყოთ პორტების გახსნით. ( ყველა ბრძანებას ვუშვებთ root – მოხმარებლით )

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

შემდეგ დავაყენოთ პრერეკვიზიტები.

yum -y install epel-release
yum -y install yum-utils unzip wget certbot

შემდეგ დავაყენოთ ვებ სერვერი.

echo -e "[nginx-mainline]\nname=nginx mainline repo\nbaseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/\ngpgcheck=1\nenabled=1\ngpgkey=https://nginx.org/keys/nginx_signing.key" > /etc/yum.repos.d/nginx.repo
yum -y install nginx
systemctl enable nginx --now

შემდეგ ეტაპზე დავაყენოთ PHP. ჩვენ გამოვიყენებთ 7.3 ვერსიას რემის რეპოდან.

yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php73
yum -y groupinstall "PHP Support"
yum -y install php-opcache php-fpm
sed -i s'/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm.sock/' /etc/php-fpm.d/www.conf
sed -i s'/user = apache/user = nginx/' /etc/php-fpm.d/www.conf
sed -i s'/group = apache/group = nginx/' /etc/php-fpm.d/www.conf
sed -i s'/;session.save_path/session.save_path/' /etc/php.ini
systemctl enable php-fpm --now

აუცილებლად უნდა გავთიშოთ Selinux – php-fpm – ს სოკეტს ბლოკავს და რისი გარჩევის დროც სამწუხაროდ არ მაქვს
setenforce 0
და შევასწოროთ ფაილი /etc/selinux/config

შემდეგ დავაყენოთ Percona

yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release setup ps80
yum install percona-server-server
systemctl start mysql
grep password /var/log/mysqld.log

mysql_secure_installation

mysql -p

create database wordpress;
CREATE USER 'wordpress'@'localhost' IDENTIFIED WITH mysql_native_password BY 'DUrDxbMs$12312312asdzZXCasdU';
GRANT ALL ON wordpress.* TO 'wordpress'@'localhost';
quit;

შემდეგ დავაყენოთ wp-cli

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp

შემდეგ დავაყენოთ Redis ასევე Remi-ს რეპოდან ( Redis – პაროლით არ ვიცავთ იმიტომ რომ ფაირვოლის უკან დგას და გვეზარება )

yum -y --enablerepo=remi install redis
systemctl enable redis --now

შემდეგ ვაყენებთ WP-ს

mkdir /var/www/html/wordpress
chcon -t httpd_sys_rw_content_t /var/www/html/wordpress/
cd /var/www/html/wordpress
wp --allow-root core download
wp --allow-root core config --dbhost=localhost --dbname=yolo_ --dbuser=username --dbpass=password
wp --allow-root core install --url=yourwebsite.com --title="Your Blog Title" --admin_name=wordpress_admin --admin_password=YOLO123 --admin_email=you@example.com
wp --allow-root plugin install cache-enabler
wp --allow-root plugin install redis-cache
chown nginx:nginx -R /var/www/html/wordpress/

შეასწორეთ ფაილი /etc/nginx/nginx.conf და worker_processes გადაიყვანეთ auto – ზე.
შემდეგ წაშალეთ არსებული virtualhost

rm /etc/nginx/conf.d/default.conf

და შექმენით ახალი ფაილი
/etc/nginx.conf.d/wordpress.conf
example – https://paste2.org/KFsycvdU

ასევე ჩაასწორეთ ფაილი /etc/sysctl.conf და დაამატეთ შემდეგი

fs.file-max = 100000
#increase local ports
net.ipv4.ip_local_port_range = 1024 65535
#reduce the number of time_wait connections
#these 3 lines can reduce your time_wait count by several hundred percent.
#however you should not use the following lines in a NATed configuration.
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

შემდეგ დაარედაქტირეთ ფაილი /etc/security/limits.conf და დაამატეთ

* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
nginx       soft    nofile   65535
nginx       hard    nofile  65535

ასევე დაარედაქტირეთ wp-config.php და დაამატეთ

define('DISABLE_WP_CRON', true);

შემდეგ დაარედაქტირეთ crontab, crontab -e ბრძანებით და ჩაწერეთ
პ.ს: ვიცით რომ systemd timers – ჯობია მაგრამ გვეზარება.

*/10 * * * * curl https://blog.rednet.ge/wp-cron.php?doing_wp_cron > /dev/null 2>&1

გაგრძელება იქნება…

4 thoughts on “Perfect Stack for WordPress”

  1. ძალიან დიდი მადლობა. ველოდებით მომდევნო პოსტებს.

  2. შესანიშნავი პოსტია <3 ბევრი ახალი გავიგე

Leave a Reply

Your email address will not be published. Required fields are marked *