Настройка nginx apache в centos

Обновлено: 04.07.2024

Устанавливаем компоненты

Это своего рода чек-лист для проверки наличия компонентов:

Перед настройкой. Важно для понимания!

Общая картина выглядит следующим образом:

Ну, и сразу тогда разберемся со структурой этих папок, подготовим их.

Вы можете придумать свою структуру, но лично я, как и многие другие вебмастера, использую следующую (просто посмотрите, а чуть позже создадим):

И для каждого сайта создаем две папки:

Теперь создаем это все одной командой:

*таким образом мы создали все необходимые папки для одного сайта.

Не забываем назначить владельца папки:

И дать права на эту папку:

*тогда наш отдельный новый конфиг будет подхватываться сервисом автоматически.

Открываем на редактирование и правим (раскомментируем):

То есть можно выполнить команду:

*тогда откроется несуществующий файл, мы туда занесем инфу, сохраним его и файл тут же создастся с этим содержимым.

Классический конфиг выглядит так:

Сохраняем и проверяем корректность настроек конфига:

В принципе, теперь можно перейти к настройке конфига nginx. Но для мозгоебов перфекционистов, к которым я себя тоже отношу, можно пойти по пути универсализации этого конфига.

Этот блок можно пропустить и читать уже про наcтройку конфига nginx. Здесь я просто попытаюсь его изменить так, чтобы для каждого нового сайта исправлять конфиг приходилось самый минимум, то есть сделать его практически универсальным.

Мы видим, что у нас часто повторяется название сайта site1 . ru. И для каждого нового домена придется менять его снова во многих местах. Это неудобно, поэтому сделаем так, чтобы его приходилось менять только в одном месте.

Для этого название сайта определим в переменную, а потом будем просто использовать эту переменную в любом месте.

Никуда не пишем, просто для понимания:

Теперь в том месте, где нам понадобится вывести название нашего сайта, мы просто будем писать:

Итоговый конфиг такой:

Здесь одинаковым блоком может стать:

Но, чтобы он стал универсальным и подходил для любого домена, нужно $ заменить на * (звездочку).

Конфиг для NGINX

Перед созданием нового конфига, нужно проверить, чтобы в основном конфиге сервиса /etc/nginx/nginx.conf была раскомментирована строка:

*тогда наш новый конфиг подхватится сервисом автоматически.

Открываем и проверяем:

И в него заносим:

Проверяем корректность настройки конфига:

Важно! После каждого изменения любого конфига, необходим перезапуск сервиса!

В качестве ftp лучше использовать sftp. Установка sftp на centos 7 рассмотрена в этой статье.

Веб-сервер, настроенный по данной инструкции можно будет использовать для размещения собственных сайтов в локальной сети или сети Интернет. Данная инструкция проверена для CentOS 7.

Общая настройка системы

Установка пакетов

1. Обновляем CentOS:

2. Устанавливаем репозиторий EPEL и пакет для загрузки:

yum install epel-release wget

Время

1. Устанавливаем часовой пояс:

timedatectl set-timezone Europe/Moscow

* данной командой мы установим часовой пояс по московскому времени.

2. Устанавливаем и запускаем службу для автоматической синхронизации времени:

yum install chrony

systemctl enable chronyd --now

Настройка безопасности

1. Отключаем SELinux:

sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

* первая команда редактирует конфигурационный файл, чтобы SELinux не запускался автоматически, вторая — отключает его разово. Подробнее читайте статью Как отключить SELinux.

2. Открываем необходимые порты в брандмауэре:

firewall-cmd --permanent --add-port=/tcp

firewall-cmd --permanent --add-port=/tcp

* 80, 443 и 8080 порты для веб-сервера; 20, 21 порты нужны для работы FTP; 60000-65535 также необходимы для работы FTP (динамические порты для пассивного режима); последняя команда перезапускает firewalld, чтобы применить новые правила. Подробнее про настройку firewalld.

Установка NGINX

yum install nginx

Внесем небольшую корректировку в файл nginx.conf:

* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.

Разрешаем автозапуск сервиса и запустим его:

systemctl enable nginx --now

Проверим, что веб-сервер работает. Для этого открываем браузер на другом компьютере, который находится в одной сети и вводим в адресной строке IP-адрес сервера. В итоге мы должны увидеть заголовок «Welcome to nginx!»:

Заголовок Welcome to nginx!

* обратите внимание, что данное приветствие может иметь и другой вид.

Установка PHP и PHP-FPM

Устанавливаем PHP и php-fpm следующей командой:

yum install php php-fpm

* В CentOS 7 будет установлена php версии 5.4. Если необходимо установить PHP 7, читайте статью Как установить PHP 7 на CentOS 7.

Запускаем php-fpm и разрешаем его автозапуск:

systemctl enable php-fpm --now

Настройка связки NGINX + PHP

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

В секции location редактируем параметр index на следующее значение:

location / index index.php index.html index.htm;
>

* добавляем index.php в начало списка. Если параметра index нет, создаем его.

А внутри секции server добавим следующее:

Открываем настройки php-fpm:

Проверяем, настройки параметров:

. иначе, меняем значение. После перезагружаем php-fpm:

systemctl restart php-fpm

Проверяем правильность настроек nginx:

И перезагружаем его:

systemctl restart nginx

Создаем index.php в каталоге сайта по умолчанию со следующим содержимым:

Открываем в браузере IP-адрес нашего сервера. Теперь мы должны увидеть сводную информацию по PHP и его настройкам, например:

Информация о php (phpinfo)

Установка MariaDB или MySQL

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

Устанавливаем MariaDB следующей командой:

yum install mariadb-server

* будет установлена mariadb версии 5.5. Если нужна другая, то читаем подробнее в инструкции Установка MariaDB на CentOS или Ubuntu.
** для установки mysql выполняем команду yum install mysql

Разрешаем автозапуск и запускаем СУБД:

systemctl enable mariadb --now

* для работы с mysql меняем mariadb на mysql.

Сразу создаем пароль для учетной записи root:

mysqladmin -u root password

PHP + MariaDB (MySQL)

Для возможности подключаться к базе данных скриптами PHP необходимо установить следующие модули:

yum install php-mysqli

Если мы установили php5, также ставим php-mysql:

yum install php-mysql

После перезагружаем php-fpm:

systemctl restart php-fpm

И открываем наш сайт в браузере. В phpinfo появится новая секция MySQL:

В phpinfo появилась информация о поддержке MySQL

* нас не должно смущать, что установили мы mariadb, а заголовок mysql. Если посмотреть в таблицу, можно увидеть ячейку Client API version, в которой указано, что используется именно mariadb.

Установка phpMyAdmin

Для установки phpMyAdmin вводим следующую команду:

yum install phpmyadmin

Однако, если мы устанавливали php версии 7 и выше, необходимо указать репозиторий, который мы использовали для этого, например:

yum --enablerepo=remi-php74 install phpmyadmin

* в данном примере предполагается, что мы использовали репозиторий remi-php74.

Это необходимо для корректной установки расширений PHP.

Теперь создадим для него отдельный виртуальный домен в NGINX:

И добавим в него следующее содержимое:

server listen 80;
server_name phpmyadmin.dmosk.local;
set $root_path /usr/share/phpMyAdmin;

location / root $root_path;
index index.php;
>

* где phpmyadmin.dmosk.local — адрес для виртуального домена, именно этот адрес должен быть введен в адресную строку браузера, чтобы открылся нужный сайт. Поэтому есть нет возможность зарегистрировать домен и имя узла в DNS, можно воспользоваться локальным файлом hosts. /usr/share/phpMyAdmin — это каталог, в который по умолчанию устанавливается phpMyAdmin.

После перезапускаем NGINX:

systemctl reload nginx

Также нужно перезапустить php-fpm, так как в процессе установки был добавлен модуль mbstring:

systemctl restart php-fpm

Установка Memcached

Первым этапом мы установим и настроим сервис memcached. Вторым — модуль php-memcached.

Сервис memcached

Выполняем установку пакетов:

yum install memcached

После разрешаем автозапуск и запускаем сервис кэширования:

systemctl enable memcached --now

Модуль для php

Установить компонент из репозитория:

yum install php-pecl-memcached

После устаноки модуля перезапускаем php-fpm:

systemctl restart php-fpm

Чтобы проверить, что модуль memcached работаем, открываем наш сайт в браузере — в phpinfo должна появиться новая секция:

В phpinfo появилась информация о поддержке Memcached

. или вводим команду:

php -m | grep memcached

Мы должны получить:

Установка xCache

xCache не поддерживается в php7. Если мы установили именно эту версию, пропускаем установку данного пакета.

Запускаем установку xCache следующей командой:

yum install php-xcache

systemctl restart php-fpm

В phpinfo должно появиться следующее:

В phpinfo появилась информация о поддержке xCache

Установка и настройка FTP-сервера

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

yum install proftpd proftpd-utils

Создаем каталог для хранения настроек:

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

ftpasswd --passwd --file=/etc/proftpd.d/ftpd.passwd --name=ftpwww --uid=48 --gid=48 --home=/var/www --shell=/sbin/nologin

* где /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; ftpwww — имя пользователя (логин); uid и gid — идентификаторы пользователя и группы системной учетной записи (apache); /var/www — домашний каталог пользователя; /sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.

Открываем на редактирование конфигурационный файл proftpd:

И редактируем следующее (комментируем):

В конце файла добавим следующее:

UseIPv6 off
IdentLookups off
PassivePorts 60000 65535

RequireValidShell off
AuthUserFile /etc/proftpd.d/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c

* где 60000 - 65535 — диапазон динамических портов для пассивного режима.

Разрешаем автозапуск FTP-серверу и запускаем его:

systemctl enable proftpd --now

Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.

Это базовая и самая простая настройка ProFTPd, но если необходимо настроить TLS или хранить виртуальных пользователей в базе MySQL, читайте подробнее инструкцию по настройке ProFTPd на CentOS 7.

Несмотря на то, что мы установили и настроили PHP-FPM, Apache нам понадобится, как минимум, по двум причинам. Во-первых, многие сайты используют файл .htaccess, который читает только Apache. Во-вторых, последний включает большое число модулей, которые может использовать портал.

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

Заходим в настройки:

И редактируем следующее:

* наш веб-сервер будет слушать на порту 8080, так как на 80 уже работает NGINX.

<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>

* если не указан конкретный скрипт, сначала веб-сервер пытается найти и запустить index.php, затем index.html

<Directory /var/www/*/www>
AllowOverride All
Options Indexes ExecCGI FollowSymLinks
Require all granted
</Directory>

* где Directory — разрешенные каталоги для запуска из apache; Options — разрешенные опции; Require — с каких IP-адресов можно открывать сайты, определенные в данном каталоге. Итого, мы разрешаем все каталоги в /var/www, но только если следующий каталог будет www; разрешаем опции Indexes (возвращает список файлов, если нет индексного файла, например, index.php), ExecCGI (разрешены сценарии CGI), FollowSymLinks (включены символические ссылки в этом каталоге); доступ для данных каталого разрешен со всех адресов (all granted).

Разрешаем автозапуск и запускаем службу:

Создаем php-файл со следующим содержимым:

Открываем браузер и вводим в адресную строку IP-адрес нашего сервера и добавляем :8080. Мы должны увидеть привычную страницу:

Проверка работоспособности Apache с помощью phpinfo

NGINX + Apache

Ранее нами была настроена связка nginx + php-fpm. Теперь проверяем совместную работу первого с apache.

Открываем конфигурационный файл nginx:

* если при настройке nginx мы редактировали файл /etc/nginx/nginx.conf, то необходимо открыть его.

Находим наш настроенный location для php-fpm:

Проверяем и перезапускаем nginx:

systemctl restart nginx

Пробуем открыть в браузере IP-адрес нашего сервера — должна открыться та же страница, что при проверке Apache (с добавлением 8080):

Проверка работоспособности Apache с помощью phpinfo

Apache Real IP

Для решения проблемы будем использовать модуль mod_rpaf. Устанавливаем набор разработчика для apache:

Переходим в каталог /usr/local/src:

Переходим в распакованный каталог:

Собираем модуль и устанавливаем его:

* при возникновении ошибки ./apxs.sh: line 15: -c: command not found, необходимо поставить which командой yum install which.

Создаем конфигурационный файл со следующим содержимым:

И редактируем содержимое на:

Открываем браузер и вводим в адресную строку IP-адрес нашего сервера. Мы должны увидеть внешний адрес компьютера, с которого обращаемся к серверу.

Postfix

В CentOS postfix уже установлен и запущен. Нам необходимо сделать несколько простых настроек:

myorigin = $mydomain
smtp_generic_maps = hash:/etc/postfix/generic_map

Открываем карту пересылки:

* данной настройкой мы будем подставлять всем отправляемым письмам без поля FROM адрес no-reply@dmosk.local.

Для применения настроек перезагружаем почтовый сервер:

systemctl restart postfix

Тюнинг веб-сервера

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

И правим следующее:

upload_max_filesize = 256M
post_max_size = 256M
short_open_tag = On
date.timezone = "Europe/Moscow"

systemctl restart php-fpm

NGINX

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

И правим следующее:

После перезапускаем nginx:

systemctl restart nginx

Postfix

Чтобы отправляемая почта меньше попадала в СПАМ, необходимо выполнить следующие шаги:

Создание первого сайта

Задаем переменную, значение которой будет домен сайта:

Создаем новый файл виртуального домена NGINX:

* обязательно на конце должен быть .conf, так как только такие файлы веб-сервер подгружает в конфигурацию.

И добавляем следующее содержимое.

access_log /var/www/site1/log/nginx/access_log;
error_log /var/www/site1/log/nginx/error_log;

gzip on;
gzip_disable "msie6";
gzip_min_length 1000;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ expires modified +1w;
>
>

* где site1.local — домен, для которого создается виртуальный домен; /var/www/site1 — каталог, в котором будет размещаться сайт.
** все запросы будут переводиться на локальный сервер, порт 8080, на котором работает apache, кроме обращений к статическим файла (jpg, png, css и так далее).
*** обратите внимание на выделения полужирным — здесь нужно подставить свои данные.

/.well-known root /usr/share/nginx/html;
allow all;
>
if ($uri !

server listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/cert.key;

access_log /var/www/site1/log/nginx/access_log;
error_log /var/www/site1/log/nginx/error_log;

gzip on;
gzip_disable "msie6";
gzip_min_length 1000;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

/.well-known root /usr/share/nginx/html;
allow all;
>

* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ expires modified +1w;
>
>

Теперь создаем виртуальный домен в Apache:

<VirtualHost *:8080>
Define root_domain site1.local
Define root_path /var/www/site1

ErrorLog $/log/apache/error_log
TransferLog $/log/apache/access_log

php_admin_value upload_tmp_dir $/tmp
php_admin_value doc_root $
php_admin_value open_basedir $:/usr/local/share/smarty:/usr/local/share/pear
php_admin_value session.save_path 0;0660;$/tmp
</VirtualHost>

Создаем каталоги для сайта:

mkdir -p /var/www/$TMP_SITE/

mkdir -p /var/www/$TMP_SITE/log/

Создаем индексный файл со следующим содержимым:

Задаем права на папки:

chown -R apache:apache /var/www/$TMP_SITE

chmod -R 775 /var/www/$TMP_SITE

Проверяем корректность настроек конфигурационных файлов:

systemctl reload nginx

Открываем сайт в браузере.

При необходимости, создаем базу данных.

> CREATE DATABASE site1 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

* данными sql-командами мы создаем базу данных site1 и предоставляем к ней доступ для учетной записи dbuser с паролем password. При желании сделать соединение более безопасным, можно убрать WITH GRANT OPTION.


Установка nginx

Я писал статью по этой теме, по этому Вы можете легко найти:
1. Установка и подключения репозитория EPEL

После подключения всех репозиториях, выполняем:

Я сейчас сделаю так, чтобы веб-сервер nginx автоматически стартовал при запуске ОС. Для этого:

Конфигурация Nginx

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

Установка Apache2

Конфигурация Apache

Нужно немного подредактировать конфигурационный файл в apache и привести к такому виду:

Мой рабочий конфиг Вы можете посмотреть тут, можно так же и скачать (но не забудьте переименовать его):

Установка модуля RPAF

Сейчас все запросы к апачу поступают не от удаленных посетителей, а уже от nginx, то в итоге IP-адрес посетителя apache будет оприделятся как локальный (127.0.0.1). Собственно, чтобы решить эту проблему нужно установить и настроить модуль RPAF. Расскажу как работает данный модуль:

Собственно, нечего непонятного тут нет, RPAF берет тело заголовка X-Forwarded-For, который прислал наш фронтенд (веб-сервер nginx) и делает замену в заголовке REMOTE_ADDR на бекенде (веб-серера apache).

У меня этот метод установки почему то не работал, по этому я решил свою проблему немного по другому.

После чего я перейду в папку src:

После этого я скачаю архив с исходным кодом mod_rpaf:

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

После чего, выполняем команду и устанавливаем данный модуль в апач:

Настройка модуля RPAF

Следующим шагом будет настройка модуля, для этого откроем нужный файл и впишем в него некоторые изменения:

Не забываем поставить еще PHP5, базы данных (Mysql, MariaDB, MongoBD, oracle или любую другую), на сайте можно найти многое по различным темам.

Кроме функции веб-сервера, программа может работать в качестве обратного прокси, прокси для TCP/UDP или почты, а также в качестве балансировщика нагрузки. Nginx используется для обеспечения работы огромного количества сайтов в сети интернет, а также известна, как самый высокопроизводительный веб-сервер. В этой статье мы рассмотрим, как выполняется установка Nginx CentOS 7, а также как выполнить первоначальную настройку программы.

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

Веб-сервер Nginx есть в официальных репозиториях дистрибутива, та версия уже устарела, и если вы хотите получить новую версию с современными возможностями, вам придётся использовать репозиторий EPEL. Для его добавления в систему выполните:

yum install epel-release


Затем можно установить Nginx:

yum install nginx

Чтобы запустить сервис Nginx, выполните:

systemctl start nginx

Затем необходимо добавить программу в автозагрузку:

systemctl enable nginx


Далее надо разрешить трафик для веб-сервера в брандмауэре системы:

И перезагрузить брандмауэр:

Если все было сделано правильно, то, открыв адрес сервера, на который вы устанавливали Nginx, вы увидите страницу по умолчанию:


Настройка расположения файлов сайта

Установка Nginx CentOS 7 завершена, теперь будет рассмотрена настройка Nginx. Нам нужно сообщить Nginx, где будут находится файлы нашего сайта. В конфигурационном файле /etc/nginx.conf, уже настроен один виртуальный хост. Его мы и будем использовать. Здесь указана опция default_server, поэтому он будет открываться для всех запросов к Nginx:


Сначала нужно создать само расположение файлов. Создайте папку /var/www/html/default, в которой будут храниться наши файлы сайтов, и дайте на неё права пользователю nginx:

mkdir /var/www/html/default
chown nginx:nginx /var/www/html/default

Также можно создать файл index.html в этой папке для теста веб-сервера с таким текстом:

Этот файл тоже должен принадлежать пользователю Nginx. Далее в конфигурационном файле /etc/nginx/nginx.conf найдите секцию server и замените значение параметра root на /var/www/html/default:

Теперь Nginx будет брать файлы сайта из этого каталога при всех запросах. Перезапустите Nginx:

systemctl restart nginx


Если возникает ошибка, убедитесь, что у Nginx есть права для доступа к этому файлу, а также, что SELinux отключён или правильно настроен.

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

Если вам нужен Nginx, то скорее всего, вам нужно также настроить его для работы с интерпретатором PHP. Дальше будет разобрана настройка php-fpm Nginx CentOS 7. Прочитать более подробно про установку PHP 7 в CentOS можно в отдельной статье, а в этой статье мы будем работать с версией, доступной в официальных репозиториях. Для Nginx нам необходимо установить пакет php-fpm:

yum install php-fpm

Затем запустите службу php-fpm командой:

systemctl start php-fpm


Далее нам осталось только связать Nginx с новой службой. Для этого в секцию server добавьте такой код:

\.php$ try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
include fastcgi_params;
>


Здесь очень важно значение этого параметра:

sudo systemctl reload nginx

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

Затем откройте адрес сервера на который был установлен Nginx плюс phpinfo.php в браузере:

Теперь вы увидите, что php-fpm nginx настроен полностью и корректно работает.

Обратите внимание, что секция location для php - это регулярное выражение и если у вас будут более общие регулярные выражения, то эта секция должна находиться перед ними, потому что Nginx не будет проверять все регулярные выражения и искать самое подходящее, а выберет первое, которое совпадёт.

Выводы

В этой статье мы разобрали, как установить Nginx CentOS 7, а также как настроить первый веб-сайт и подключить обработку скриптов с помощью интерпретатора php-fpm. В следующих статьях разберёмся с настройкой виртуальных хостов для Nginx и SSL-сертификатов.





Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Оцените статью:

(2 оценок, среднее: 5,00 из 5)

Об авторе

5 комментариев

А зачем php в статье про nginx? мб стоит как то более подробно расписать возможности nginx, например stream проксирование, либо возможность разным сайтам работать под разными пользователями. Подобных этой статей слишком много уже.

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

Я полчаса потратил на ковыряние конфигов, только после твоего коммента дошло! Сайт нормальный вроде, но авторы косячат иногда!

Читайте также: