Веб-сервер на базе NGINX под CentOS 7

Описана хронология обустройства веб-окружения на виртуальном сервере под управлением операционной системы CentOS 7. Важно то, что на хостинге будет работать отечественный веб-сервер nginx (сервера Apache не будет), а сайт использует систему управления контентом Joomla.

Эта статья находится в процессе редактирования в данный момент! Её пока следует использовать осторожно, руководствуясь здравым смыслом....

По счастливой случайности мне досталась удивительная виртуальная машина, на которую администраторы хостинга натянули минимальную 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-fpm

Обратите внимание на строчку "Интерфейс между веб-сервером и PHP".

Поздравляю, всё получилось! В нашем распоряжении выскоэффективный веб-сервер.

Возможные ошибки

Если в результате запуска всех сервисов мы видим 502 Bad Gateway, значит скорее всего мы забыли определить владельца файлов сокета (советы из интернета тут просто поражают нелепостью!). Идём в /run и назначаем на файлы сокета владельца apache:apache.

4 комментарии

  • Константин

    написал Константин

    Суббота, 27 Февраль 2016 00:46

    chown -R apache:apache /var/cache/nginx/
    Так такого пользователя не существует... Скажите как его создать для данной инструкции?

    Пожаловаться
  • Владимир Драч

    написал Владимир Драч

    Понедельник, 29 Февраль 2016 20:17

    Вам не надо создавать пользователя. Если вы всё делали по данной методике, то следует в команде указать пользователя, из-под которого у вас работает nginx. Скорее всего это будет

    chown -R nginx:nginx /var/cache/nginx/
    или
    chown -R www:www /var/cache/nginx/

    Пожаловаться
  • Любовь

    написал Любовь

    Четверг, 17 Ноябрь 2016 14:00

    Подскажите, пожалуйста, чьи DNS1 и DNS2 здесь нужно прописать? IP-адрес сервера, на котором будет располагаться сайт?

    Пожаловаться
  • Владимир Драч

    написал Владимир Драч

    Пятница, 18 Ноябрь 2016 13:55

    В статье речь идёт о том, что могут быть не прописаны адреса DNS1/DNS2, которые в идеальном случае должен был указать провайдер или поставщик услуг; поэтому пришлось воспользоваться общедоступными бесплатными сервисами от компании Google (это 8.8.8.8 или 8.8.4.4). Соответственно, если провайдер Вам не предоставил эту информацию, Вам надо прописывать эти же общедоступные адреса, а не IP-адрес сервера, на котором будет располагаться сайт.

    Пожаловаться
Авторизуйтесь, чтобы получить возможность оставлять комментарии
Go to top