گاهی اوقات برنامه نویسان PHP میخواهند که website ها یا application های متفاوتی را با استفاده از ورژن های متفاوت PHP روی یک وب سرور راه اندازی و اجرا کنند. به عنوان ادمین یک سیستم، شما نیاز به ایجاد محیطی دارید که بتوانید در آن چندین وب سایت را با استفاده از ورژن های متفاوت PHP روی تنها یک وب سرور (به طور مثال Nginx) اجرا کنید.
در این پست ما به شما نحوه نصب چندین ورژن از PHP و تنظیمات وب سرور Nginx به منظور کارکردن با این ورژن ها از طریق server block ها (منظور virtualhost ها در انجین ایکس) را روی توزیع های CentOS/RHEL 7 با استفاده از LEMP Stack توضیح خواهیم داد.
Nginx از PHP-FPM (مخفف FastCGI Process Manager) استفاده میکند که جایگزینی برای PHP FastCGI است که شامل یکسری ابزارهای اضافه و مفید برای وب سایت های با load بالا میباشد.
محیط آزمایشی ما
مرحله 1 : نصب و فعال کردن ریپازیتوری های EPEL و REMI
1 - ابتدا کار را با نصب و فعال سازی ریپازیتوری EPEL و Remi شروع میکنیم که آخرین ورژن های PHP روی توزیع های CentOS و RedHat را ارائه میدهند.
2 - سپس پکیج yum-utils را نصب میکنیم که کاربردهای yum را افزایش میدهد و همچنین دستور yum-config-manager را نیز نصب میکند که برای فعال و غیرفعال کردن ریپازیتوری های yum روی سیستم مورد استفاده قرار میگیرد.
نکته : روی RHEL 7 شما میتوانید به اختیار ریپازیتوری خاصی را برای یکسری Dependency ها با استفاده از دستور زیر فعال کنید.
مرحله 2 : نصب وب سرور Nginx
3 - برای نصب آخرین ورژن Nginx شما نیاز دارید که ریپازیتوری رسمی nginx را اضافه کنید، فایلی به نام /etc/yum.repos.d/nginx.repo ایجاد کنید.
بنا به توزیع لینوکسی که دارید، خطوط زیر به فایل nginx.repo اضافه کنید.
4 - زمانیکه ریپازیتوری nginx را اضافه کردید، میتوانید با استفاده از دستور yum همانند زیر nginx را نصب کنید.
مرحله 3 - نصب سرور دیتابیس MariaDB
5 - برای نصب آخرین ورژن MariaDB ما نیاز داریم ریپازیتوری رسمی mariadb را اضافه کنیم، برای این منظور فایل /etc/yum.repos.d/mariadb.repo را ایجاد میکنیم.
خط های زیر را با توجه به توزیع لینوکسی تان به فایل اضافه کنید.
همچنین توصیه میشود مطالعه کنید :
آموزش دستورات پایه MySQL
6 - بعد از اینکه ریپازیتوری mariadb اضافه شد، میتوانید mariadb را با استفاده از ابزار yum همانند زیر نصب کنید.
7 - سپس با استفاده از اسکریپت زیر امنیت دیتابیس تان را برقرار کنید. پسورد root را تنظیم کنید و به سوالات بعدی (برای غیرفعال کردن دسترسی به یوزر root از راه دور، بستن دسترسی کاربران ناشناس و همچنین حذف دیتابیس test که به صورت پیش فرض میتواند به تمام کاربران دسترسی بدهد، حتی کاربران ناشناس) با استفاده از "y" و فشاردادن کلید "Enter" پاسخ دهید.
نکته : در صورتی که هنگام اجرای دستور mysql_secure_installation با خطای زیر (Can't connect to local MySQL server) مواجه شدید، مربوط به فعال بودن SELINUX میباشد، که با غیرفعال کردن SELINUX مشکل برطرف خواهد شد.
در لینک زیر به طول مفصل در مورد خطای بالا و نحوه غیرفعال کردن SELINUX توضیح داده شده است.
برطرف کردن خطای Can't connect to local MySQL server through socket هنگام نصب و راه اندازی MySQL
همچنین توصیه میشود : 12 راهکار برای Secure کردن دیتابیس MySQL/MariaDB در Linux (به زودی)
مرحله 4 : نصب چندین ورژن از PHP
8 - برای نصب نسخه های مختلف PHP برای پروژه هایتان، از دستور yum-config-manager برای نصب ورژن های مختلف PHP به همراه اکثر ماژول های پیش نیاز، استفاده کنید.
نصب PHP ورژن 7.1
نصب PHP ورژن 5.6
9 - پس از نصب PHP، شما میتوانید از دستور زیر برای چک کردن ورژن PHP پیش فرض در سرورتان استفاده کنید.
مرحله 5 : تنظیمات PHP-FPM و PHP56-PHP-FPM
10 - جالبترین قسمت آموزش اینجا میباشد، که به شما نحوه اجرا کردن ورژن های مختلف PHP در سرورتان را شرح میدهد. در اینجا، شما میخواهید ورژن های مختلف از php-fpm که Nginx با آن کار میکند را تنظیم کنید. شما باید user/group مربوط به پروسس های FastCGI و Port هایی که آنها listen میکنند را تعریف کنید.
اینها دو مورد از فایل های پیکربندی میباشد که شما قصد دارید آنها را ویرایش کنید.
فایل های بالا را با استفاده از ادیتور متن دلخواه تان باز کنید و user/group مربوط به Proccess های FastCGI را به nginx تغییر دهید.
مقدار پیش فرض apache میباشد، آنها را همانند زیر به nginx تغییر دهید.
11 - سپس پارامترهای listen را پیدا کنید و address:port روی درخواست های FastCGI هایی که دریافت خواهند شد تعریف کنید.
12 - به محض اینکه تمام تنظیمات بالا را انجام دادید شما باید سرویس های Nginx, MariaDB و PHP-FPM را start و enable کنید تا به هنگام Boot سیستم به صورت اتوماتیک اجرا شوند.
توجه : هنگام start کردن دستور دوم از پی اچ پی php56-php-fpm، در صورت بروز هرگونه خطا، میتواند از سمت پالیسی ها SELINUX باشد که دستور فوق را block میکند. اگر SELINUX در حالت enforcing mode باشد آنرا به permissive mode تغییر دهید، سپس سرویس را مجددا start کنید.
مرحله 6 : تنظیمات سطح دسترسی ها برای Website ها
13 - در اینجا شما میتوانید دایرکتوری های مورد نیاز برای وب سایت تان را تحت /var/www/html ایجاد کنید. شما همچنین نیاز به ایجاد دایرکتوری برای ذخیره کردن log ها همانند زیر خواهید داشت.
14 - سطوح دسترسی ownership مناسب را روی همه دایرکتوری ها تعریف کنید.
مرحله 7 : تعریف Block های سرور Nginx برای Website ها
15 - اکنون تنظیم کنید که چگونه Nginx درخواست های به سمت وب سایت شما را با استفاده از فایل های کانفیگ server block (که باید در مسیر /etc/nginx/conf.d موجود باشد) Process خواهد کرد.
فایل های کانفیگ وب سایت تان را که با پسوند .conf تمام میشوند را ایجاد کنید.
سپس تنظیمات server block زیر را در فایل های مربوطه past کنید.
وب سایت 1 :
وب سایت 2 :
16 - مطمئن شوید که خط زیر را در بخش پایانی بلاک HTTP در فایل /etc/nginx/nginx.conf داشته باشید. این خط به شما کمک میکند که همه فایل های کانفیگی که در دایرکتوری /etc/nginx/conf.d وجود دارد را به هنگام راه اندازی Nginx شامل شود.
مرحله 8 : تست ورژن های متفاوت PHP
17 - در نهایت شما نیاز به این دارید که تست کنید آیا سرور شما از دو ورژن PHP استفاده میکند یا خیر، شما میتوانید یک اسکریپت بسیار پایه به Info.php را در دایرکتوری root وب سایت خودتان همانند زیر پیدا کنید.
18 - برای اعمال همه تغییراتی که در بالا اعمال کردید شما نیاز دارید که سرور Nginx, php-fpm و php56-php-fpm را restart کنید. اما شما قبل از هر کاری میتوانید فایل های کانفیگ Nginx را برای هر گونه خطای syntax ی چک کنید.
19 - آخرین موردی که باید انجام دهید خصوصا اگر در حال راه اندازی سرورتان به صورت Local هستید، شما نیاز دارید که local DNS را با استفاده از فایل /etc/hosts در سیستم کلاینت، همانند آنچه که در تصویر زیر نمایش داده شده است تعریف کنید.
نکته : در CentOS 7.0 از Firewalld، استفاده میشود بنابراین آن را طوری تنظیم کنید که به پورت 80 (HTTP) و 443 (https) اجازه دسترسی خارجی را بدهد.
20 - در نهایت یک مرورگر وب باز کنید و آدرس زیر را برای بررسی کردن ورژن PHP نصب شده روی سیستم تان را وارد کنید.
اکنون شما میتوانید فایل های متفاوت را استفاده و وب سایت تان را با ورژن های متفاوت PHP تست کنید. اگر هر گونه سوال یا ابهامی داشتید در اینجا مطرح کنید.
در این پست ما به شما نحوه نصب چندین ورژن از PHP و تنظیمات وب سرور Nginx به منظور کارکردن با این ورژن ها از طریق server block ها (منظور virtualhost ها در انجین ایکس) را روی توزیع های CentOS/RHEL 7 با استفاده از LEMP Stack توضیح خواهیم داد.
Nginx از PHP-FPM (مخفف FastCGI Process Manager) استفاده میکند که جایگزینی برای PHP FastCGI است که شامل یکسری ابزارهای اضافه و مفید برای وب سایت های با load بالا میباشد.
محیط آزمایشی ما
- یک سرور CentOS 7 یا RedHat 7 با نصب Minimal
- وب سرور Nginx
- PHP 7.1 (که به عنوان ورژن پیش فرض مورد استفاده قرار میگیرد) و ورژن 5.6
- سرور دیتابیس MariaDB
- Ip آدرس سرور : 172.16.16.226
- وب سایت ها : example1.com و example2.com
مرحله 1 : نصب و فعال کردن ریپازیتوری های EPEL و REMI
1 - ابتدا کار را با نصب و فعال سازی ریپازیتوری EPEL و Remi شروع میکنیم که آخرین ورژن های PHP روی توزیع های CentOS و RedHat را ارائه میدهند.
کد PHP:
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
2 - سپس پکیج yum-utils را نصب میکنیم که کاربردهای yum را افزایش میدهد و همچنین دستور yum-config-manager را نیز نصب میکند که برای فعال و غیرفعال کردن ریپازیتوری های yum روی سیستم مورد استفاده قرار میگیرد.
کد PHP:
# yum install yum-utils
نکته : روی RHEL 7 شما میتوانید به اختیار ریپازیتوری خاصی را برای یکسری Dependency ها با استفاده از دستور زیر فعال کنید.
کد PHP:
# subscription-manager repos --enable=rhel-7-server-optional-rpms
مرحله 2 : نصب وب سرور Nginx
3 - برای نصب آخرین ورژن Nginx شما نیاز دارید که ریپازیتوری رسمی nginx را اضافه کنید، فایلی به نام /etc/yum.repos.d/nginx.repo ایجاد کنید.
کد PHP:
# vi /etc/yum.repos.d/nginx.repo
کد PHP:
--------------- On CentOS 7 ---------------
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
--------------- On RHEL 7 ---------------
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/7.x/$basearch/
gpgcheck=0
enabled=1
4 - زمانیکه ریپازیتوری nginx را اضافه کردید، میتوانید با استفاده از دستور yum همانند زیر nginx را نصب کنید.
کد PHP:
# yum install nginx
مرحله 3 - نصب سرور دیتابیس MariaDB
5 - برای نصب آخرین ورژن MariaDB ما نیاز داریم ریپازیتوری رسمی mariadb را اضافه کنیم، برای این منظور فایل /etc/yum.repos.d/mariadb.repo را ایجاد میکنیم.
کد PHP:
# vi /etc/yum.repos.d/mariadb.repo
کد PHP:
--------------- On CentOS 7 ---------------
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
--------------- On RHEL 7 ---------------
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/rhel7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
همچنین توصیه میشود مطالعه کنید :
آموزش دستورات پایه MySQL
6 - بعد از اینکه ریپازیتوری mariadb اضافه شد، میتوانید mariadb را با استفاده از ابزار yum همانند زیر نصب کنید.
کد PHP:
# yum install MariaDB-client MariaDB-server
7 - سپس با استفاده از اسکریپت زیر امنیت دیتابیس تان را برقرار کنید. پسورد root را تنظیم کنید و به سوالات بعدی (برای غیرفعال کردن دسترسی به یوزر root از راه دور، بستن دسترسی کاربران ناشناس و همچنین حذف دیتابیس test که به صورت پیش فرض میتواند به تمام کاربران دسترسی بدهد، حتی کاربران ناشناس) با استفاده از "y" و فشاردادن کلید "Enter" پاسخ دهید.
کد PHP:
# mysql_secure_installation
کد PHP:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
برطرف کردن خطای Can't connect to local MySQL server through socket هنگام نصب و راه اندازی MySQL
همچنین توصیه میشود : 12 راهکار برای Secure کردن دیتابیس MySQL/MariaDB در Linux (به زودی)
مرحله 4 : نصب چندین ورژن از PHP
8 - برای نصب نسخه های مختلف PHP برای پروژه هایتان، از دستور yum-config-manager برای نصب ورژن های مختلف PHP به همراه اکثر ماژول های پیش نیاز، استفاده کنید.
نصب PHP ورژن 7.1
کد PHP:
# yum-config-manager --enable remi-php71 [Default]
# yum install php php-common php-fpm
# yum install php-mysql php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml php-pecl-apc php-cli php-pear php-pdo
نصب PHP ورژن 5.6
کد PHP:
# yum install php56 php56-php-common php56-php-fpm
# yum install php56-php-mysql php56-php-pecl-memcache php56-php-pecl-memcached php56-php-gd php56-php-mbstring php56-php-mcrypt php56-php-xml php56-php-pecl-apc php56-php-cli php56-php-pear php56-php-pdo
9 - پس از نصب PHP، شما میتوانید از دستور زیر برای چک کردن ورژن PHP پیش فرض در سرورتان استفاده کنید.
کد PHP:
# php -v
مرحله 5 : تنظیمات PHP-FPM و PHP56-PHP-FPM
10 - جالبترین قسمت آموزش اینجا میباشد، که به شما نحوه اجرا کردن ورژن های مختلف PHP در سرورتان را شرح میدهد. در اینجا، شما میخواهید ورژن های مختلف از php-fpm که Nginx با آن کار میکند را تنظیم کنید. شما باید user/group مربوط به پروسس های FastCGI و Port هایی که آنها listen میکنند را تعریف کنید.
اینها دو مورد از فایل های پیکربندی میباشد که شما قصد دارید آنها را ویرایش کنید.
- php-fpm (به صورت پیش فرض 7.1) مسیر : /etc/php-fpm.d/www.conf
- php56-php-fpm مسیر : /opt/remi/php56/root/etc/php-fpm.d/www.conf
فایل های بالا را با استفاده از ادیتور متن دلخواه تان باز کنید و user/group مربوط به Proccess های FastCGI را به nginx تغییر دهید.
کد PHP:
# vi /etc/php-fpm.d/www.conf [PHP 7.1]
# vi /opt/remi/php56/root/etc/php-fpm.d/www.conf [PHP 5.6]
کد PHP:
user = nginx
group = nginx
11 - سپس پارامترهای listen را پیدا کنید و address:port روی درخواست های FastCGI هایی که دریافت خواهند شد تعریف کنید.
کد PHP:
listen = 127.0.0.1:9000 [php-fpm]
listen = 127.0.0.1:9001 [php56-php-fpm]
12 - به محض اینکه تمام تنظیمات بالا را انجام دادید شما باید سرویس های Nginx, MariaDB و PHP-FPM را start و enable کنید تا به هنگام Boot سیستم به صورت اتوماتیک اجرا شوند.
کد PHP:
# systemctl enable nginx
# systemctl start nginx
# systemctl enable mariadb
# systemctl start mariadb
---------------- PHP 7.1 ----------------
# systemctl enable php-fpm
# systemctl start php-fpm
---------------- PHP 5.6 ----------------
# systemctl enable php56-php-fpm
# systemctl start php56-php-fpm
توجه : هنگام start کردن دستور دوم از پی اچ پی php56-php-fpm، در صورت بروز هرگونه خطا، میتواند از سمت پالیسی ها SELINUX باشد که دستور فوق را block میکند. اگر SELINUX در حالت enforcing mode باشد آنرا به permissive mode تغییر دهید، سپس سرویس را مجددا start کنید.
کد PHP:
# getenforce
# setenforce 0
مرحله 6 : تنظیمات سطح دسترسی ها برای Website ها
13 - در اینجا شما میتوانید دایرکتوری های مورد نیاز برای وب سایت تان را تحت /var/www/html ایجاد کنید. شما همچنین نیاز به ایجاد دایرکتوری برای ذخیره کردن log ها همانند زیر خواهید داشت.
کد PHP:
---------------- Website 1 ----------------
# mkdir -p /var/www/html/example1.com/
# mkdir -p /var/www/html/example2.com/
---------------- Website 2 ----------------
# mkdir -p /var/log/nginx/example1.com/
# mkdir -p /var/log/nginx/example2.com/
14 - سطوح دسترسی ownership مناسب را روی همه دایرکتوری ها تعریف کنید.
کد PHP:
---------------- Website 1 ----------------
# chown -R root:nginx /var/www/html/example1.com/
# chmod -R 755 /var/www/html/example1.com/
# chown -R root:nginx /var/log/nginx/example1.com/
# chmod -R 660 /var/log/nginx/example1.com/
---------------- Website 2 ----------------
# chown -R root:nginx /var/www/html/example2.com/
# chmod -R 755 /var/www/html/example2.com/
# chown -R root:nginx /var/log/nginx/example2.com/
# chmod -R 660 /var/log/nginx/example2.com/
مرحله 7 : تعریف Block های سرور Nginx برای Website ها
15 - اکنون تنظیم کنید که چگونه Nginx درخواست های به سمت وب سایت شما را با استفاده از فایل های کانفیگ server block (که باید در مسیر /etc/nginx/conf.d موجود باشد) Process خواهد کرد.
فایل های کانفیگ وب سایت تان را که با پسوند .conf تمام میشوند را ایجاد کنید.
کد PHP:
# vi /etc/nginx/conf.d/example1.com.conf
# vi /etc/nginx/conf.d/example2.com.conf
وب سایت 1 :
کد PHP:
server {
listen 80;
server_name example1.com www.example1.com;
root /var/www/html/example1.com/;
index index.php index.html index.htm;
#charset koi8-r;
access_log /var/log/nginx/example1.com/example1_access_log;
error_log /var/log/nginx/example1.com/example1_error_log error;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
root /var/www/html/example1.com/;
fastcgi_pass 127.0.0.1:9000; #set port for php-fpm to listen on
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include /etc/nginx/fastcgi_params;
}
}
وب سایت 2 :
کد PHP:
server {
listen 80;
server_name example2.com www.example2.com;
root /var/www/html/example2.com/;
index index.php index.html index.htm;
#charset koi8-r;
access_log /var/log/nginx/example2.com/example2_access_log;
error_log /var/log/nginx/example2.com/example2_error_log error;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
root /var/www/html/example2.com/;
fastcgi_pass 127.0.0.1:9001; #set port for php56-php-fpm to listen on
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include /etc/nginx/fastcgi_params;
}
}
16 - مطمئن شوید که خط زیر را در بخش پایانی بلاک HTTP در فایل /etc/nginx/nginx.conf داشته باشید. این خط به شما کمک میکند که همه فایل های کانفیگی که در دایرکتوری /etc/nginx/conf.d وجود دارد را به هنگام راه اندازی Nginx شامل شود.
کد PHP:
include /etc/nginx/conf.d/*.conf;
مرحله 8 : تست ورژن های متفاوت PHP
17 - در نهایت شما نیاز به این دارید که تست کنید آیا سرور شما از دو ورژن PHP استفاده میکند یا خیر، شما میتوانید یک اسکریپت بسیار پایه به Info.php را در دایرکتوری root وب سایت خودتان همانند زیر پیدا کنید.
کد PHP:
# echo "<?php phpinfo(); ?>" > /var/www/html/example1.com/info.php
# echo "<?php phpinfo(); ?>" > /var/www/html/example2.com/info.php
18 - برای اعمال همه تغییراتی که در بالا اعمال کردید شما نیاز دارید که سرور Nginx, php-fpm و php56-php-fpm را restart کنید. اما شما قبل از هر کاری میتوانید فایل های کانفیگ Nginx را برای هر گونه خطای syntax ی چک کنید.
کد PHP:
# nginx -t
# systemctl restart nginx php-fpm php56-php-fpm
19 - آخرین موردی که باید انجام دهید خصوصا اگر در حال راه اندازی سرورتان به صورت Local هستید، شما نیاز دارید که local DNS را با استفاده از فایل /etc/hosts در سیستم کلاینت، همانند آنچه که در تصویر زیر نمایش داده شده است تعریف کنید.
کد PHP:
172.16.16.226 example1.com example1
172.16.16.226 example2.com example2
نکته : در CentOS 7.0 از Firewalld، استفاده میشود بنابراین آن را طوری تنظیم کنید که به پورت 80 (HTTP) و 443 (https) اجازه دسترسی خارجی را بدهد.
کد PHP:
# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --reload
20 - در نهایت یک مرورگر وب باز کنید و آدرس زیر را برای بررسی کردن ورژن PHP نصب شده روی سیستم تان را وارد کنید.
کد PHP:
http://example1.com/info.php
http://example2.com/info.php
اکنون شما میتوانید فایل های متفاوت را استفاده و وب سایت تان را با ورژن های متفاوت PHP تست کنید. اگر هر گونه سوال یا ابهامی داشتید در اینجا مطرح کنید.