Настройка web сервера в centos 7

Установка и оптимальная настройка Nginx + LAMP (CentOS 7)

Недавно приняли решение переехать с хостинга на VPS, будем использовать: CentOS 7, Nginx, Apache, PHP, MySQL.

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

Настраивать сервер как Вы уже поняли будем первый раз, поэтому о актуальности статьи можно будет судить из комментариев. Nginx будет отдавать статику, а динамику Apache (скрипты PHP), чтобы снизить нагрузку на сервер.

Подготовка.

Все настройки будем применять на рабочем сервере нашего проекта с конфигурацией сервера: CPU — 2 × 2000 МГц и RAM — 2048 МБ.

Для начала работы находим подходящий VPS с предустановленной CentOS 7, к серверу будем подключаться по SSH через PuTTY.

Вводим название хоста и порт, нажимаем Open:Далее вводим логин [Enter], потом пароль (обратите внимание, ввод пароля не отображается) [Enter]: Обновить систему, при этом сохранить устаревшие версии пакетов: Или обновить все пакеты, старые пакеты будут удалены: Устанавливаем файловый менеджер с текстовым интерфейсом — Midnight Commander:
Устанавливаем текстовый редактор — Nano:
Проверяем сколько на сервере оперативной памяти и сколько доступно, а также наличие SWAP. Когда заканчивается оперативная память, данные перемещаются на диск, что замедляет работу сервера, работа SWAP нежелательна, но позволяет подстраховать себя:
Создаём файловую структуру и пользователей под сайты. Создаём каталог (папку) для файлов под все сайты:
Под каждый отдельный сайт выполните такие действия. Содержимое каждого сайта будет находиться в собственном каталоге, поэтому создаём нового пользователя и отдельный каталог для разграничения прав доступа:  -b папка в которой будет создан каталог пользователя  -m создать каталог  -U создаём группу с таким же именем как у пользователя  -s /bin/false отключаем пользователю shell Делаем каталоги для данных сайта (файлы сайта, логи и временные файлы): Изменяем владельца и группу на каталог, включая вложенные папки: Изменяем права доступа на каталог — name.site:
Устанавливаем Nginx.

Инструкции по установке приведены на официальном сайте Nginx.

Для настройки репозитория yum в CentOS создаём файл /etc/yum.repos.d/nginx.repo: Открываем файл nginx.repo: Вставляем такое содержимое и сохраняем файл: Для проверки подписи загружаем ключ и импортируем его в менеджер пакетов rpm: Устанавливаем Nginx: Запускаем:
Временно останавливаем:
Устанавливаем Apache и PHP.

Устанавливаем Apache (в CentOS — httpd): Устанавливаем PHP: Запускаем Apache:
Временно останавливаем:
Настраиваем Nginx. Добавляем в автозагрузку: Открываем основной конфигурационный файл: Редактируем и сохраняем:/etc/nginx/nginx.

conf
От какого пользователя запускаем Nginx: Указываем количество рабочих процессов (зависит от количества ядер процессора и количества жёстких дисков, потому что головка диска быстрее перемещаться не сможет): Идентификатор процесса запущенного сервера: Секция events: Внутри блока events, максимальное количество одновременных соединении с сервером (worker_processes × worker_connections): Внутри блока events, принимать соединения сколько будет возможно: Секция http, остальное будет находиться внутри неё: Записывать ошибки (уровня: warn, error, crit, alert) по указанному пути: Отключаем запись журнала доступа (жёсткий диск скажет спасибо): Установим кодировку по умолчанию: Отключим показ версии Nginx: Подключить mimetypes: Если MIME-тип файла не удастся определить, то по умолчанию файл будет бинарным: Закрывать соединение если клиент не отвечает: Читать заголовок запроса клиента не более 15 секунд: Читать тело запроса клиента не более 30 секунд — интервал устанавливается не на всю передачу тела запроса, а только между двумя последовательными операциями чтения: Если клиент не принимает ответ более 15 секунд, сбрасываем соединение: Держим соединение открытым не более пяти секунд: Максимальное количество запросов с открытым соединением от одного клиента: Запросы больше 8 мегабайт принимать не будем: Чтобы один пользователь не занял весь свободный канал трафика, после 30 Мб наложим ограничение на скорость отдачи данных: Максимальная скорость с клиентом в рамках одного соединения после наложенных ограничений будет не более 500 Кб/с: Устанавливаем максимальное количество файлов, информация о которых будет содержаться в кеше и удаляться, если файл не будет запрошен повторно в течении 3 минут: Если файл будет запрошен более 2 раз, поместить в кэш: Проверять актуальность кэша каждую минуту: Отдавать статику без посредников: Не буферизировать данные: Отправлять заголовки одним пакетом: Подключить конфиги:
Для каждого сайта создаём виртуальный хост Nginx. Чтобы Nginx получил доступ к файлам сайта, добавим пользователя nginx в группу name.site: Затем создаём конфигурационный файл: Открываем файл: Редактируем и сохраняем:/etc/nginx/conf.d/name.site.conf
Сервер слушает на 80 порту: Имя сервера, определяет в каком блоке будет выполнен запрос, указывается имя домена: Путь к журналу ошибок Nginx конкретного сайта: Перенаправить запрос Apache: Обрывать коннект через 300 секунд, если превышен таймаут при чтении ответа с сервера Apache: Передать заголовки: Передать IP клиента: Передать список серверов по которым прошёл запрос и добавить свой: Отключить буферизацию проксируемого сервера: Статику будет отдавать Nginx:
Настраиваем Apache. Посмотрите какой именно модуль Apache у вас установлен. У меня — apache2-mpm-prefork (один процесс с одним потоком будет обрабатывать одно соединение, рекомендуется как безопасный совместно с PHP): Открываем httpd.conf: Редактируем и сохраняем:httpd.conf
Устанавливаем корневой каталог Apache: Каталог где будут храниться файлы сайтов: Подгружаем конфигурационные файлы: От какого пользователя запускаем сервер: От какой группы запускаем сервер: Указываем IP и порт с которых будем принимать запросы, снаружи этот сервер видно не будет: Имя хоста и порт для определения самого себя: Адрес электронной почты который отправляется клиенту в случае ошибок: Отключаем отправку информации версии системы и сервера Apache: Отключаем отправку клиенту в заголовке информацию о Apache: Ограничиваем использование памяти 750 мегабайтами: Максимальное время приёма запроса, обработки, отправки контента серверу Nginx: Устанавливаем кодировку: Задаём язык содержимого: Отключаем обработку большого количества запросов в одном соединении: Выключить генерацию Content-MD5 заголовков HTTP: Apache статику отдавать не будет, поэтому отключаем: Записываем ошибки Apache по указанному пути /etc/httpd/logs/error_log: Указываем c какого уровня записывать ошибки: Подключить mimetypes: Секция Directory: Внутри блока Directory, в случае указания пути до каталога, по умолчанию отдавать index.php:: Внутри блока Directory, запретить переопределение информации доступа в .htaccess: Внутри блока Directory, запретить доступ к файлам сервера: Секция mpm_prefork_module: Внутри блока mpm_prefork_module, после запуска Apache создать 5 процессов: Внутри блока mpm_prefork_module, минимальное количество неиспользуемых процессов (если все процессы будут заняты, то запустятся новые свободные процессы): Внутри блока mpm_prefork_module, максимальное количество неиспользуемых (запасных) процессов: Внутри блока mpm_prefork_module, максимальное количество дочерних процессов которые можно запустить одновременно, остальные встают в очередь (с увеличением дочерних процессов, увеличивается потребление памяти): Внутри блока mpm_prefork_module, после указанного числа обработанных запросов, процесс перезапускается (необходимо при переполнении — утечки памяти): Закрываем доступ к .htaccess: Подгружаем конфигурационные файлы:
Для каждого сайта создаём виртуальный хост Apache. Добавляем пользователя apache в группу каждого сайта: Создаём каталог под конфигурационные файлы виртуальных хостов Apache: Создаём конфигурационный файл: Открываем файл: Редактируем и сохраняем:/etc/httpd/sites-enabled/name.site.conf
Блок VirtualHost, указывается какой порт слушать: Имя домена: Зеркало домена: Каталог где будут храниться файлы этого сайта: Открыть доступ к файлам сайта: Если путь указан до каталога, по умолчанию открывать: Путь к журналу ошибок Apache конкретного сайта: Путь к журналу доступа:
Проверка Nginx и Apache. Добавляем Apache в автозагрузку: Создаём, редактируем и сохраняем файл: Копируем конфиг php: Запускаем Nginx и Apache:
Настраиваем PHP. Открываем php.ini: Редактируем и сохраняем:/etc/php.ini
Включаем интерпретатор PHP, по необходимости можно выключить на конкретном сайте: Отключаем заголовки отправляемые клиенту о PHP: Отключаем короткую запись тегов PHP : Выключаем сжатие страниц: Отключаем опасные функции: Не выводить на экран ошибки возникшии во время старта PHP: Не показывать ошибки: Логируем ошибки, после выключения их вывода на экран: Файл в который будут записываться ошибки: Не записывать одинаковые ошибки, которые проиcходят в конкретном файле и строке (ignore_repeated_source — нужно выключить): При включении не записывает одинаковые ошибки, которые могут происходить в разных файлах и строках, поэтому выключаем: Выключить HTML теги при просмотре сообщений об ошибках: Складываем данные в буфер:
Буферизация вывода для всех файлов, максимальное количество:

Используем кэш realpath, тем самым уменьшая количество вызовов stat():
Установим время хранения кэша 30 минут: Включаем сборщик циклических ссылок: Указываем максимальное время в течении которого будут приниматься данные на сервер (POST, GET, HEAD), время измеряется с запуска PHP до момента выполнения скрипта:
Указываем максимальное время выполнения скрипта (значение не больше чем в Apache — Timeout) — вместо set_time_limit:
Разрешить загрузку файлов на сервер: Максимальный размер памяти, который можно использовать скрипту: Максимальный размер данных, отправляемых методом POST (должно быть меньше — memory_limit): Максимальный размер закачиваемого файла (должно быть меньше — post_max_size): Количество файлов, которые можно передать за один запрос: Путь до каталога с модулями расширения: Устанавливаем временную зону: Тип данных: Устанавливаем кодировку UTF-8: Порядок обработки переменных — $_COOKIE, $_GET, $_POST, $_SERVER: Не объявлять переменные argv и argc: Переменные SERVER и ENV будут создаваться в момент использования, что приводит к увеличению производительности: Выключаем динамическую подгрузку, влияет на безопасность: Разрешаем работу с внешними файлами по URL: Отключаем использование внешних файлов:
Устанавливаем и настраиваем MySQL. Отрываем my.cnf: Количество параллельных процессов, обрабатывающих конкурентные запросы к MySQL (количество ядер умноженных на два): Устанавливаем кодировку по умолчанию для новых таблиц: Будем использовать таблицы InnoDB: Устанавливаем размер буфера индексов таблиц в оперативной памяти (актуально для таблиц MyISAM): Буфер данных и индексов таблиц — InnoDB: Максимальный размер оперативной памяти, выделяемой для временных таблиц, создаваемых MySQL: Максимальное количество открытых таблиц, которые будут находиться в кэше: Буфер данных, который используется для записи информации на диск — InnoDB:
Отключаем кэширование запросов:
Размер буфера который используется для сортировки (ORDER BY) или группировки GROUP BY) данных в каждом потоке: Выделяем для каждого потока память на каждую таблицу, при увеличении этого значения может пострадать скорость выполнения запроса: Влияет на скорость сортировки, для запросов с — ORDER BY: Размер буфера с использованием JOIN, если не используются индексы в этих запросах: Размер стека, место для хранения списка задач (открыть или закрыть таблицу, выполнить запрос и т.п.): Выделяем память для буфера соединения и его результатов, может быть увеличено до max_allowed_packet: Максимальный размер данных, которые можно передать за один запрос: Максимальное количество одновременных соединений: Количество соединений, которые могут стоять в очереди: Слушать только localhost: Не использовать TCP/IP соединения, передавать данные через сокет: Чтобы рассчитать примерное потребление оперативной памяти на сервере MySQL (насколько я понял) можно воспользоваться следующей формулой (не забывайте, что серверу Apache уже выделено 750 МБ и ещё нужно оставить серверу Nginx):
Немного про безопасность. Под root заходить нежелательно, поэтому создаём нового пользователя: Задаём пароль пользователю — newuser: Устанавливаем пакет sudo: Заносим нового пользователя в sudo: Если вы подключаетесь к SSH через 22 порт, то нужно его изменить, открываем sshd_config: Меняем порт на любой свободный (не забываем через установленный у вас firewall закрыть 22 порт и открыть новый, например 54139): Запрещаем попытку входа с пустым паролем: Запретим вход в терминал root: Разрешим логиниться в терминале только новому пользователю — newuser: Перезагружаем ssh: P.S. Можно использовать Nginx с php-fpm, но есть такое мнение, что при правильно настроенном Apache особой разницы в производительности не наблюдается.

Читайте также:  Установка и настройка zabbix 4.0

Особое внимание хотелось обратить на безопасность и производительность сервера, поэтому если вы нашли ошибки или недочёты, просим написать это в комментариях и в случае необходимости мы внесём изменения в статью.

Источник: https://habr.com/post/311212/

Web-сервер на CentOS 7: Nginx, PHP 7.x, PerconaDB

У меня уже были ранее записи, про установку PHP 7 на CentOS. В этот раз у меня появилась задача поднять сразу веб-сервер с нуля на базе операционной системы CentOS 7.

Пользуясь случаем, решил записать последовательность действий для экономии времени в будущем.

Возможно, вы тоже решили установить веб-сервер под CentOS 7 с последней версией PHP 7, тогда этот материал вам тоже будет полезен.

Список актуальных версий пакетов на момент установки:

  • Веб-сервер Nginx 1.13.4
  • Менеджер процессов FastCGI PHP 7.1.7
  • MySQL сервер Percona 5.7

Предварительная настройка

Настройку сервера начнем с предварительной настройки сервера. Для начала я отключу firewalld, в дальнейшем доступ к серверу будет ограничен через iptables. Для отключения firewalld в CentOS 7 выполните следующие команды:

systemctl disable firewalld systemctl stop firewalld

Создаем файл с правилами iptables:

mkdir -p /etc/iptables vi /etc/iptables/rules.v4

Добавляем в содержимое файла следующие строки:

*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT # DROP INVALID PACKETS -A INPUT -m conntrack –ctstate INVALID -j DROP # ICMP -A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT # SSH -A INPUT -p tcp -m tcp –dport 22 -j ACCEPT # Если у вас статический ip, ограничьте доступ к SSH по ip-адресу. # Меняем адрес 1.2.3.4 на свое значение и меняем строку выше на следующую: #-A INPUT -s 1.2.3.4/32 -p tcp -m tcp –dport 22 -j ACCEPT # NGINX -A INPUT -i -p tcp -m tcp –dport 80 -j ACCEPT -A INPUT -i -p tcp -m tcp –dport 443 -j ACCEPT COMMIT

В дальнейшем, если вы решите настроить тот или иной сервис, для открытия порта извне необходимо добавить соответствующее правило в iptables. Дополнительно в целях защиты доступа к серверу по SSH настройте fail2ban и авторизацию по ключу.

Применяем правила:

iptables-restore < /etc/iptables/rules.v4

Добавляем выполнение правил при старте системы:

chmod +x /etc/rc.local vi /etc/rc.local

Добавляем содержимое файла:

#!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # # It is highly advisable to create own systemd services or udev rules # to run scripts during boot instead of using this file. # # In contrast to previous versions due to parallel execution during boot # this script will NOT be run after all other services. # # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure # that this script will be executed during boot. iptables-restore < /etc/iptables/rules.v4 touch /var/lock/subsys/local

Установка Nginx в CentOS

Установку Nginx в CentOS будем из официального репозитория, я рекомендую использовать более свежую mainline-версию. Для настройки репозитория yum для CentOS необходимо создать файл:

/etc/yum.repos.d/nginx.repo

C таким содержимым:

[nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/ gpgcheck=0 enabled=1

Устанавливаем Nginx:

yum install nginx

Запускаем и добавляем nginx в атозапуск при старте системы:

systemctl start nginx systemctl enable nginx

Откройте файл:

vi /etc/nginx/nginx.conf

Приведите значение параметров к следующему виду:

worker_processes auto; access_log off; server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 0;

Применяем значения параметров:

service nginx restart

Установка PHP 7 в CentOS

На данный момент PHP 7 нет в официальных репозиториях. Для установки PHP 7.1 в CentOS 7 нам понадобится добавить в систему репозиторий Webtatic. Для установки модулей есть PEAR, но его поддерживают не все модуля. Связи с чем установки неподдерживаемых PHP PEAR модулей нужно выполнять из репозитория Webtatic.

Добавим в систему EPEL и 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

Устанавливаем PHP 7.1 и наиболее часто используемые расширения:

yum install php71w-fpm php71w-opcache php71w-cli php71w-common php71w-gd php71w-mbstring php71w-mcrypt php71w-mysqlnd php71w-xml

Расширение OPcache, но я рекомендую его использовать для более быстрой работы ваших сайтов. OPcache теперь официально включен в исходный дистрибутив и поддерживается командой PHP. Это дает ему преимущество по сравнению с другим кэшем Opcode.

Список доступных для установки расширений PHP 7.1 есть на официальной странице репозитория Webtatic, в разделе Packages.

Запускаем и добавляем php-fpm в атозапуск при старте системы:

systemctl start php-fpm systemctl enable php-fpm

Теперь переходим к настройке PHP-FPM, откройте следующий файл:

vi /etc/php-fpm.d/www.conf

Раскомментируйте и приведите значение параметров к следующему виду:

user = apache group = apache listen = /var/run/php-fpm.sock listen.owner = nginx listen.group = nginx listen.mode = 0660

Перезапустим php-fpm:

service php-fpm restart

Для взаимодействия Nginx с php-fpm создайте следующую конфигурацию:

vi /etc/nginx/conf.d/default.conf

Замените содержимое файла на:

server { listen 80; server_name test.net; root /usr/share/nginx/html; index index.php index.html; location ~ .php$ { try_files $uri = 404; fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }

Применяем значение параметров:

service nginx restart

Установка Percona в CentOS

Устанавливать PerconaDB, MySQL или MariaDB — дело личного предпочтения. В данной статье речь пойдет о установке PerconaDB на CentOS, для этого добавим в систему официальный репозиторий пакетов:

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm

Устанавливаем Percona Server:

yum install Percona-Server-server-57

Запускаем и добавляем Percona в атозапуск при старте системы:

systemctl start mysql

Наверно, у вас возникнет вопрос: где взять пароль root для доступа к Percona Server? В этом плане Percona проявит самостоятельность, вместо нас придумает пароль и запишет его в лог.Что бы узнать пароль root в Percona выполните команду:

cat /var/log/mysqld.log |grep generated 2017-08-13T15:25:44.331443Z 1 [Note] A temporary password is generated for root@localhost: ************

В целях безопасности, необходимо сменить этот пароль и дополнительно запретить удаленный доступ к базе. Для этого выполните команду:

# mysql_secure_installation Securing the MySQL server deployment. Enter password for user root: The 'validate_password' plugin is installed on the server. The subsequent steps will run with the existing configuration of the plugin. Using existing password for root. Estimated strength of the password: 100 Change the password for root ? ((Press y|Y for Yes, any other key for No) : y New password: Re-enter new password: Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : y Success. Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y Success. By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y – Dropping test database… Success. – Removing privileges on test database… Success. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y Success. All done!

Предупреждаю сразу, что перед изменением пароля, он будет проверен на соответствия правилам безопасности. Мне удалось поменять пароль не с первого раза, для его создания я использовал сервис. В процесс отметим галками все 4 пункта и выбрал длину пароля 12 символов. Пробовал по очереди созданные пароли до тех пор пока один из них не подошел критериям безопасности. Да, теперь так все сложно.

По поводу начальной настройки Percona. Нужно отметить, что по умолчанию Percona уже пригодна для использования. Нам остается только внести финальные штрихи.

Открываем следующий файл:

vi /etc/percona-server.conf.d/mysqld.cnf

В секцию [mysqld] добавляем следующие параметры:

bind-address=127.0.0.1 # Вредный параметр, но иногда необходимо отключить проверку пароля условиям безопасности # validate-password=off innodb_buffer_pool_size=24G innodb_log_file_size=256M innodb_flush_log_at_trx_commit = 2 innodb_flush_method=O_DIRECT max_connections=300

Что означают и для чего используются некоторые из этих параметров вы можете прочитать в статье MySQL 5.7 Performance Tuning Immediately After Installation на официальном сайте.

Самый важный параметр — innodb_buffer_pool_size. Устанавливаем равным 50%-80% от оперативной памяти, но не более размера вашей базы. Если у вас база на 100Mb устанавливаем значение параметра 200M с запасом. Для базы на 100Gb, при условии недостатка нужного количества оперативной памяти на сервере, значение параметра устанавливаем в пределах 50%-80% от оперативной памяти.

Источник: https://codebeer.ru/web-server-na-centos-7-nginx-php-7-x-perconadb/

Как установить и настроить веб-сервер на CentOS 7 (nginx, php-fpm, mysql/mariadb)

Памятка по быстрой настройке веб-сервера на CentOS 7, чтобы была под рукой.

Читайте также:  Настройка мониторинга smart жесткого диска в zabbix

Здесь все действия выполним вручную. Процесс автоматизации с использованием Vagrant планирую описать позже.

Установить CentOS 7 minimal

Зависит от того, где разворачивается веб-сервер. Локально на виртуальной машине: подключить загрузочный образ диска и пройти через подсказки при установке. На хостинге, скорее всего, уже получена готовая установленная система.

После завершения должны иметь пароль пользователя root и возможность подключиться по ssh. Для дальнейших действий предположим, что машина имеет ip-адрес 192.168.2.100

$ ssh [email protected]

После подключения к настраиваемому серверу дальнейшие команды выполняются на нём.

В будущем пригодится wget

# yum install wget

Обновить все установленные пакеты

# yum update -y

Установить репозитории epel и webtatic

(Подробнее можно посмотреть здесь: https://webtatic.com/projects/yum-repository/ )

# 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

Установить и настроить mariadb

# yum install -y mariadb-server mariadb

(За собой тянет установку perl как зависимость)

Прописать MariaDB в автозапуск:

# systemctl enable mariadb

Запустить MariaDB:

# systemctl start mariadb

Затем нужно запустить простой скрипт безопасной установки, который удалит некоторые опасные настройки по умолчанию и усложнит доступ к системе базы данных. Запустить скрипт:

# mysql_secure_installation

Система спросит текущий root-пароль. Но поскольку система MySQL только что установлена, такого пароля пока что нет, потому просто нажать enter. Затем будет задан вопрос, хотите ли вы установить пароль — ввести Y и следовать инструкциям.

На все остальные вопросы просто нажать enter.

Установить php (php-fpm)

Если устанавливать php из репозитория CentOS, то будет установлена старая версия. На момент написания статьи устанавливалась версия 5.4.14, при том, что уже существовала версия 7.1. Чтобы установить новую версию php, пригодится репозиторий webtatic.

Проверка:

# yum search php7

Установка:

# yum install php71w-common php71w-cli php71w-fpm php71w-gd php71w-mbstring php71w-mcrypt php71w-pdo php71w-mysqlnd php71w-opcache php71w-xml

Считаю, что полезно сразу установить php71w-opcache, в списке пакетов упомянуто.

php71w-pdo требуется для для php71w-mysqlnd, даже если не упомянуть в списке, будет установлено как зависимость.

Для php71w-mcrypt будут установлены зависимости: libmcrypt и libtool-ltdl.

Проверка:

# php -v

Ответ выглядит примерно так:

PHP 7.1.4 (cli) (built: Apr 15 2017 08:07:03) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
 with Zend OPcache v7.1.4, Copyright (c) 1999-2017, by Zend Technologies

Последняя строчка подтверждает, что установлено кеширование опкодов PHP — Zend OPcache.

Прописать в автозапуск:

# systemctl enable php-fpm

Запустить сейчас:

# systemctl start php-fpm

Установить nginx

Актуальная инструкция: http://nginx.org/ru/linux_packages.html

Создать файл репозитория /etc/yum.repos.d/nginx.repo и записать в него строки:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

Это можно сделать одной командой:

# echo -e “[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1” > /etc/yum.repos.d/nginx.repo

В команде echo использован ключ -e, чтобы вставить символы перевода строки «
».

Установить:

# yum install nginx

Прописать в автозапуск:

# systemctl enable nginx

Запустить сейчас:

# systemctl start nginx

SELinux

Проверить состояние:

# sestatus

Результат:

SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28

Для удобства нужна утилита semanage

# yum install policycoreutils-python

Установлено:

policycoreutils-python.x86_64 0:2.5-11.el7_3

Установлены зависимости:

audit-libs-python.x86_64 0:2.6.5-3.el7_3.1
checkpolicy.x86_64 0:2.5-4.el7
libcgroup.x86_64 0:0.41-11.el7
libsemanage-python.x86_64 0:2.5-5.1.el7_3
python-IPy.noarch 0:0.75-6.el7
setools-libs.x86_64 0:3.3.8-1.1.el7

Посмотреть, на каких портах могут работать сервисы, связанные с веб-сервером:

# semanage port -l | grep http_port

Результат:

http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988

Все нужные порты разрешены (в том числе и для php-fpm).

# semanage port -l | grep mysql

Результат:

mysqld_port_t tcp 1186, 3306, 63132-63164
mysqlmanagerd_port_t tcp 2273

Хорошо.

Открыть firewall для доступа к веб-серверу снаружи

В CentOS 7 надо использовать команду firewall-cmd:

# firewall-cmd –permanent –zone=public –add-service=http
# firewall-cmd –permanent –zone=public –add-service=https

Перезагрузить правила:

# firewall-cmd –reload

Проверить:

# firewall-cmd –zone=public –list-services

Ответ:

dhcpv6-client ssh http https

Если сделать по старинке так:

# iptables -A IN_public_allow -p tcp -m tcp –dport 80 -j ACCEPT
# iptables -A IN_public_allow -p tcp -m tcp –dport 443 -j ACCEPT

то правила потеряются после перезагрузки.

Создать пользователя для работы с файлами сайтов

# useradd -m wadmin

Ключ -m нужен, чтобы для пользователя был создан одноимённый каталог в /home

Создать ему пароль

# passwd wadmin

Если пользователя понадобится добавить в группу к веб-серверу:

# usermod -a -G nginx wadmin

 Создать каталог для размещения сайтов

Вообще, для сайтов имеется каталог /var/www, но я хочу использовать другое расположение для удобства, чтобы рядом находились и файлы сайтов, и файлы конфигурации сайтов для nginx, и домашний каталог пользователя-владельца файлов сайтов.

# mkdir /home/vhosts
# chown wadmin:wadmin /home/vhosts

Конфигурация сайта здесь:

# mkdir /home/nginx.conf.d
# chown wadmin:wadmin /home/nginx.conf.d

Добавить в конце секции http основного файла конфигурации nginx строку:

include /home/nginx.conf.d/*.conf;

Используем редактор, имеющийся под рукой:

# vi /etc/nginx/nginx.conf

Будет работать? Нет, не будет. Для новых расположений файлов конфигурации nginx  и файлов сайтов необходимо изменить контекст безопасности SELinux.

Изменить контекст безопасности SELinux рекурсивно (для каталога и вложенных файлов):

# chcon -R –type=httpd_sys_content_t /home/vhosts
# chcon -R –type=httpd_config_t /home/nginx.conf.d

Сделанные изменения контекста будут сохраняться после перезагрузки, но могут быть сброшены командой restorecon или потеряны  при повторном включении SELinux после отключения. Чтобы запомнить сделанные изменения «навсегда», надо добавить правила в политику безопасности.

# semanage fcontext -a -t httpd_sys_content_t “/home/vhosts(/.*)?”
# semanage fcontext -a -t httpd_config_t “/home/nginx.conf.d(/.*)?”

Перечитать конфигурацию nginx:

# nginx -s reload

Дополнительные настройки nginx

Для контроля скорости работы сайтов можно добавить отображение времени обработки запроса в логах веб-сервера nginx. Добавим в главный файл конфигурации формат лог-файла:

log_format main_t '$remote_addr – $remote_user [$time_local] “$request” ' '$status $body_bytes_sent “$http_referer” ' '”$http_user_agent” “$http_x_forwarded_for” $request_time';

Параметр $request_time отвечает за время обработки запроса в секундах с точностью до миллисекунд; (время, прошедшее с момента чтения первых байт от клиента до момента записи в лог после отправки последних байт клиенту).

Полезно включить сжатие для отправляемых текстовых данных. В nginx за это отвечает модуль ngx_http_gzip_module и директива конфигурации gzip, например:

gzip on;
gzip_types text/css text/plain application/x-javascript application/rss+xml;
gzip_comp_level 2;

Получится такая конфигурация:

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; events { worker_connections 1024;
} http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr – $remote_user [$time_local] “$request” ' '$status $body_bytes_sent “$http_referer” ' '”$http_user_agent” “$http_x_forwarded_for”'; log_format main_t '$remote_addr – $remote_user [$time_local] “$request” ' '$status $body_bytes_sent “$http_referer” ' '”$http_user_agent” “$http_x_forwarded_for” $request_time'; access_log /var/log/nginx/access.log main_t; sendfile on; #tcp_nopush on; keepalive_timeout 65; gzip on; gzip_types text/css text/plain application/x-javascript application/rss+xml; gzip_comp_level 2; include /etc/nginx/conf.d/*.conf; include /home/nginx.conf.d/*.conf;
}

Используем редактор, имеющийся под рукой:

# vi /etc/nginx/nginx.conf

Настройка пробного сайта

Подготовить файлы сайта:

# mkdir /home/vhosts/site
# mkdir /home/vhosts/site/p
# echo -e “

Источник: https://codedepth.wordpress.com/2017/05/10/how-to-install-and-configure-web-server/

Веб-сервер под CentOS 7

Задача: развернуть выделенную площадку для размещения нескольких веб-сайтов. Рассматриваем процесс с нуля, разделяя на несколько этапов.

Внимание! Уже появилась более прогрессивная методика для версии 7.1.

В качестве операционной системы для будущей хостинг-площадки вполне рационально выбрать операционную систему Linux, диструбутив Centos версии 7.0. Свой выбор на Centos остановим, так как дистрибутив стабильный, прекрасно обновляется, поддерживает работу с пакетами. А самое главное – является вариантом Red Hat Enterprise Linux.

Удивительные вещи, которые ждут нас в седьмой версии:

  • Отказ от iptables, теперь вместо него firewall
  • Отказ от chkconfig – теперь вместо него systemd
  • Переход с MySQL к MariaDB.

Установка операционной системы

На данный момент актуальной является CentOS 7, ориентированный исключительно на архитектуру x86_64. Скачиваем образ ISO и устанавливаем с диска, но можно поставить и с флэшки.

В процессе установки выбираем вариант Desktop: он достаточно лёгкий (не будет тащить за собой кучу лишних пакетов), а кроме того позволит на первых порах отлаживать систему в графическом режиме. В будущем установим дополнительные пакеты вручную.

Аппаратная часть

В нашем распоряжении оказался уже морально устаревший двухядерный компьютер на базе процессора E3300, имеющий 2 Гб оперативной памяти. Как показала практика, его вполне достаточно.

Разделы диска

На шаге Installation Destination нам предлагается выбрать диск для установки системы. Если ничего не трогать (Automatically Configure Partitioning), то инсталлятор самостоятельно справится с разбиением на разделы. Считаю, такие важные вещи нельзя пускать на самотёк, они требуют вмешательства; поэтому наш выбор – I will configure partitioning. Видим диалоговое окно, показанное ниже.

Распределяем место на диске.

  • Нам необходимо выделить более 82 Мб для раздела boot.
  • Всё оставшееся место за исключением размера оперативной памяти отводим под корневой раздел.
  • Наконец, остаток отдаём под файл подкачки, помечая его swap.

 В  результате разделы будут видны примерно таким образом.

 В  отличие от шестой версии, файловой системой по умолчанию в седьмой версии является XFS, а не ext4. К сожалению, в сети довелось натыкаться на негативные отзывы о ней, однако не могу высказать своё собственное мнение: я вынужден использовать ext4 для совместимости с некоторым необходимым программно-аппаратным обеспечением.

Результат команды df -h после установки:

Отладка

Первое, что надо сделать – отключить систему безопасности SELinux.

Например, включенный selinux не позволит подключаться по протоколу ftp к серверу, если в будущем поставим vsftpd, клиент будет получать сообщения об ошибке

500 OOPS: cannot change directory:/home/username

В CentOS отключение SELinux выглядит просто. Открываем файл конфига

mcedit /etc/sysconfig/selinux

меняем значение

SELINUX=disabled

перезагружаемся

reboot

Сделано, теперь нас не будут поджидать сюрпризы в будущем. Скептикам, ратующим за безопасность системы, сразу сообщаю, что наш сервер будет надёжно защищён настройкой firewall (пришёл на смену iptables). В соответствии с функциональным назначением нашего сервера настраиваем firewall, открывая для общего доступа порты 80 и 443:

firewall-cmd –permanent –zone=public –add-service=http
firewall-cmd –permanent –zone=public –add-service=https

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

firewall-cmd –reload

Проверяем, что yum установлен. Если его нет, придётся вручную тащить пакет mirror.centos. org/centos/7/os/x86_64/Packages/ и устанавливать через менеджер пакетов.

Устанавливаем необходимые пакеты, которые непосредственно отвечают за функционирование веб-сервера. В нашем случае это apache, mysql, php (для комплекса LAMP) или nginx, mysql, php (для комплекса LEMP), а возможно, и всё вместе.

Например, установка веб-сервера apache выглядит следующим образом:

yum -y install httpd httpd-devel

Запускаем службу, добавляем в автозагрузку, проверяем результат:

systemctl start httpd.service
systemctl enable httpd.service

Если потребуется перезапустить apache после каких либо настроек (или после установки php), пригодится команда

Читайте также:  Как установить или обновить php 7 на centos 7

systemctl restart httpd.service

Привычная утилита setup теперь отсутствует. Убеждаемся, что все службы будут стартовать при запуске системы с помощью systemctl is-enabled служба.

Варианты использования systemctl:

Остановка службы systemctl stop httpd.service
Запуск службы systemctl start httpd.service
Перечитать файл конфигурации systemctl reload httpd.service
Перезапуск службы systemctl restart httpd.service
Перезапуск службы, если она уже запущена systemctl try-restart httpd.service
Проверка статуса службы systemctl status httpd.service
Добавить в автозапуск systemctl enable httpd.service
Исключить из автозапуска systemctl disable httpd.service
Проверка присутствия в автозапуске systemctl is-enabled httpd.service
Вывести список служб systemctl list-unit-files –type=service

Устанавливаем PHP.

yum -y install php php-mysql php-common php-gd php-xml php-mbstring

Вариант наиболее полной установки PHP, с расчётом на разворачивание платформ для современных популярных движков Joomla, WordPress и Drupal, будет выглядеть следующим образом:

yum -y install php php-gd php-mysql php-common php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel

Если оригинальная версия php не соответствует минимальным требованиям размещаемых сайтов, можно воспользоваться описанной методикой или лучше более прогрессивной методикой.

Устанавливаем и запускаем MySQL.

yum -y install mysql mysql-server systemctl enable mysqld

systemctl start mysqld

Не забываем задать пароль root для MySQL.

Альтернативный вариант: устанавливаем и запускаем MariaDB:

yum install -y mariadb mariadb-server systemctl enable mariadb

systemctl start mariadb

Теперь готовимся к отказу от графического интерфейса.

Во всём семействе Red Hat Linux (Fedora, Red Hat, CentOS) используется следующая система уровней выполнения

  • Single-user text mode (without networking)
  • Not used (user-definable)
  • Full multi-user text mode
  • Not used (user-definable)
  • Full multi-user graphical mode (with an X-based login screen)
  • Reboot

Состояние подготовки к выключению кодируется нулём.

Так как перед нами стоит задача развернуть выделенный сервер, наиболее рационально выбрать уровень 3, который является многопользовательским, но не использует графику.

Редактируем

/etc/inittab

Прописываем

id:3:initdefault:

Теперь третий уровень выполнения становится уровнем по умолчанию, именно на нём будет работать система в случае перезапуска.

В любой момент времени проверить текущий уровень можно командой runlevel:

/sbin/runlevel

Теперь дело за малым:

  • Настроить mysql, однако необходимо заметить, что компания Red Hat предпочитает на данный момент альтернативную базу данных MariaDB
  • Настроить высокопроизводительный веб-сервер (например, связку nginx+apache), или оставить только службу httpd
  • Настроить php

Если все шаги выполнены, то у нас всё готово.

Можно клонировать сайты и запускать корабль в плавание.

Источник: http://drach.pro/blog/linux/item/33-centos-7-web-server

Как настроить виртуальный хост Apache на CentOS 7

Apache является веб-сервером c открытым исходным кодом, разработанный для современных операционных систем, включая UNIX и Windows. Это безопасный, эффективный и расширяемый сервер, предоставляющий услуги HTTP синхронизированные с текущими стандартами HTTP.

Многие люди используют его для размещения своих веб – сайтов и приложений.

На самом деле, согласно последним статистическим данным, Apache является наиболее широко используемым веб – сервер в мире, с Windows , IIS следующее на втором и на третьем месте российская разработка, которая является Nginx.

Функциональность Apache является большим, и можно найти много хороших возможностей для веб – сайта или приложения. На этом уроке, мы предоставим Вам информацию о виртуальном хосте Apache через примеры конфигурации на CentOS 7.

Виртуальный хост, на самом деле, блок, который описывает отдельный домен в грандиозной схеме веб-сервера Apache. Это позволяет размещать несколько веб-сайтов с помощью одного сервера, который очень полезен для людей, которые имеют более одного сайта.

Каждый домен, который выполнен с директивой виртуального хоста внутри конфигурации Apache будет направлять посетителя в определенный каталог , где тот самый веб – сайт размещен на сервере.

Например, ваш WordPress сайт установлен в /var/www/wordpress/ поэтому при создании директивы виртуального хоста, корень документа для сайта будет установлен в /var/www/wordpress/, который позволит веб – серверу извлекать данные из веб – сайта соответствующего настроенного каталога.

Войдите на сервер с помощью SSH:

ssh root@server_ip

Перед тем как начать, введите следующую команду, чтобы проверить есть ли у вас правильная версия CentOS, установленная на вашем компьютере:

cat /etc/redhat-release

вывод должен быть примерно такой:

CentOS Linux release 7.2.1511 (Core)

Обновление системы

Убедитесь, что ваш сервер полностью обновлен:

yum update

На наших серверах CentOS 7, Apache устанавливается по умолчанию. Однако, если у вас нет Apache установленным на вашем сервере вы можете сделать это довольно простой командой:

yum install httpd

Включите Apache и добавьте его в запуск при загрузке:

systemctl start httpd.service systemctl enable httpd.service

Большинство веб – мастеров сегодня используют WordPress в качестве платформы для размещения их на сайте.

Сайт на WordPress работает с базой данных MySQL, так что если вы планируете использовать эту статью для создания виртуальных хостов с сайтами WordPress (или на любой другой платформе, которая нуждается в базе данных), вам нужно будет установить MySQL и PHP на вашем сервере, который завершит так называемый стек LAMP (Linux Apache, MariaDB и PHP). У нас есть отличная статья о том, как установить LAMP на CentOS 7 так что вы можете проверить его здесь.

Параметры конфигурации Apache

Apache имеет глобальный конфигурационный файл, в котором все настройки по умолчанию хранятся и применяются к серверу. Директива виртуального хоста может быть сохранена в том же файле по умолчанию httpd.conf или другой, который будет соответствовать настроенному веб – сайту/домену.

Этот глобальный конфигурационный файл Apache в CentOS 7 является /etc/httpd/conf/httpd.conf. Вы можете использовать текстовый редактор по вашему выбору и посмотреть содержимое этого файла, так что вы получите некоторое представление о том, как настроен Apache.

Файл конфигурации прокомментирован перед каждой установкой, которые объясняют их использование. Так, например, ServerRoot установка верхней части дерева каталога, при которых лежат конфигурационные файлы Apache.

Listen директива связывает Apache с определенным IP – адресом и портом. Порт прослушивания Apache по умолчанию: 80.

Значения user/group являются имена user/group, работает как HTTPD (Apache). В CentOS пользователь и группа являются Apache/Apache, в Ubuntu/ Debian являются www-data/www-data.

Другим важным параметром является DocumentRoot, который является каталогом, из которого данные будут поданы к посетителю.

Как правило, в большинстве дистрибутивах корневой документ по умолчанию для Apache установлен в /var/www/html/, так что если вы посмотрите данные в /var/www/html/ вы сможете получить доступ к этим же данным через веб – браузер с помощью IP адреса сервера.

Мы рассмотрели лишь незначительную часть того, что предлагает Apache своему пользователю, так что теперь давайте создадим нашу первую директиву виртуального хоста в Apache.

Вы можете создать виртуальный хост внутри основного файла конфигурации Apache, однако, для более чистой и более организованной настройки мы создадим новый отдельный файл, в котором будут храниться конфигурационные строки.

Существует установка ( IncludeOptional ) в глобальной конфигурации сервера Apache, где включенный каталог хранит отдельные конфигурационные файлы. Например, в CentOS 7 и Apache 2.

4 (последняя версия Apache при написании этой статьи) IncludeOptional параметр установлен в /etc/httpd/conf.d/, что означает , что каждый файл * .conf, созданный в /etc/httpd/conf.d/ будет использоваться веб – сервером для обработки данных.

Поэтому, давайте создадим файл your_domain.conf, в котором мы настроим директиву виртуального хоста для вашего домена. После того, как вы вошли на свой сервер, введите следующую команду:

nano /etc/httpd/conf.d/your_domain.conf

Вставьте ниже содержание в файл:

ServerAdmin webmaster@your_domain.ru
DocumentRoot “/var/www/html/your_domain/”
ServerName your_domain.ru
ServerAlias www.your_domain.ru
ErrorLog “/var/log/httpd/your_domain.ru-error_log”
CustomLog “/var/log/httpd/your_domain.ru-access_log” combined
DirectoryIndex index.html index.php
Options FollowSymLinks
AllowOverride All
Require all granted

Поясним настройки один за другим.

  •   – это означает , что эта директива виртуального хоста связывается с любого IP – адреса на сервере , на 80 -м порту.
  •  ServerAdmin – это адрес электронной почты, куда будут присылаться уведомления о проблемах, связанные с веб – сервером.
  •  DocumentRoot – каталог, в котором данные веб – сайта будут сохранены, в приведенном выше случае это будет /var/www/html/your_domain/. Конечно, вы можете заменить your_domain на другое значение, которое вы найдете пригодным.
  •  ServerName – это значение дает имя, которое сервер использует для идентификации веб – сайта. Здесь вы можете ввести свой фактический домен.
  •  ServerAlias – директива ServerAlias устанавливает альтернативные имена хостов, например: www.your_domain.ru. Он также может включать в себя групповые символы, если это необходимо.
  •   и и используются , чтобы приложить группу директив , которые применяются только к названному справочнику, подкаталоги этого каталога, а также файлы в соответствующих каталогах. Может быть использована любая директива, которая позволяется в директивном контексте. Каталог-путь либо полный путь к каталогу или строку wild-card с использованием Unix. В нашем случае мы добавили FollowSymLinks, который будет применять символические ссылки в директории /var/www/html/your_domain/. Мы также устанавливаем директиву AllowOverride all это означает, что любая директива, которая имеет .htaccess разрешено в файлах .htaccess. Директива Require указывает, какие пользователи могут получить доступ к ресурсу.

Этот вид конфигурации могут быть применен для большинства платформ. Тем не менее, иногда определенной конфигурации WordPress сайта, такие как выше не может быть достаточно для других видов приложений. Например, сайт на Magento нужно будет включить больше возможностей или для сайта на Odoo будет нужен обратный прокси – сервер сконфигурирован.

Одну деталь, которую стоит отметить (несмотря на то, что большинство пользователей знают это) является то, что все вышеуказанные параметры конфигурации должны быть правильно установлены до или после создания файла конфигурации Apache. Например, DocumentRoot, необходимо создать и данные, размещенным в нем.

Создание каталога пользователя:

mkdir /var/www/html/your_domain/

Теперь загрузите данные, которые вы хотите разместить внутри этой директории.

Права доступа и владельца файла является еще одной важной задачей для веб – мастеров. В большинстве случаев в серверах без панели управления, файл и каталог собственность должна принадлежать пользователю и группе, в которой Apache работает.

В CentOS 7 Apache работает под управлением Apache в качестве пользователя и Apache в качестве группы. Таким образом, вам нужно будет рекурсивно присвоить, значения для файлов и каталогов в корневом каталоге документов.

Следующая команда делает именно это:

chown apache:apache -R /var/www/html/your_domain/

Эта команда будет назначать Apache: Apache для каждого файла и подкаталога/директории внутри /var/www/html/your_domain/.

В этой статье мы только поверхностно описали Apache и конфигурацию виртуального хоста. Для получения дополнительной информации, вы должны посетить официальный веб – сервер Apache для ознакомления с документацией.

Источник: https://andreyex.ru/centos-7/kak-nastroit-virtualnyj-xost-apache-na-centos-7/

Ссылка на основную публикацию