Установка сервера на Centos 7-8 (php-fpm+nginx+htpasswd+composer)

Установка Nginx

Установим необходимые утилиты

yum update
yum install -y wget net-tools

Добавим репу Nginx в ОС

(cat <<-EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/7/x86_64/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/7/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key EOF )>/etc/yum.repos.d/nginx.repo
Включим репозитарий nginx-mainline:

просмотреть источникраспечатать?
yum --enablerepo=nginx-mainline update

Установим Nginx и OpenSSL (опционально)

yum -y install nginx
yum -y install openssl

Запустим Nginx

systemctl enable --now nginx

Проверим запуск Nginx

systemctl status nginx

Проверим открытые порты

netstat -ltupn | grep nginx

Базовая настройка.

1. Создадим директорию для хранения SSL сертификатов и DH-ключей, а также создаем файл с параметрами для DHE-шифров:

mkdir /etc/nginx/ssl
openssl dhparam -out /etc/nginx/ssl/dhparams.pem 2048
2. Создадим директории для хранения настроек Web-сайтов:

mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled

3. Отредактируем основной файл настроек Nginx.

Я приведу базовый эталонный файл настроек который использую я на 99% серверов, рекомендую использовать его с дополнительными Вашими правками под конкретные нужды. В предыдущей статье мы уже рассматривали его, с тех пор ничего не изменилось.

Скачать уже готовый файл для Nginx версии 1.21.x :

wget https://gist.githubusercontent.com/CHERTS/8e9ecf4fbfb765556311a88e5106174b/raw/nginx.conf -O /etc/nginx/nginx.conf
sed -i 's/user www-data;/user nginx;/g' /etc/nginx/nginx.conf

проверяем конфигурацию Nginx

nginx -t

Перезагружаем конфигурацию Nginx:

nginx -s reload

Открываем порты в фаерволе

firewall-cmd --list-all
firewall-cmd --add-service=http --permanent
firewall-cmd --reload

Если после смены папки в настройках сервера в браузере отображается 403 forbidden значит у нас проблема с SELinux, воспользуемся одной из команд ниже

sudo restorecon -R /var/www/html
sudo chcon -R -t httpd_sys_content_t DIRPATH

Если мы пытаемся сделать простой proxy_pass на другой сервак но в итоге получаем 502, то скорее всего проблема тоже с SELinux, воспользуемся командой

sudo setsebool -P httpd_can_network_connect 1

Установка PHP fpm

Установим сторонний репозитарий EPEL и Remi

Centos 7

yum install -y yum-utils
yum localinstall https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum localinstall https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php74
yum makecache fast

Centos 8

yum install -y yum-utils
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
rpm -qa | grep epel
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
rpm -qa | grep remi
dnf module list php
dnf module enable php:remi-7.4
dnf install php php-cli php-common
dnf install -y php-mysqlnd
php -v

Глянем пакеты которые есть -> PHP 7.4

yum search php7

если мы обновляем 7.4 на более новую версию, нужно почистить лишние реми файлы

dnf clean all
rm -r /var/cache/dnf
rm -r /var/cache/PackageKit
dnf upgrade

Установим PHP 7.4 и необходимые либы, вот стандартно используемых. php-bcmath — модуль для PHP приложений с использованием библиотеки BCMath. php-cli — интерфейс командной строки для PHP (CLI). php-common — Common (общие) файлы для PHP. php-dba — модуль абстрактного слоя с использованием БД для PHP приложений. php-devel — Файлы, необходимые для сборки расширений PHP. php-embedded — библиотека PHP для встраивания в приложения. php-enchant — Enchant расширение для PHP приложений. php-fpm — PHP FastCGI Process Manager php-gd — модуль для PHP приложений для использования графической библиотеки GD. php-imap -модуль для PHP приложений которые используют протокол IMAP. php-intl -Интернационализация расширения для PHP приложений. php-ldap -модуль для PHP приложений которые используют LDAP. php-mbstring — A module for PHP applications which need multi-byte string handling php-mcrypt — Стандартный модуль PHP с поддержкой Mcrypt. php-mysql -модуль для PHP приложений которые используют MySQL. php-mysqlnd -модуль для PHP приложений которые используют MySQL. php-odbc -модуль для PHP приложений которые используют ODBC. php-pdo — модуль абстракции доступа к базе данных для PHP приложений. php-pear.noarch — PHP Extension and Application Repository framework php-pecl-memcache — расширение для работы с Memcached. php-pgsql — модуль для PHP приложений которые используют PostgreSQL. php-process — Модуль для PHP, который использует интерфейсы системного процессора. php-pspell — модуль для PHP приложений для использования интерфейсов pspell. php-recode -модуль для PHP приложений которые используют библиотеку recode. php-snmp — модуль для PHP приложений, которые запрашивают SNMP-управляемые устройства. php-soap -модуль для PHP приложений которые используют протокол SOAP. php-xml -модуль для PHP приложений которые используют XML. php-xmlrpc -модуль для PHP приложений которые используют протокол XML-RPC.

yum install -y php-cli php-fpm php-common php-curl php-gd php-imap php-intl php-mbstring php-xml php-zip php-bz2 php-bcmath php-json php-opcache php-devel php-mysqlnd

Запускаем PHP-FPM

systemctl enable --now  php-fpm

Проверим работоспособность

systemctl status php-fpm

Настройка Nginx и PHP-FPM

systemctl status php-fpm
или
ps -ef |grep "[p]hp-fpm: pool"

Пользователь и группа от имени которой работает пул www — это apache, нужно сменить на nginx

sed -i "s/user = apache/user = nginx/g" /etc/php-fpm.d/www.conf
sed -i "s/group = apache/group = nginx/g" /etc/php-fpm.d/www.conf

Перезапускаем PHP-FPM

systemctl restart php-fpm

Проверяем все пулы, убеждаемся что пользователь nginx

ps -ef |grep "[p]hp-fpm: pool"

Создаем файл виртуального сервера для Nginx

(cat<<-EOF server { listen 195.56.56.10:80; server_name mysite.org www.mysite.org; root /var/www/mysite.org; location / { index index.html index.php; } location ~* \.(gif|jpg|png)$ { expires 30d; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; } } EOF )>/etc/nginx/sites-available/mysite.conf

Создадим симлинк на файл /etc/nginx/sites-available/mysite.conf в директории /etc/nginx/sites-enabled. это удобный способ быстро включать и выключать виртуальные серверы, ведь в файле /etc/nginx/nginx.conf мы прописали такую директиву: include /etc/nginx/sites-enabled/*;

ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/100-mysite.conf

Проверяем создание симлинки

ls -l /etc/nginx/sites-enabled

Создаем папку для сайта, которую мы указали в директиве root в файле /etc/nginx/sites-available/mysite.conf:

mkdir -p /var/www/mysite.org

Задаем права для папок в которых хранятся сайты

chown -R nginx:nginx /var/www
chmod -R 775 /var/www

Проверяем настройку nginx, если все ок, перезапускаем его

nginx -t
nginx -s reload

На всякий случай разрешаем в фаерволе http

 firewall-cmd --permanent --zone=public --add-service=http
 firewall-cmd --reload

Установка паролей на папки в nginx

Создадим файл в котором будут храниться пароли. Дальше установим пакет htpasswd который входим в apatch, для генерации паролей

touch /etc/nginx/webpagestudio.htpasswd
sudo yum install httpd-tools

Установим пароль, для этого укажем имя пользователя и два раза повторим пароль.

sudo htpasswd /etc/nginx/htpasswd webpagestudio

Теперь в location добавляем защиту

auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;

Перезапускаем nginx

sudo service restart nginx

Установка Composer

Обновляем локаль

sudo yum -y update

Устанавливаем необходимые зависимости

yum install php-cli php-zip wget unzip

Скачиваем скрипт установщика

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

Загрузите авторизованную подпись со страницы Composer на Github в переменной HASH и потом используем скрипт, чтобы сравнить официальный хеш-код с тем, который мы скачали:

HASH="$(wget -q -O - https://composer.github.io/installer.sig)"

php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Устанавливаем composer

php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Прверяем наличие composer и потом удаляем лишние связи

composer
php -r “unlink(‘composer-setup.php’);”