Установка nginx c PHP-FPM под CentOS 7.0

Пробуем установить Nginx с PHP5 (и PHP-FPM) и MySQL под CentOS или Fedora.

Внимание! Эта методика позволяет отказаться от привычного apache! Если Вы не готовы отказаться от apache, рекомендую связку apache+nginx.

Nginx представляет собой бесплатный, высокопроизводительный HTTP-сервер, с открытым исходным кодом. Nginx известен своей стабильностью, широким набором функций, простой настройкой и невысоким ресурсопотреблением. В этой статье мы рассмотрим процесс установки Nginx на Fedora/CentOS с поддержкой PHP версии 5 (через PHP-FPM) и MySQL.

Статья изначально написана для дистрибутивов Fedora версии 14 и CentOS версии 6.5, а затем адаптирована для CentOS версии 7.0. Тем не менее, установке именно на версию RHEL 7.0 / CentOS 7.0 посвящена отдельная статья.

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

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

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

К сожалению, php-fpm не доступен в репозиториях (в официальных системах хранения) CentOS, но доступен из RemiRPM, которая сама зависит от EPEL. Можно включить обе системы хранения следующим образом (актуально для CentOS 6.5):

rpm --import https://fedoraproject.org/static/0608B895.txt
rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm --import https://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh https://rpms.famillecollet.com/enterprise/remi-release-6.rpm

Запустим yum со следующими параметрами:

install -y yum-priorities

Затем отредактируем /etc/yum.repos.d/epel.repo

И добавим приоритет линии =10 к секции [epel]:

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=https://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

Затем проделаем аналогичные модификации с секцией [remi] /etc/yum.repos.d/remi.repo и изменим значение enabled на 1:

[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=https://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=https://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority

3 Установка MySQL 5

Во-первых, установим MySQL 5 (MariaDB), для этого запустим yum со следующими параметрами:

install -y mysql mysql-server

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

systemctl enable mysqld.service

Для системы под CentOS более ранних версий надо было выполнить следующее:

chkconfig --levels 235 mysqld on
service mysqld start

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

netstat -tap | grep mysql

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

[root]# netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 1279/mysqld

Выполним следующее:

mysql_secure_installation

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

mysql_secure_installation

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

На этой ноте установка MySQL 5 будет завершена.

4 Установка Nginx

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

install -y nginx

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

systemctl enable nginx.service

Для системы под CentOS более ранних версий надо было выполнить следующее:

chkconfig --levels 235 nginx on
service nginx start

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

[root]# 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]

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

apachectl stop
yum remove httpd
chkconfig --level 235 httpd off
chkconfig --levels 235 nginx on
service nginx start

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

5 Установка PHP5

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

install -y php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy

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

Для установки APC запустим yum со следующими параметрами:

install -y php-pecl-apc

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

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previousbehaviour 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.
; php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

Если требуется, выполняем детальную настройку PHP.

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

[...]
[Date
] ; Defines the default timezone used by the date functions
; php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]

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

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

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

chkconfig --levels 235 php-fpm on
service php-fpm start

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

6 Настройка nginx

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

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

[...]
worker_processes 4;
[...]
keepalive_timeout 2;
[...];

А можно довериться разработчикам nginx и указать значения auto.

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

[...]
server {;
listen 80;
server_name _;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
includefastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# location ~ /\.ht {
deny all;
}
}

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

В разделе /part, добавим index.php к строке индкекса корень /usr/share/nginx/html; означает, что корень документа находится в директории /usr/share/nginx/html.

Важной частью PHP является местоположение, строфа: ~\.php$ {}. Удалите ~ \.php$ {} для включения местоположения. Изменим корневую строку в корне документа нашего сайта (например/usr/share/nginx/html;). Также добавим строкуtry_files $uri =404, для предотвращения уязвимостей. Убедитесь, что изменили строку fastcgi_param на fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name, иначе интерпретирующая программа PHP не найдёт PHP-скрипт, который используется в браузере. В $document_root задается /usr/share/nginx/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 в корне сайта /usr/share/nginx/html.


<?php
phpinfo(); ?>

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

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

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

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

[...]
;listen = 127.0.0.1:9000
listen = /tmp/php5-fpm.sock
[...]

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

service php-fpm reload

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

[...]
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_passunix:/tmp/php5-fpm.sock;
fastcgi_indexindex.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
includefastcgi_params;
}
[...]

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

service nginx reload

Теперь в браузере можно обратиться к нашему серверу по IP-адресу и увидеть ответ.

nginx-start-page-ff

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

  • nocturna

    написал nocturna

    Пятница, 07 Ноябрь 2014 03:34

    Как заставить nginx съесть именно этот конфиг, а не default? Сейчас при обращении к серверу, загружается /usr/share/nginx/html/index.html, т.к. так указано в default

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

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

    Пятница, 07 Ноябрь 2014 20:51

    Проверьте, что в конфигурационном файле по умолчанию встречается директива (указывающая на то, что необходимо прочитать все конфигурационные файлы из папки):
    include /etc/nginx/conf.d/*.conf;
    Она должна быть расположена перед самой последней закрывающей фигурной скобкой. Подробнее в самом конце статьи http://drach.pro/blog/linux/item/38-nginx-apache-web-server

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

    написал nocturna

    Среда, 12 Ноябрь 2014 02:55

    Делала по мануалу с Убунту, там конфиги лежат в /etc/nginx/sites-available/*
    В чем разница относительно размещения в /etc/nginx/conf.d/?

    ls /etc/nginx/sites-available/
    default example_com

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

    написал Илья

    Среда, 12 Ноябрь 2014 21:21

    nocturna, если Вы описываете виртуальные хосты в отдельных файлах, то они должны иметь расширение *.conf

    То есть как у Вас в примере
    default.conf
    example.conf
    и т.д.

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

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

    Среда, 19 Ноябрь 2014 17:09

    Удостоверьтесь, что существует файл в /etc/sysconfig/nginx со следующим содержимым:

    NGINX=/usr/sbin/nginx
    CONFFILE=/etc/nginx/nginx.conf

    Пожаловаться
  • Елена

    написал Елена

    Вторник, 31 Май 2016 23:56

    Наверное тема уже изжила свое, но у меня возникла проблема, дистриб Centos 6. Собрано по такому же принципу nginx+php-fpm, обновляла php с 5.2 до 5.4.45 по статье, теперь в консоли php -v выдает версию 5.4.45 а в браузере phpinfo() выдает тот же 5.2, где правятся эти конфиги или пути fastcgi? В nginx конфиге?

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

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

    Суббота, 04 Июнь 2016 00:26

    Елена, скорее всего, менять надо настройки в панели на хостинге (ISPmanager, cPanel или что там у Вас?)

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

    написал Baddy

    Понедельник, 24 Октябрь 2016 05:21

    Отличная статья!

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

    написал Georgeusaks

    Вторник, 03 Январь 2017 19:11

    Браво, эта блестящая мысль, придется как раз кстати!

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

    написал DavidFlabe

    Четверг, 07 Апрель 2022 05:31

    Z

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

Другие материалы в этой категории:

Go to top