Эта статья находится в процессе редактирования в данный момент! Её пока следует использовать осторожно, руководствуясь здравым смыслом....
По счастливой случайности мне досталась удивительная виртуальная машина, на которую администраторы хостинга натянули минимальную CentOS 7. Машинка достаточно резвая, имеет 3 Гб ОЗУ, 2 процессора Intel Xeon e5-2630v3 (но нам доступен лишь один). Файловая система XFS.
uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Задача: превратить машину в хостинг для тяжёлого сайта.
Разбираемся с интерфейсами
По привычке набираем
# ifconfig
...и видим
-bash: ifconfig: command not found
Ой, а что у нас теперь вместо ifconfig? Ах, да, у нас ip addr.
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether a6:f7:0f:92:9b:aa brd ff:ff:ff:ff:ff:ff
inet 5.189.206.250/24 brd 5.189.206.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a4f7:fff:fe92:9baa/64 scope link
valid_lft forever preferred_lft forever
Оказывается, нам забыли указать DNS при установке операционной системы. Добавляем записи
cd /etc/sysconfig/network-scripts/
vi ifcfg-eth0
Добавляем строки
DNS1=8.8.8.8
DNS2=8.8.4.4
Необходимо перезапустить сеть
service network restart
Ура, мы теперь по-настоящему в интернете.
Если нет ifcfg-eth0, посмотрите что-то похожее, например ifcfg-enp3s0.
Базовая подготовка
Общее обновление
yum -y update
Доставляем жизненно необходимые (для людей!) пакеты
yum -y install mc wget
Избавляемся от подгузников, для чего редактируем
mcedit /etc/sysconfig/selinux
Изменим значение
SELINUX=disabled
Приходится перезагружаться
reboot
Межсетевой экран
Сначала необходимо определиться: мы за годами проверенный iptables или за новомодный FirewallD? В данном случае хотелось бы отказаться от FirewallD.
Забываем про FirewallD
systemctl disable firewalld && systemctl stop firewalld && yum erase firewalld
Ставим iptables
yum install iptables-services
touch /etc/sysconfig/iptables
touch /etc/sysconfig/ip6tables
systemctl start iptables && systemctl start ip6tables && systemctl enable iptables && systemctl enable ip6tables
===============
Привожу свой файл iptables в качестве примера.
Настройка сервера SSH
Меняем порт SSH.
Чтобы повысить защищённость сервера, меняем значение порта для подключения по SSH.
mcedit /etc/ssh/sshd_config
Выставляем:
Port 555
systemctl restart sshd.service
tail -f /var/log/messages
Видим
Nov 4 07:29:14 localhost systemd: Stopping OpenSSH server daemon...
Nov 4 07:29:14 localhost systemd: Started OpenSSH Server Key Generation.
Nov 4 07:29:14 localhost systemd: Starting OpenSSH server daemon...
Nov 4 07:29:14 localhost systemd: Started OpenSSH server daemon.
Если видим что-то другое, значит, мы забыли отключить SELinux, тут два варианта, или всё-таки отключаем, или же ищем в интернете методички по установке semanage (но это уже без меня).
Удаляем в iptables лишние строки (порты SSH) и перезапускаем
systemctl restart iptables.service
Выходим из терминала и заходим. Получилось? У меня – да.
Веб-окружение
Устанавливаем nginx через официальный репозиторий
mcedit /etc/yum.repos.d/nginx.repo
Вставляем содержимое:
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
Теперь привычной командой запускаем установку:
yum install -y nginx
Добавляем в автозагрузку и запускаем
systemctl start nginx.service && systemctl enable nginx.service
Устанавливать Apache нам нет необходимости. Но мы его всё же установим в целях совместимости, на будущее. Кроме того, пользователь apache нам пригодится, от него будут работать все веб-сервисы (так сложилось исторически).
yum -y install httpd
Устанавливаем интерпретатор PHP
Вариант 1 (простой). Устанавливаем стандартный интерпретатор PHP
yum -y install php php-pdo php-imap php-opcache php-gd php-common php-cli php-mysql php-xml php-mbstring
Вариант 2 (хитрый).Если нужна более серьезная версия, то пользуемся проверенным способом, устанавливаем php 5.6.
Вариант 3 (модный).На момент написания статьи я рекомендую переходить на php версии 7. Её мы будем ставить из репозитория Webtatic
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install -y php70w php70w-opcache php70w-fpm php70w-pdo php70w-imap php70w-mysql php70w-xml php70w-mbstring
Убеждаемся, что у нас свежая версия командой php -v
:
# php -v PHP 7.0.6 (cli) (built: May 1 2016 10:24:20) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
Устанавливаем MariaDB
yum install -y mariadb mariadb-server
Запускаем и добавляем в автозапуск:
systemctl enable mariadb && systemctl start mariadb
Первоначальная настройка СУБД выполняется сразу после процедуры установки. Она заключается в следующем:
- Смена пароля пользователя root базы mysql
- Удаление созданной по умолчанию таблицы test из базы mysql
- Удаление созданного по умолчанию пользователя anonymous
Выполним команду mysql_secure_installation
, согласимся со всеми пунктами, зададим пароль администратора.
Чтобы в будущем сменить пароль, воспользуемся командой mysqladmin -u root password
Устанавливаем php-fpm (если пользовались Вариантом 1 или Вариантом 2):
yum install -y php-fpm
Запускаем и добавляем в автозапуск:
systemctl enable php-fpm && systemctl start php-fpm
Ни в коем случае не забываем про /var/cache – в ней nginx должен работать без каких-либо помех
chown -R apache:apache /var/cache/nginx/
Конфигурация nginx
Изменяем под себя конфигурационный файл nginx
Для примера мой вариант nginx.conf
Это общие настройки веб-сервера, в которых мы указываем, что работа ведётся от имени пользователя apache, количество процессов выбирает сам nginx, включаем компрессию gzip (у меня мощный процессор, поэтому 7, но вообще лучше не борщить и выбирать 4-6). Все виртуальные хосты будем настраивать отдельными конфигурационными файлами.
Добавляем виртуальный хост:
Для примера мой вариант vhost.conf для коммерческого сайта.
В примере учтены следующие моменты
- Связка NGINX+PHP-FPM без Apache
- Сайт под управлением Joomla
- Необходимо закрыть паролем доступ к админке
- Статику отдаём средствами самого nginx
- Динамику обрабатываем через php-fpm
- Необходимо избавиться от index.php в адресе
- Необходим редирект с www на без www
В результате сайт начинает просто летать по сравнению с LAMP.
Конфигурация сайта на Joomla
Если наш сайт на Joomla, вставляем в конфиг сайта
public $memcache_server_host = 'unix:///var/run/memcached/mem.socket'; public $memcache_server_port = '0';
Конфигурация php
Основные настройки описаны в отдельной статье.
Проверяем, что unix-сокет php-fpm доступен для чтения и записи серверу nginx.
Настраиваем php.ini, выставляем в ноль переменную cgi.fix_pathinfo
Для примера мой вариант php.ini.
В примере особенно важно подчеркнуть
- max_input_vars = 9000 (ибо у нас Joomla + JoomShopping)
- short_open_tag = On (ибо не все пользуются полным тегом)
- post_max_sixe = 90M (ибо мы собираемся закачивать через админку видео)
- upload_max_filesixe = 90M (аналогично)
- date.timezone = Europe/Moscow (живём по Москвоскому времени)
Конфигурация php-fpm
Редактируем общие настройки php-fpm: /etc/php-fpm.conf
Для примера мой вариант php-fpm.conf
Обратите внимание на значения в этом файле! Они отличаются от значений по умолчанию.
Далее настраиваем обработку виртуальных хостов. Вот пример моего файла php-fpm-child.conf для коммерческого сайта. Очень удобно все настройки выполнять в отдельных файлах.
Конфигурация httpd
Как я уже говорил, мы готовим машину к обслуживанию связки nginx + php-fpm. Поэтому от конфигурации веб-сервера Apache можно вообще отказаться: будем его конфигурировать, если он понадобится в будущем. На данный момент можно ограничиться сменой порта на любой, отличный от 80, я выбрал 8080, чтобы nginx мог обращаться на этот порт за динамическим контентом от Apache.
Конфигурация СУБД
Основные настройки описаны в отдельной статье, которая создавалась для mySQL, но справедлива для MariaDB.
Поехали...
Теперь всё готово, перезапускаем веб-окружение
systemctl restart nginx.service && systemctl restart php-fpm.service
Если у нас всё получилось, то можем заходить в админку и проверять, как работает наша система
Обратите внимание на строчку "Интерфейс между веб-сервером и PHP".
Поздравляю, всё получилось! В нашем распоряжении выскоэффективный веб-сервер.
Возможные ошибки
Если в результате запуска всех сервисов мы видим 502 Bad Gateway, значит скорее всего мы забыли определить владельца файлов сокета (советы из интернета тут просто поражают нелепостью!). Идём в /run и назначаем на файлы сокета владельца apache:apache.
Дискуссия
Написал Rocky 9
Опубликовано в: Установка nginx c PHP-FPM под CentOS 7.0 in LinuxНаписал Константин
Опубликовано в: Докеризация стека LEMP под Ubuntu c помощью Compose in LinuxНаписал bammbr
Опубликовано в: Шлюз для маленького отдела на Red Hat 9 in LinuxНаписал Федор
Опубликовано в: Установка и конфигурация Samba на CentOS 7 in LinuxНаписал Evgenytrl
Опубликовано в: Загрузка файлов с помощью Wget in Linux