কম্পিউটার টিউটোরিয়াল

হাই পারফরম্যান্স NGINX এবং PHP-FPM ওয়েব সার্ভার কনফিগারেশন

PHP-FPM (Fast Process Manager) PHP স্ক্রিপ্ট চালানোর জন্য FastCGI-এর একটি পৃথক ইমপ্লিমেন্টেশন। আপনি NGINX ওয়েব সার্ভার (স্ট্যাটিক প্রসেসিং) এবং PHP-FPM-এর সংমিশ্রণ ব্যবহার করে LAMP স্ট্যাকের (NGINX, Apache এবং mod_php মডিউল) চেয়ে দ্রুত এবং হাই পারফরম্যান্স ওয়েব সার্ভার তৈরি করতে পারেন আপনার ওয়েবসাইটের জন্য।

LEMP হলো একটি ওপেন-सোর্স সফটওয়্যার টুলসেট যা সাধারণত ওয়েবসাইট হোস্টিং এবং ওয়েব অ্যাপ্লিকেশন পাবলিশ করার জন্য একসাথে ইনস্টল করা হয়। এই সংক্ষিপ্তরূপ означа করে: OS Linux, Nginx ওয়েব সার্ভার (এটি আরও জনপ্রিয় LAMP স্ট্যাকের Apache-কে প্রতিস্থাপন করে), MySQL (MariaDB) ডাটাবেস এবং php ডাইনামিক ডেটা প্রসেস করার জন্য।

এই আর্টিকেলে আমরা দেখব কীভাবে Linux CentOS 7-এ চালিত একটি সার্ভারে হাই-লোড ওয়েব প্রজেক্ট হোস্ট করার জন্য LEMP স্ট্যাক (NGINX + PHP-FPM + MariaDB/MySQL) ইনস্টল এবং অপ্টিমাইজ করা যায়।

Nginx ইনস্টল এবং ওয়েব সার্ভার হিসেবে কনফিগার করুন

যেহেতু একটি নতুন ইনস্টল করা CentOS সার্ভার ইনস্টলেশনের জন্য ব্যবহৃত হচ্ছে, জনপ্রিয় EPEL রিপোজিটরি সংযুক্ত করুন এবং সার্ভারে সকল প্যাকেজ আপডেট করুন।

# yum install epel-release -y
# yum update -y

সর্বশেষ Nginx সংস্করণ ইনস্টল করতে, ডেভেলপার রিপোজিটরি এই কমান্ড চালা দিয়ে সংযুক্ত করুন:

# rpm -Uvh https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

অথবা ম্যানুয়ালি রিপোজিটরি কনফিগারেশন ফাইল তৈরি করুন (/etc/yum.repos.d/nginx.repo)। ফাইলে নিচের লাইনগুলো যোগ করুন:

[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

আপনি যদি CentOS 8 ব্যবহার করেন, তবে URL-এ সংস্করণ পরিবর্তন করুন।

yum (বা dnf) প্যাকেজ ম্যানেজার ব্যবহার করে Nginx ওয়েব সার্ভার প্যাকেজ ইনস্টল করুন:

# yum install nginx -y

তারপর nginx চালু করুন এবং systemctl ব্যবহার করে স্টার্টআপে যোগ করুন:

# systemctl start nginx
# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service

ওয়েব সার্ভার চলছে কিনা চেক করতে, আপনার ব্রাউজারে সার্ভার IP ঠিকানা খুলুন।

আপনি যদি এই টেস্ট পেজ না দেখেন, তবে আপনার সার্ভারে firewalld-এ অনুমোদিত সার্ভিস, পোর্ট এবং зোন সেটিংস চেক করুন।

একটি পৃথক ডোমেন woshub-linux.com এর জন্য একটি কনফিগারেশন ফাইল তৈরি করুন। সাইট এবং কনফিগারেশন ফাইলের জন্য আলাদা ডিরেক্টরি তৈরি করুন:

# mkdir -p /var/www/woshub-linux.com && mkdir -p /var/www/woshub-linux.com/log

কনফিগারেশন ফাইল খুলুন:

# nano /etc/nginx/conf.d/woshub-linux.com.conf

এবং এতে নিচের কন্টেন্ট যোগ করুন:

server {
    listen 80;
    server_name woshub-linux.com;
    root /var/www/woshub-linux.com;
    index index.php index.html index.htm;
    access_log /var/www/woshub-linux.com/log/access.log main;
    error_log /var/www/woshub-linux.com/log/error.log;
    location / {
        return 301 https://woshub-linux.com$request_uri;
    }
    location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
        return 301 https://woshub-linux.com$request_uri;
    }
    location ~ \.php$ {
        return 301 https://woshub-linux.com$request_uri;
    }
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    location = /robots.txt {
        rewrite ^ /robots.txt break;
        allow all;
        log_not_found off;
        access_log off;
    }
    location ~ /\.ht {
        deny all;
    }
}
server {
    listen 80;
    server_name www.woshub-linux.com;
    rewrite ^ https://woshub-linux.com$request_uri? permanent;
}
server {
    listen 443 ssl http2;
    server_name woshub-linux.com;
    root /var/www/woshub-linux.com;
    index index.php index.html index.htm;
    access_log /var/www/woshub-linux.com/log/ssl-access.log main;
    error_log /var/www/woshub-linux.com/log/ssl-error.log;
    keepalive_timeout 60;
    ssl_certificate /etc/letsencrypt/live/woshub-linux.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/woshub-linux.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    add_header Strict-Transport-Security 'max-age=604800';
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
        access_log off;
        expires max;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param DOCUMENT_ROOT /var/www/woshub-linux.com;
        fastcgi_param SCRIPT_FILENAME /var/www/woshub-linux.com/$fastcgi_script_name;
        fastcgi_param PATH_TRANSLATED /var/www/woshub-linux.com/$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_param HTTPS on;
        fastcgi_intercept_errors on;
        fastcgi_ignore_client_abort off;
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 180;
        fastcgi_read_timeout 180;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    location ~ /\.ht {
        deny all;
    }
}
server {
    listen 443 ssl http2;
    server_name www.woshub-linux.com;
    rewrite ^ https://woshub-linux.com$request_uri? permanent;
}

কনফিগারেশন ফাইলটি সিকিউর HTTP প্রোটোকল অ্যাক্সেসের সেটিংস ধারণ করে কারণ অনেক জনপ্রিয় CMS ডিফল্টভাবে এটি ব্যবহার করে। পরবর্তীতে আপনি ফ্রি Let's Encrypt সার্টিফিকেট ইনস্টল এবং কনফিগার করতে পারেন (যদি আমরা Windows Server-এ IIS-এ ওয়েবসাইটের জন্য Let's Encrypt সার্টিফিকেট ইনস্টল করেছিলাম)।

PHP-FPM ইনস্টল করুন

Nginx-এ বিল্ট-ইন PHP হ্যান্ডলার নেই, তাই আমাদের php-fpm এবং কিছু PHP মডিউল ইনস্টল করতে হবে PHP স্ক্রিপ্ট প্রসেস করার জন্য।

Php-fpm হলো একটি সহজ এবং দ্রুত PHP প্রসেস ম্যানেজার। এটি HTTP প্রোটোকল ব্যবহার করে না (Apache-এর মত) এবং একটি বিশেষ FastCGI প্রোটোকলের সাথে কাজ করে। একটি হালকা এবং ব্যবহারে সহজ FPM PHP রিকোয়েস্ট দ্রুত প্রসেস করে। একই সাথে, Apache কনফিগারেশনের তুলনায়, এটি কম মেমরি ব্যবহার করবে।

তার পক্ষ থেকে, Nginx স্ট্যাটিক আরও দক্ষতার সাথে রিটার্ন করে। আমাদের কনফিগারেশনে nginx হবে একটি প্রক্সি সার্ভার (একটি ক্যাশিং এবং ফ্রন্ট-এন্ড সার্ভার) এবং php-fpm ব্যাক-এন্ড হিসেবে কাজ করবে।

নতুন PHP সংস্করণ ইনস্টল করতে REMI রিপোজিটরি ব্যবহার করুন:

# rpm -ivh https://rpms.famillecollet.com/enterprise/remi-release-7.rpm

ইনস্টলেশনের পর, /etc/yum.repos.d/remi-php74.repo ফাইলটি এডিট করুন:

php-fpm এবং জনপ্রিয় php মডিউল ইনস্টল করুন:

# yum install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip

php-fpm ডিমন চালু করুন এবং স্টার্টআপে যোগ করুন:

# systemctl start php-fpm
# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

সার্ভিস শুরু হয়েছে কিনা নিশ্চিত করতে এই কমান্ডটি চালান:

# lsof -i:9000
COMMAND  PID  USER  FD  TYPE  DEVICE  SIZE/OFF  NODE  NAME
php-fpm  1551  root  7u  IPv4  2078435  0t0  TCP  localhost:cslistener (LISTEN)
php-fpm  1552  apache  9u  IPv4  2078435  0t0  TCP  localhost:cslistener (LISTEN)
php-fpm  1553  apache  9u  IPv4  2078435  0t0  TCP  localhost:cslistener (LISTEN)
php-fpm  1554  apache  9u  IPv4  2078435  0t0  TCP  localhost:cslistener (LISTEN)
php-fpm  1555  apache  9u  IPv4  2078435  0t0  TCP  localhost:cslistener (LISTEN)
php-fpm  1556  apache  9u  IPv4  2078435  0t0  TCP  localhost:cslistener (LISTEN)

Unix socket ব্যবহার করে php-fpm চালান। /etc/php-fpm.d/www.conf থেকে "listen = 127.0.0.1:9000" লাইনটি মুছে ফেলুন এবং নিচের কন্টেন্ট যোগ করুন:

listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx

php-fpm কনফিগারেশন ফাইল পরিবর্তন করার পর, সার্ভিস রিস্টার্ট করুন:

# systemctl restart php-fpm

ওয়েব সার্ভারে MySQL/MariaDB ইনস্টল করুন

আমরা এই ধাপটি বাদ দিব, কারণ "লিনাক্সে MariaDB ইনস্টল এবং অপ্টিমাইজেশন" সম্পর্কে সম্পূর্ণ গাইড আগে প্রকাশিত হয়েছিল। সেটি ব্যবহার করুন।

হাই লোডের জন্য Nginx + PHP-FPM কনফিগারেশন

আপনার ওয়েব সার্ভার বড় সংখ্যক ক্লায়েন্ট রিকোয়েস্ট (হাই ট্রাফিক ওয়েবসাইট) প্রসেস করতে পারে, এর জন্য nginx এবং php-fpm-কে সঠিকভাবে কনফিগার করা গুরুত্বপূর্ণ।

Nginx কনফিগারেশন

/etc/nginx/nginx.conf ফাইল খুলুন এবং Nginx কনফিগারেশন নিচের মত পরিবর্তন করুন:

  • worker_processes 2; — আপনার সার্ভারের কোরের সংখ্যার সমান वर्कার প্রসেসের সংখ্যা সেট করুন;
  • worker_connections 1024; — একটি ওয়ার্কিং প্রসেসের জন্য কানেকশনের সংখ্যা সেট করুন (১০২৪ থেকে ৪০৯৬ পর্যন্ত মান সেট করুন);
  • use epoll; — লিনাক্সে একটি অপ্টিমাল কানেকশন মেথড
  • multi_accept on; — nginx সর্বোচ্চ সংখ্যক কানেকশন গ্রহণ করবে।

http ব্লক:

  • tcp_nodelay on; — হেডার এবং ফাইলের শুরু একসাথে একটি প্যাকেটে পাঠায়;
  • tcp_nopush on;

বহু סט্যাটিক ফাইল ধারণকারী ওয়েব-প্রজেক্টের জন্য gzip কমপ্রেশন সক্ষম করুন:

gzip on;

সকল গুগল স্পিড চেক পাস করার জন্য বিভিন্ন ফাইল টাইপ যোগ করুন:
gzip_types application/atom+xml application/javascript text/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json font/ttf application/x-font-ttf application/vnd.ms-fontobject application/font-woff application/font-woff2 application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vnd.wap.wml text/vtt text/x-component text/x-cross-domain-policy;

টাইমআউট সেটিংস পরিবর্তন করুন:

  • keepalive_timeout 30; — একটি ওয়েব সার্ভার একটি keepalive কানেকশন বন্ধ করার আগে ৩০ সেকেন্ড অপেক্ষা করবে;
  • keepalive_requests 100; — একটি ক্লায়েন্ট থেকে keepalive রিকোয়েস্টের সর্বোচ্চ সংখ্যা;
  • reset_timedout_connection on; — আপনি যদি চান যে রেসপন্স না দেওয়া ক্লায়েন্ট থেকে কানেকশন রিসেট না হয়, তবে এই প্যারামিটার সক্ষম করুন;
  • client_body_timeout 10; — একটি ওয়েব সার্ভার একটি ক্লায়েন্টকে রিকোয়েস্ট নিশ্চিত করার জন্য ১০ সেকেন্ড অপেক্ষা করবে যতক্ষণ না কানেকশন রিসেট হয়;
  • send_timeout 2; — যদি একটি ক্লায়েন্ট ওয়েব সার্ভার রেসপন্স পড়া বন্ধ করে, তবে nginx কানেকশন রিসেট করবে।

আপনার ওয়েবসাইট বড় ফাইল আপলোডের জন্য ডিজাইন না করা থাকলে, nginx ব্যবহার করে লিমিট সেট করুন:

  • client_max_body_size 2m; — সার্ভার ২ MB-এর বেশি রিকোয়েস্ট গ্রহণ করবে না

Nginx-এ যেকোনো পরিবর্তন করার পর রিস্টার্ট করা ভুলবেন না।

# systemctl restart nginx

Php-fpm কনফিগারেশন

php-fpm ইনস্টল করার সময়, আপনি এটিকে unix socket-এ স্যুইচ করেছেন। এটি পারফরম্যান্স উল্লেখযোগ্যভাবে বাড়ায়। অনুমান অনুযায়ী, প্রোডাক্টিভিটি ২ বা ৩ গুণ বেড়ে যায়। অন্যান্য php-fpm প্যারামিটার প্রতিটি প্রজেক্টের জন্য আলাদাভাবে সেট করা উচিত। আসুন একটি সিঙ্গেল-কোর (vCPU) সার্ভারের জন্য ১,০২৪ MB RAM-এ কনফিগারেশন উদাহরণ দেখি।

আপনি php-fpm-এর জন্য প্রায় ৫১২ MB বরাদ্দ করতে পারেন, বাকিটা আপনার ডাটাবেস এবং nginx-এর জন্য রেখে দিন।

/etc/php-fpm/www.conf কনফিগারেশন ফাইলে নিচের কন্টেন্ট যোগ করুন:

  • pm.max_children = 18 — চাইল্ড প্রসেসের সর্বোচ্চ সংখ্যা
  • pm.start_servers = 6 — স্টার্টআপে তৈরি চাইল্ড প্রসেসের সংখ্যা
  • pm.min_spare_servers = 4 — নিষ্ক্রিয় সার্ভার প্রসেসের ন্যূনতম সংখ্যা
  • pm.max_spare_servers = 16 — নিষ্ক্রিয় সার্ভার প্রসেসের সর্বোচ্চ সংখ্যা
  • pm.max_requests = 400 — চাইল্ড প্রসেস রিকোয়েস্টের সংখ্যা, যার পর প্রসেসটি রিস্টার্ট হবে

আমি MariaDB সেটিংস অপ্টিমাইজ করার পদ্ধতি বর্ণনা করিনি, কারণ এই ওয়েবসাইটে সংশ্লিষ্ট আর্টিকেল রয়েছে। আমি আর্টিকেলের ভিত্তিতে আমার প্রজেক্টের জন্য my.cnf প্যারামিটার সেট করেছিলাম, এবং ডাটাবেসتاز সাৎঘতা পারফরম্যান্স ফলাফল দেখিয়েছে।

আপনার ওয়েবসাইট চালানোর পর, আপনি খুল্লে চোখে দেখবেন যে nginx + php-fpm আপনার রিকোয়েস্ট প্রসেস করছে এবং ওয়েবপেজ Apache2 + mod_php-এর চেয়ে অনেক দ্রুত রিটার্ন করছে।

  1. লিনাক্স CentOS/RHEL-এ NFS সার্ভার এবং ক্লায়েন্ট কনফিগারেশন

  2. উবুন্টুতে MySQL ইনস্টল ও কনফিগার করার পদ্ধতি

  3. উবুন্টুতে Nginx ইনস্টল ও কনফিগার করার পদ্ধতি

  4. উচ্চ ট্রাফিক ওয়েবসাইটের জন্য লিনাক্স সার্ভারে Apache এবং PHP কনফিগার করা