Задача заключается в том, чтобы развернуть на одном веб сервере nginx и на одном доменном имени одновременно два приложения с разными php версиями. В нашем примере это будет сайт и приложение для взаимодействия с клиентами (CRM).
Задача сделать, чтобы сайт открывался:
- domain.tld - (основной домен)
- domain.tld/nested-app (приложение)
Для обеспечения безопасности, папка приложения должна находится на одном и том-же уровне, что и сайт, чтобы в случае взлома сайта, злоумышленник не получил доступ к файлам приложения и наоборот. В нашем примере мы производим настройку на Centos 7.
- /var/www/domain.tld/site - (папка сайта)
- /var/www/domain.tld/nested-app - (папка приложения)
Как мы видим они находятся по иерархии на одном уровне. Так как приложения используют разные php версии, нам понадобится установить и настроить второй сервис php-fpm, вместе с php и настроить это все на nginx.
1. Установим php 8 и php-fpm службу
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
wget https://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
Включим php 8 в настройках remi репозитория и установим необходимые пакеты:
apt install php php-fpm php-mysql php-common php-cli php-json php-opcache php-readline php-mbstring php-xml php-gd php-curl
2. Установим php 7 и вторую php-fpm службу
yum install centos-release-scl
yum install rh-php73 rh-php73-php-fpm
scl enable rh-php73 bash
semanage port -a -t http_port_t -p tcp 9003
systemctl start rh-php73-php-fpm
systemctl enable rh-php73-php-fpm
Все готово к настройке, в данной конфигурации мы добавили сервис в автозапуск.
3. Установим и настроим nginx
yum install nginx
Конфигурация для нашего домена будет следующей:
/etc/nginx/conf.d/domain_tld.conf
server {
listen xx.x.xx.x:443 ssl;
listen [ipv6]:443 ssl;
server_name domain.tld www.domain.tld;
index index.php index.html;
set $base /var/www/domain.tld;
root $base/site;
ssl_certificate /etc/ssl/domain_tld/cert23.crt;
ssl_certificate_key /etc/ssl/domain_tld/cert23.key;
client_body_timeout 5s;
client_header_timeout 5s;
client_max_body_size 32m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; ";
ssl_stapling on;
ssl_stapling_verify on;
gzip on;
gzip_disable "msie6";
gzip_types text/plain text/css application/json application/x-javascript text/xml
application/xml application/xml+rss text/javascript application/javascript;
# -- www to no www --
if ($host ~* ^www.domain.tld$) {
rewrite ^(.*)$ https://domain.tld$1 permanent;
}
# -- www to no www --
location / {
try_files $uri $uri/ /index.php?$query_string; }
location ^~ /nested-app {alias $base/nested-app;
if (!-e $request_filename) {
rewrite ^ /nested-app/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) {rewrite ^
/nested-app/index.php last;
} include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9003;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
location ~ \.php$ { include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
В нашем случае:
- domain.tld - работает на порту 9000
- domain.tld/nested-app - работает на порту 9003
В зависимости от того, какой php Вам нужен указываете порт в настройках каждого, так как по умолчанию у обоих указан порт 9000.
Делается это в файле конфигурации:
- Для основного /etc/php-fpm.d/www.conf
- Для дополнительного с php 7 /etc/opt/rh/rh-php73/php-fpm.d/www.conf
Чтобы применить конфигурацию необходимо перезапустить все сервисы
systemctl restart rh-php73-php-fpm
systemctl restart php-fpm
systemctl restart nginx