Внимание! Эта методика позволяет отказаться от привычного 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-адресу и увидеть ответ.
Дискуссия
Написал Rocky 9
Опубликовано в: Установка nginx c PHP-FPM под CentOS 7.0 in LinuxНаписал Константин
Опубликовано в: Докеризация стека LEMP под Ubuntu c помощью Compose in LinuxНаписал bammbr
Опубликовано в: Шлюз для маленького отдела на Red Hat 9 in LinuxНаписал Федор
Опубликовано в: Установка и конфигурация Samba на CentOS 7 in LinuxНаписал Evgenytrl
Опубликовано в: Загрузка файлов с помощью Wget in Linux