Menu

Nginx с PHP и MySQL (LEMP) на RHEL 7.0

В этой статье мы рассмотрим процесс установки Nginx на RHEL 7.0 / CentOS 7.0 с поддержкой PHP (через PHP-FPM) и MySQL (MariaDB). Такая связка получила аббревиатуру LEMP.

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

Данная статья является переработанной версией исходной статьи, созданной для предыдущей версии дистрибутива CentOS 6.5.

1 Предварительные замечания

Предполагается, что в локальной сети доступна аппаратная платформа, на которой уже установлен CentOS 7.0.

Будем использовать 10.4.0.10 в качестве локального IP-адреса нашего нового сервера. В конкретном случае эти данные могут отличаться.

2 Включение дополнительных систем хранения

Nginx недоступен из официальных систем хранения CentOS 7.0, поэтому сначала добавим систему хранения Nginx для его последующей установки:

mcedit /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

3 Установка MySQL

Сначала установим Mariadb. Mariadb является свободным ответвлением MySQL. Для установки запустим yum со следующими параметрами:

install -y mariadb mariadb-server net-tools

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

systemctl enable mariadb.service
systemctl start mariadb.service

Теперь проверим, разрешена ли работа в сети. Выполним следующее:

netstat -tap | grep mysql

Если появилось подобное сообщение:

[root]# netstat -tap | grepmysql
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 10623/mysqld

Выполним команду:

mysql_secure_installation

для задания пароля администратора (иначе кто-угодно может получить доступ к вашим базам данных MySQL):

[root]# mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

Для дальнейшей установки вам необходимо будет ввести ваш логин и пароль, для ответов на остальные вопросы нажимаем enter.

4 Установка Nginx

Nginx доступен для скачивания с на сайте разработчика, для установки запустим yum со следующими параметрами:

yum install -y nginx

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

systemctl enable nginx.service
systemctl start nginx.service

У вас может появится ошибка типа: порт 80 уже используется, ошибка будет иметь следующий вид:

[root@server1 ~]# service nginx start
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use
) nginx: [emerg] still could not bind()
[FAILED]

Ошибка появляется в том случае, если запущена служба apache. Остановим apache и запустим службу NGINX:

systemctl stop httpd.service
yum -y remove httpd
systemctl disable httpd.service
systemctl enable nginx.service
systemctl start nginx.service

И откроем http и https порты в брандмауэре

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

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

[root@example ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[root@example ~]# firewall-cmd --permanent --zone=public --add-service=https success
[root@example ~]# firewall-cmd --reload success

Наконец, введем IP-адрес сервера или имя хоста в адресную строку в браузере (например http://10.4.0.10) и увидим стартовую страницу nginx.

nginx-start-page

Поздравляю с получением промежуточного результата!

5 Установка PHP

Интерпретатор PHP версии 5 взаимодействует с nginx через PHP-FPM (PHP FastCGI Process Manager), которая является альтернативой PHP Fast CGI, с некоторыми дополнительными функциями, полезными для сайтов любого размера, особенно для оживлённых сайтов. Установим php-fpm вместе с php-cli и некоторыми PHP5 модулями, например,php-mysql, который потребуется для использования MySQL в ваших PHP скриптах, для установки запустим yum со следующими параметрами:

yum install -y php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap

APC представляет собой бесплатный и открытый кэшер выполнимого кода для PHP, который кэширует и оптимизирует промежуточный код PHP. APC схож с другими кэшерами для PHP, такими как: eAccelerator и Xcache. Рекомендуется установить любую из этих модулей для ускорения работы страницы PHP.

Установим APC из хранилища PHPpecl. PECL требуется наличие установленного инструментария Centos Development tools, для того, чтобы скомпилировать пакет APC. Для установки запустим yum со следующими параметрами:

yum install -y php-devel
yum groupinstall 'Development Tools'

Мы готовы к установке APC

pecl install -y apc

В процессе установки необходимо будет подтвердить настройки программы клавишей Enter.

Затем откроем /etc/php.ini и установим значение cgi.fix_pathinfo=0:

[...]
; cgi.fix_path info provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

И в конце добавим строку:

[...]
extension=apc.so

Постараемся избежать ошибок часового пояса типа:

PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings.
You are *required* to use the date.timezone setting or the date_default_timezone_set() function.

... вот почему в файле /var/log/php-fpm/www-error.log, когда срабатывает скрипт PHP в браузере, нам потребуется задать часовой пояс (date.timezone) в /etc/php.ini:

[...]
[Date]
; Defines the default timezone used by the date functions
date.timezone = "Europe/Moscow"
[...]

Определить часовой пояс на нашей системе можно следующим образом:

cat /etc/sysconfig/clock

[root]# cat /etc/sysconfig/clock
ZONE="Europe/Moscow"
[root]#

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

systemctl enable php-fpm.service
systemctl start php-fpm.service

PHP-FPM является процессом (со скриптом init /etc/init.d/php-fpm), который запускает FastCGI сервер на порте 9000.

6 Настройка nginx

Откроем файл конфигурации nginx, /etc/nginx/nginx.conf:

Первым делом можно увеличить число запущенный процессов (для высоконагруженных сайтов auto заменить на удвоенное число ядер процессора) и установить максимальное время поддержания keepalive-соединения:

[...]
worker_processes auto;
[...]
keepalive_timeout 2;
[...]

Виртуальные хосты определены на сервере в директории /etc/nginx/conf.d. Теперь отредактируем стандартный vhost (mcedit /etc/nginx/conf.d/default.conf) следующим образом:

[...]
server {
listen 80;
server_namelocalhost;
#кодировка koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /var/www/html/;
index index.html index.htm;
}
#error_page 404 /404.html;
# перенаправление ошибок сервера на статическую страницу /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html/;
}
#}
# передача PHPскриптов на сервер FastCGI по адресу 127.0.0.1:9000
location ~ \.php$ {
root /var/www/html/;
try_files $uri =404;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;
}
# запретить доступ к файлам .htaccess
location ~ /\.ht {
deny all;
}
}

 

server_name _; создает стандартное хранилище vhost (если вы определили имя хоста).

В разделе /part, добавим index.php к строке индекса. Путь /var/www/html/; означает, что корневая директория расположения сайтов находится в /var/www/html/.

Важной частью PHP является местоположение, строфа: ~ \.php$ {}. Удалите ~ \.php$ {} для включения местоположения. Изменим корневую строку в корне сайта (например, /var/www/html/;). Также добавим строку try_files $uri =404, для предотвращения уязвимостей. Убедитесь, что изменили строку fastcgi_param на fastcgi_paramSCRIPT_FILENAME $document_root$fastcgi_script_name, иначе интерпретирующая программа PHP не найдёт PHP скрипт, который используется в браузере. (В $document_root задается /var/www/html/, так как это и есть наш корневая директория расположения сайтов.)

PHP-FPM стандартно работает с портом 9000 по адресу 127.0.0.1, поэтому зададим nginx подключиться к 127.0.0.1:9000 со строкой fastcgi_pass 127.0.0.1:9000;. Так же возможно использование PHP-FPM сокета- рассмотрим это в главе 7.

Теперь сохраним файл и перезапустим nginx:

service nginx reload

Создадим файл PHP в корневой директории расположения сайтов /var/www/html/.


<?
phpinfo();
?>

Затем откроем файл в браузере (например http://10.4.0.10/info.php)

PHP5 работает через FPM/FastCGI, как показано в строке ServerAPI. Внизу страницы представлена информация о подключенных модулях, в том числе и MySQL.

7 Использование Unix-сокета для PHP-FPM

Использование Unix-сокета позволит избежать издержек TCP. Как правило, PHP-FPM использует порт 9000 по адресу 127.0.0.1. Откроем файл /etc/php-fpm.d/www.conf и отредактируем следующим образом:

[...]
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php5-fpm.sock
[...]

Затем перезагрузим PHP-FPM:

systemctl restart php-fpm.service

Теперь в конфигурации nginx изменим строку fastcgi_pass 127.0.0.1:9000; на fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock; это будет выглядеть следующим образом:

:

[...]
location ~ \.php$ {
root /var/www/html/;
try_files $uri =404;
fastcgi_passunix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_indexindex.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[...]

В конце снова перезапустим nginx:

systemctl restart nginx.service

Можно разворачивать сайты.

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

  • Юрий

    написал Юрий

    Понедельник, 02 Февраль 2015 12:26

    Спасибо!
    В целом все хорошо, сервер настроил сразу по вашей инструкции!
    Но есть несколько недочётов в вашем руководстве: местами пропущено "yum", перепроверьте.
    И в конце сбило с толку вот это "Теперь в конфигурации nginx изменим строку...". Должно быть:
    fastcgi_passunix:/var/run/php-fpm/php5-fpm.sock;
    Там у вас противоречие. Читателей собьет с толку, я думаю.
    Ещё раз спасибо за статью, всё работает!

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

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

    Вторник, 03 Февраль 2015 20:38

    Благодарю за такой информативный комментарий, который помог улучшить статью!

    Пожаловаться
  • Илья

    написал Илья

    Четверг, 11 Февраль 2016 16:52

    Спасибо, что так подробно все расписано. Все получилось, но возникла такая проблема: если скрипт начинается с php то нет
    , короче скрипт открывается галочка?php то работает, если просто галочка? то нет, в чем дело как лечить? и добавьте возможность вставки кода в комментарий.

    Пожаловаться
  • Анатолий

    написал Анатолий

    Пятница, 12 Февраль 2016 12:34

    Илья, в php.ini file посмотрите, каково значение the short_open_tag? Об этом уже писали где-то в этом блоге.

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