Общая настройка системы
Установка пакетов
1. Обновляем CentOS:
dnf update
2. Устанавливаем репозиторий EPEL и дополнительные пакеты для загрузки и распаковки:
dnf install epel-release wget unzip
Время
1. Устанавливаем часовой пояс:
\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
* данной командой мы установим часовой пояс по московскому времени.
2. Устанавливаем и запускаем службу для автоматической синхронизации времени:
dnf install chrony
systemctl enable chronyd
systemctl start chronyd
Настройка безопасности
1. Отключаем SELinux:
sed -i «s/SELINUX=enforcing/SELINUX=disabled/» /etc/selinux/config
setenforce 0
* первая команда редактирует конфигурационный файл, чтобы SELinux не запускался автоматически, вторая — отключает его разово. Подробнее читайте статью Как отключить SELinux.
2. Открываем необходимые порты в брандмауэре:
firewall-cmd —permanent —add-port={80,443,8080}/tcp
firewall-cmd —permanent —add-port={20,21,60000-65535}/tcp
firewall-cmd —permanent —add-port={25,465,587}/tcp
firewall-cmd —reload
* 80, 443 и 8080 порты для веб-сервера; 20, 21 порты нужны для работы FTP; 60000-65535 также необходимы для работы FTP (динамические порты для пассивного режима); 25, 465 и 587 порты нужны для работы почтового сервера по SMTP; последняя команда перезапускает firewalld, чтобы применить новые правила. Подробнее про настройку firewalld.
Установка NGINX
Устанавливаем NGINX:
dnf install nginx
Внесем небольшую корректировку в файл nginx.conf:
vi /etc/nginx/nginx.conf
В секцию http добавим строку:
http {
…
server_names_hash_bucket_size 64;
….
}
* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.
Разрешаем автозапуск сервиса и запустим его:
systemctl enable nginx
systemctl start nginx
Проверим, что веб-сервер работает. Для этого открываем браузер на другом компьютере, который находится в одной сети и вводим в адресной строке IP-адрес сервера. В итоге мы должны увидеть заголовок «Welcome to nginx!»:
* обратите внимание, что данное приветствие может иметь и другой вид
Настройка apache в CentOS 8
Теперь приступим к установке apache. В CentOS 8 это делается очень просто:
# dnf install httpd
Добавляем apache в автозагрузку:
# systemctl enable httpd
Запускаем apache в CentOS 8:
# systemctl start httpd
Проверяем, запустился ли сервер:
# netstat -tulnp | grep httpd tcp6 0 0 :::80 :::* LISTEN 21586/httpd
Все в порядке, повис на 80-м порту, как и положено. Уже сейчас можно зайти по адресу http://10.20.1.23 и увидеть картинку:
Если ничего не видите, скорее всего у вас не настроен firewall. Если не занимались его настройкой, то по-умолчанию в centos установлен firewalld. На нем открыть порты для web сервера можно следующими командами.
# firewall-cmd --permanent --zone=public --add-service=http # firewall-cmd --permanent --zone=public --add-service=https # firewall-cmd --reload
Проверить, открылись ли порты можно командой.
# firewall-cmd --list-all
Вместо ожидаемой картинки с каким-то приветствием, мы видим просто ошибку. Я не знаю, почему в Centos 8 в стандартном пакете httpd из базового репозитория не положили в директорию web сервера по-умолчанию /var/www/html хоть какую-нибудь страничку. Там пусто, поэтому мы и видим ошибку. Давайте тогда сами что-то туда положим, чтобы просто проверить работу apache. Создаем простую страничку index.html.
# echo "Hello, Centos 8 and apache." >> /var/www/html/index.html
Проверяем страницу.
Все в порядке, веб сервер работает. Теперь займемся настройкой apache. Я предпочитаю следующую структуру веб хостинга:
/web/sites | раздел для размещения сайтов |
/web/z.serveradmin.ru/www | директория для содержимого сайта |
/web/z.serveradmin.ru/log | директория для логов сайта |
Создаем для нее директории.
# mkdir -p /web/sites/z.serveradmin.ru/{www,log} # chown -R apache. /web/sites/
Дальше редактируем файл конфигурации apache — httpd.conf по адресу /etc/httpd/conf. Первым делом проверим, раскомментирована ли строчка в самом конце:
IncludeOptional conf.d/*.conf
Если нет, раскомментируем и идем в каталог /etc/httpd/conf.d. Создаем там файл z.serveradmin.ru.conf:
# mcedit /etc/httpd/conf.d/z.serveradmin.ru.conf
<VirtualHost *:80> ServerName z.serveradmin.ru ServerAlias www.z.serveradmin.ru DocumentRoot /web/sites/z.serveradmin.ru/www ErrorLog /web/sites/z.serveradmin.ru/log/error.log CustomLog /web/sites/z.serveradmin.ru/log/access.log common <Directory /web/sites/z.serveradmin.ru/www> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
Перезапуск apache в centos
Проверим созданную конфигурацию и выполним перезапуск apache.
# apachectl -t AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::95:c6f3:e49f:7204. Set the 'ServerName' directive globally to suppress this message Syntax OK
В данном случае ошибок нет, показано предупреждение. Теперь делаем restart apache:
# systemctl restart httpd
Если возникли какие-то ошибки — смотрим лог apache /var/log/httpd/error_log. Если все в порядке, то проверим, нормально ли настроен наш виртуальный хост. Для этого создадим в папке /web/sites/z.serveradmin.ru/www файл index.html следующего содержания:
# mcedit /web/sites/z.serveradmin.ru/www/index.html
<h1>Апач работает как надо, а надо хорошо!</h1>
# chown apache. /web/sites/z.serveradmin.ru/www/index.html
Дальше на своем компьютере правим файл hosts, чтобы обратиться к нашему виртуальному хосту. Добавляем туда строчку:
10.20.1.23 z.serveradmin.ru
где 10.20.1.23 ip адрес нашего веб сервера. Это нужно сделать только в том случае, если настраиваете web сервер где-то в локальной сети без реально существующего доменного имени.
Теперь в браузере набираем адрес http://z.serveradmin.ru. Если видим картинку:
значит все правильно настроили. Если какие-то ошибки, то идем смотреть логи. Причем в данном случае не общий лог httpd, а лог ошибок конкретного виртуального хоста по адресу /web/z.serveradmin.ru/log/error.log.
Установка PHP 7.2
CentOS 7 поставляется с версией PHP 5.4. Рекомендуемая версия PHP для WordPress — PHP 7.2.
Чтобы установить PHP и все необходимые расширения PHP, выполните следующие команды:
Мы установили PHP FPM, потому что мы будем использовать Nginx в качестве веб-сервера.
По умолчанию PHP FPM будет работать как пользователь на порту 9000. Мы изменим пользователя на и переключимся с сокета TCP на сокет Unix. Для этого откройте файл отредактируйте строки, выделенные желтым цветом:
Убедитесь, что каталог имеет правильного владельца, используя следующую команду chown:
После внесения изменений включите и запустите службу PHP FPM:
Настройка Apache и PHP-FPM
Apache продолжает использовать версию PHP по умолчанию. Есть вариант проксирования трафика на FastCGI через FPM (FPM/FastCGI) или использование обертки CGI для FastCGI (CGI/FastCGI). Второй метод считается устаревшим и не рекомендуется.
FPM запускается как сервис и по умолчанию случают подключения на 127.0.0.1:9000. Проверить это можно командой:
netstat -na | grep "9000" |
Если у вас уже установлен FPM для другой версии PHP, то вам надо разнести их по портам. Для этого надо изменить привязку к порту в конфигурационном файле (в данном примере с 9000 на 9072):
sed -i 's/:9000/:9072/' etcoptremiphp73php-fpm.dwww.conf |
После перезапуска службы php73-php-fpm, проверяйте, что она слушает на новом порту. Но в моем случае это не потребовалось.
В conf файлах нужного вам сайта Apache необходимо указать новый обработчик для файлов с расширением PHP:
<VirtualHost *:*> # mod_proxy_fcgi options <IfModule mod_proxy_fcgi.c> <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> </IfModule> </VirtualHost> |
В главном файле конфигурации Apache необходимо включить модуль . По умолчанию, этот модуль отключен или даже не установлен. Чтобы его включить, в файле раскомментируйте строчку
а если FastCGI вообще не установлен, то сначала его можно доустановить командой:
yum install mod_fcgid |
и перезапустите Apache:
service httpd reload |
Далее, необходимо в файле конфигурации php-fpm указать логин и пароль пользователя, под которым работает apache. В моем случае это nobody (по умолчанию там прописано apache). Изменения делаются в файле :
user = nobody group = nobody |
Как мы видим, в стандартной конфигурации PHP-FPM использует TCP сокет, однако более быстрым решением считается Unix сокет. Чтобы его использовать, в том же файле пропишите:
1 2 3 |
listen = runphp-fpmwww.sock listen.owner = apache listen.mode = 0660 |
Ну и замените пользователя на реального пользователя apache (в моем случае, nobody). В таком сценарии в конфигурации Apache должно быть:
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" |
Если у вас разные frontend и backend сервера Apache и FPM, то пропишите разные IP
listen = 10.0.0.2:9000 listen.allowed_clients = 10.0.0.1 |
а в httpd.conf:
SetHandler "proxy:fcgi://10.0.0.2:9000" |
А еще один сценарий, когда у вас несколько бэкенд серверов PHP-FPM для балансировки:
И последний вариант, когда отдельно взятое приложение или путь использует отдельную версию FPM:
После этого перезагрузите php-fpm или Apache:
systemctl reload php73-php-fpm httpd |
Настройка хоста
Конфигурация nginx
Идем в папку с конфигами сайтов nginx и на базе дефолтного конфига создаем свой. Файлы с конфигами лучше всего называть по домену, а для локальных проектов использовать какую-нибудь отдельную доменную зону, чтобы в дальнейшем не было путаницы — проект открыт локально или на удаленном сервере. Я обычно использую зону .
$ cd /etc/nginx/sites-available/ $ sudo cp default blog.local
Редактируем конфиг:
$ sudo nano blog.local
server { listen 80; root /mnt/f/my/web/blog/public; index index.php index.html index.htm index.nginx-debian.html; server_name blog.local; location { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_buffering off; include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } }
Так как у нас все-таки WSL 1 — будем использовать файловую системы основной системы. Логические диски внутрь WSL монтируются в — узнать список разделов можно командой .
$ sudo ln -s /etc/nginx/sites-available/blog.local /etc/nginx/sites-enabled/
Заодно выключаем сайт по умолчанию, он нам больше не нужен:
$ sudo unlink /etc/nginx/sites-enabled/default
Тестируем конфиг (должно быть ok) и обновляем nginx:
$ sudo nginx -t $ sudo /etc/init.d/nginx reload
Hosts
Чтобы браузер понимал наш домен blog.local — он должен откуда-то получить ip-адрес сервера, связанного с этим доменом. В большом интернете этим занимаются DNS-сервера, а нам достаточно прописать соответствие в .
Добавляем следующую строку (нужны права администратора):
PHP
Если папка под проект к этому моменту еще не существует — стоит этим заняться.
Создаем :
$ echo '<?php echo "Hello world!";' > /mnt/f/my/web/blog/public/index.php
$ echo '<?php phpinfo();' > /mnt/f/my/web/blog/public/phpinfo.php
Важно! Не используйте данную возможность на боевых серверах и тем более не оставляйте подобный файл лежать с доступом для всех. В выводе есть версии всех используемых дистрибутивов, это более чем достаточная информация если не для взлома сервера, так для направленной атаки, использующей уязвимости конкретных версий
MySQL
Проще всего, особенно для каки-то самописных проектов поставить админку. Для тех, кому это кажется лишним — можно создать пользователя для проекта и БД напрямую в консоли mysql.
Устанавливаем phpmyadmin вместе с необходимыми расширениями php и рестартим php-fpm, чтобы расширения включились.
$ sudo apt install phpmyadmin php-mbstring php-gettext $ sudo /etc/init.d/php7.2-fpm restart
На вопрос «web-server to reconfigure automatically» не выбираем ничего, жмем Tab и Ok.
В окне «Configuring phpmyadmin» выбираем Yes и создаем пользователя для утилиты.
Теперь нам нужно настроить nginx, создаем еще один конфиг для хоста phpmyadmin:
$ cd /etc/nginx/sites-available/ $ sudo cp default phpmyadmin $ sudo nano phpmyadmin
server { listen 80 default_server; listen :80 default_server; root /var/www/html/; index index.php index.html index.htm index.nginx-debian.html; server_name _; location /pma { alias /usr/share/phpmyadmin/; location ~ \.php$ { fastcgi_buffering off; fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; fastcgi_ignore_client_abort off; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { access_log off; log_not_found off; expires 1M; } } }
Включаем сайт, проверяем конфиг и релоадим nginx:
$ sudo ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/ $ sudo nginx -t $ sudo /etc/init.d/nginx reload
Если вдруг пользователь phpmysql оказался ограничен в правах (не может создать БД или других пользователей) — эти права всегда можно выдать вручную.
Идем в консоль mysql:
$ mysql -u root -p
И выдаем нужные права (в данном случае все возможные):
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' WITH GRANT OPTION;
Идем обратно в phpmyadmin и перезаходим в учетку, права должны быть на месте. Для демонстрации корректной работы всех пакетов добавим пользователя и БД с таблицей произвольного формата (кодировку следует выбирать ).
Автоматическая установка PHP на VDS
Самый простой вариант — установить PHP на собственный VDS под CentOS при создании сервера. Например, такая возможность есть на Timeweb.
-
Заходим в панель управления VDS на хостинге.
-
Переходим на вкладку «Список VDS».
-
Нажимаем на кнопку «Создать сервер».
-
Вводим любое имя и комментарий, если он нужен.
-
Выбираем операционную систему и дополнительное ПО для сервера. В нашем случае это будет CentOS 7 и LAMP (Linux, Apache, MySQL, PHP, nginx).
-
Выбираем конфигурацию сервера.
-
При необходимости указываем публичную часть ключа SSH (если уже его создали) и включаем защиту от DDoS-атак.
-
Оплачиваем тариф и получаем на почту письмо с данными для подключения к серверу.
После установки операционной системы и дополнительного ПО мы имеем полностью готовый сервер для работы над динамическими сайтами и приложениями.
Если уже есть сервер с другой ОС и дополнительным ПО, можно выполнить переустановку. Но этот способ подходит только в том случае, если на машине ничего не настроено и не размещено. Переустановка удаляет из хранилища все файлы. Например, у меня на Timeweb есть сервер с Ubuntu 18.04 и панелью Vesta
На нем нет ничего важного, поэтому я могу переустановить ОС и ПО на CentOS 7 с LAMP
1000 рублей в подарок на производительные VDS от Timeweb
Закажи VDS, пополни баланс на 1000 рублей, и мы добавим еще столько же. Активируй промокод community1000 в панели управления.
Заказать
Если что-то пошло не так
ERR_NAME_NOT_RESOLVED (не удается получить доступ к сайту)
Браузер не смог найти указанный домен. Возможные причины:
- вы неправильно настроили конфиг сайта;
- вы не прописали в hosts домен или прописали его неверно;
- вы не сделали после создания/изменения конфига сайта — это действие обязательно нужно выполнять после любых правок в конфиге.
502 Bad Gateaway
Ошибка связана с тем, что nginx не получает ответа от бэкенда, в данном случае от php-fpm.
Возможные причины:
- php-fpm не запущен;
- неверно указаны параметры php в настройках хоста nginx;
- ошибка непосредственно в php-скрипте.
Лучшие ваши помощники в устранении любой неполадки — логи:
Очень долгая загрузка страниц (ERR_INCOMPLETE_CHUNKED_ENCODING)
Завершение установки WordPress
Теперь, когда WordPress загружен и настройка сервера завершена, вы можете завершить установку через веб-интерфейс.
Откройте браузер, введите свой домен, и появится экран, подобный следующему:
Выберите язык, который вы хотите использовать, и нажмите кнопку « .
Затем вы увидите следующую информационную страницу, нажмите кнопка.
На следующем экране мастер настройки попросит вас ввести данные подключения к базе данных. Введите данные пользователя MySQL и базы данных, которые вы создали ранее.
Запустите установку WordPress, нажав кнопку « .
На следующем шаге вам нужно будет ввести имя для вашего сайта WordPress и выбрать имя пользователя (в целях безопасности не используйте «admin»).
Программа установки автоматически сгенерирует для вас надежный пароль. Не забудьте сохранить этот пароль. Вы также можете установить пароль самостоятельно.
Введите свой адрес электронной почты и выберите, хотите ли вы, чтобы поисковые системы не индексировали сайт (не рекомендуется).
Щелкните и после завершения установки вы попадете на страницу, информирующую вас о том, что WordPress установлен.
Чтобы получить доступ к странице входа в WordPress, нажмите кнопку « .
Введите ваше имя пользователя и пароль.
Вы будете перенаправлены на панель администрирования WordPress.
Отсюда вы можете приступить к настройке вашей установки WordPress, установив новые темы и плагины.