Ошибка установки Composer

Дата: 13.09.2017Метки:

Имеем сервер с операционной системой CentOS 7, на который установлен PHP 7. Выполняем команду для установки Composer:

curl -sS https://getcomposer.org/installer | php

В результате получаем ошибку:

Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The json extension is missing.
Install it or recompile php without --disable-phar

Для начала попробуем установить расширение phar:

yum install php-pecl-phar

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

Добавляем расширение phar в php.ini:

extension = phar.so

Проверяем изменения:

php -m | grep Phar

Результат выполнения команды «Phar», после чего пробуем повторно установить Composer.

Web-сервер на CentOS 7: Nginx, PHP 7.x, PerconaDB

У меня уже были ранее записи, про установку PHP 7 на CentOS. В этот раз у меня появилась задача поднять сразу веб-сервер с нуля на базе операционной системы CentOS 7. Пользуясь случаем, решил записать последовательность действий для экономии времени в будущем. Возможно, вы тоже решили установить веб-сервер под CentOS 7 с последней версией PHP 7, тогда этот материал вам тоже будет полезен.

Список актуальных версий пакетов на момент установки:

  • Веб-сервер Nginx 1.13.4
  • Менеджер процессов FastCGI PHP 7.1.7
  • MySQL сервер Percona 5.7

Предварительная настройка

Настройку сервера начнем с предварительной настройки сервера. Для начала я отключу firewalld, в дальнейшем доступ к серверу будет ограничен через iptables. Для отключения firewalld в CentOS 7 выполните следующие команды:

systemctl disable firewalld
systemctl stop firewalld

Создаем файл с правилами iptables:

mkdir -p /etc/iptables
vi /etc/iptables/rules.v4

Добавляем в содержимое файла следующие строки:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# DROP INVALID PACKETS
-A INPUT -m conntrack --ctstate INVALID -j DROP

# ICMP
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# SSH
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# Если у вас статический ip, ограничьте доступ к SSH по ip-адресу.
# Меняем адрес 1.2.3.4 на свое значение и меняем строку выше на следующую:
#-A INPUT -s 1.2.3.4/32 -p tcp -m tcp --dport 22 -j ACCEPT

# NGINX
-A INPUT -i -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i -p tcp -m tcp --dport 443 -j ACCEPT
COMMIT

В дальнейшем, если вы решите настроить тот или иной сервис, для открытия порта извне необходимо добавить соответствующее правило в iptables. Дополнительно в целях защиты доступа к серверу по SSH настройте fail2ban и авторизацию по ключу.

Применяем правила:

iptables-restore < /etc/iptables/rules.v4

Добавляем выполнение правил при старте системы:

chmod +x /etc/rc.local
vi /etc/rc.local

Добавляем содержимое файла:

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

iptables-restore < /etc/iptables/rules.v4

touch /var/lock/subsys/local

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

Установку Nginx в CentOS будем из официального репозитория, я рекомендую использовать более свежую mainline-версию. Для настройки репозитория yum для CentOS необходимо создать файл:

/etc/yum.repos.d/nginx.repo

C таким содержимым:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

Устанавливаем Nginx:

yum install nginx

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

systemctl start nginx
systemctl enable nginx

Откройте файл:

vi /etc/nginx/nginx.conf

Приведите значение параметров к следующему виду:

worker_processes auto;
access_log off;
server_tokens off;

sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 0;

Применяем значения параметров:

service nginx restart

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

На данный момент PHP 7 нет в официальных репозиториях. Для установки PHP 7.1 в CentOS 7 нам понадобится добавить в систему репозиторий Webtatic. Для установки модулей есть PEAR, но его поддерживают не все модуля. Связи с чем установки неподдерживаемых PHP PEAR модулей нужно выполнять из репозитория Webtatic.

Добавим в систему EPEL и Webtatic репозитории:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

Устанавливаем PHP 7.1 и наиболее часто используемые расширения:

yum install php71w-fpm php71w-opcache php71w-cli php71w-common php71w-gd php71w-mbstring php71w-mcrypt php71w-mysqlnd php71w-xml

Расширение OPcache, но я рекомендую его использовать для более быстрой работы ваших сайтов. OPcache теперь официально включен в исходный дистрибутив и поддерживается командой PHP. Это дает ему преимущество по сравнению с другим кэшем Opcode.

Список доступных для установки расширений PHP 7.1 есть на официальной странице репозитория Webtatic, в разделе Packages.

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

systemctl start php-fpm
systemctl enable php-fpm

Теперь переходим к настройке PHP-FPM, откройте следующий файл:

vi /etc/php-fpm.d/www.conf

Раскомментируйте и приведите значение параметров к следующему виду:

user = apache
group = apache

listen = /var/run/php-fpm.sock

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Перезапустим php-fpm:

service php-fpm restart

Для взаимодействия Nginx с php-fpm создайте следующую конфигурацию:

vi /etc/nginx/conf.d/default.conf

Замените содержимое файла на:

server {
    listen       80;
    server_name  test.net;

    root   /usr/share/nginx/html;
    index  index.php index.html;

    location ~ .php$ {
        try_files $uri = 404;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Применяем значение параметров:

service nginx restart

Установка Percona в CentOS

Устанавливать PerconaDB, MySQL или MariaDB — дело личного предпочтения. В данной статье речь пойдет о установке PerconaDB на CentOS, для этого добавим в систему официальный репозиторий пакетов:

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm

Устанавливаем Percona Server:

yum install Percona-Server-server-57

Запускаем и добавляем Percona в атозапуск при старте системы:

systemctl start mysql

Наверно, у вас возникнет вопрос: где взять пароль root для доступа к Percona Server? В этом плане Percona проявит самостоятельность, вместо нас придумает пароль и запишет его в лог.Что бы узнать пароль root в Percona выполните команду:

cat /var/log/mysqld.log |grep generated
2017-08-13T15:25:44.331443Z 1 [Note] A temporary password is generated for root@localhost: ************

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

# mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password:

Re-enter new password:

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

Предупреждаю сразу, что перед изменением пароля, он будет проверен на соответствия правилам безопасности. Мне удалось поменять пароль не с первого раза, для его создания я использовал сервис. В процесс отметим галками все 4 пункта и выбрал длину пароля 12 символов. Пробовал по очереди созданные пароли до тех пор пока один из них не подошел критериям безопасности. Да, теперь так все сложно.

По поводу начальной настройки Percona. Нужно отметить, что по умолчанию Percona уже пригодна для использования. Нам остается только внести финальные штрихи.

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

vi /etc/percona-server.conf.d/mysqld.cnf

В секцию [mysqld] добавляем следующие параметры:

bind-address=127.0.0.1
# Вредный параметр, но иногда необходимо отключить проверку пароля условиям безопасности
# validate-password=off
innodb_buffer_pool_size=24G
innodb_log_file_size=256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method=O_DIRECT
max_connections=300

Что означают и для чего используются некоторые из этих параметров вы можете прочитать в статье MySQL 5.7 Performance Tuning Immediately After Installation на официальном сайте.

Самый важный параметр — innodb_buffer_pool_size. Устанавливаем равным 50%-80% от оперативной памяти, но не более размера вашей базы. Если у вас база на 100Mb устанавливаем значение параметра 200M с запасом. Для базы на 100Gb, при условии недостатка нужного количества оперативной памяти на сервере, значение параметра устанавливаем в пределах 50%-80% от оперативной памяти.

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

Дата: 01.08.2017Метки:

Небольшая заметка на тему установки ImageMagick в CentOS 7. Изначально имеется web-сервер, который установлен с помощью панели ISPmanager. Сначала нам нужно установить пакеты, которые необходимы для установки ImageMagick и расширения IMagick для PHP:

yum install gcc php-devel php-pear

После завершения установки необходимых пакетов, выполним установку непосредственно самого ImageMagick:

yum install ImageMagick ImageMagick-devel

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

pecl install imagick
echo "extension=imagick.so" > /etc/php.d/imagick.ini

После выполнения вышеуказанных действий, вам необходимо перезапустить apache, для этого используйте следующую команду:

service httpd reload

Установка PHP 5.6 в Ubuntu 16.04

Дата: 22.06.2017Метки: ,

В Ubuntu 16.04 Xenial уже давно из репозитория убрали PHP 5.6 и вместо него по умолчанию устанавливается новая версия PHP 7.0. Но как быть тем, кто по той или иной причине не может перейти на новую версию? В этом случае, если вы хотите использовать PHP 5.6 вам необходимо предварительно добавить репозиторий для старой версии.

Добавим ppa-репозиторий в систему:

sudo add-apt-repository ppa:ondrej/php
upt-get update

Далее запускаем установку PHP 5.6 и дополнительно указываем необходимые модули:

sudo apt-get install php5.6-mbstring php5.6-mysql php5.6-gd php5.6-xml

Установка ionCube Loader в Ubuntu 16.04

IonCube — расширение модуля PHP, которое загружает зашифрованные файлы PHP и ускоряет выполнение PHP-скриптов. Для установки ionCube необходимо прописать соответствующий модуль в файл конфигурации php.ini. Краткий мануал по установке ionCube Loader в Ubuntu 16.04. Предварительно система подготовлена следующим образом. На сервер автоматически установлен PHP 7 вместе с установкой панели Vesta.

Скачиваем последнюю версию Ioncube Loader для системы 64-bit:

cd /tmp
wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz

Или Ioncube Loader для системы 32-bit:

cd /tmp
wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz

Распаковываем:

tar xfz ioncube_loaders_lin_x86.tar.gz

Что бы определить расположение файла php.ini выполните команду:

php --ini |grep Loaded
Loaded Configuration File:         /etc/php/7.0/cli/php.ini

Следует отметить что путь будет указан для php-cli, каталог для php.ini модуля php-fpm должен быть на уровень выше.

Выясним расположение каталога модулей PHP:

# php -i |grep extension_dir
extension_dir => /usr/lib/php/20151012 => /usr/lib/php/20151012

Копируем модуль Ioncube Loader в каталог с расширениями:

cd /tmp/ioncube
cp ioncube_loader_lin_7.0.so /usr/lib/php/20151012

Добавим загрузку модуля в файл php.ini. Откройте файл:

nano /etc/php.ini

И добавьте в его начало следующую строку:

zend_extension = "/usr/lib/php/20151012/ioncube_loader_lin_7.0.so"

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

Перезапустим php-fpm или apache:

service apache2 restart
service php-fpm restart

Если все сделали правильно, то вы должны увидеть следующий результат выполнения команды:

# php -v
PHP 7.0.15-0ubuntu0.16.04.4 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with the ionCube PHP Loader (enabled) + Intrusion Protection from ioncube24.com (unconfigured) v6.0.8, Copyright (c) 2002-2015, by ionCube Ltd.

Сборка PHP7 для PrestaShop 1.7

Ранее я уже писал о сборке PHP7 из исходников. Предыдущая статья была написана в качестве примера, в ней я использовал набор параметров PHP, который необходим для работы блога WordPress. Изначально я отключил все неиспользуемые модули, поэтому теперь возникла необходимость заставить работать PrestaShop 1.7 на PHP7.

Я предпочитаю сразу отключать все лишнее. Указанные мною параметры — это минимальный набор модулей PHP7, который необходим для установки PrestaShop 1.7. Используйте статью по ссылке выше в качестве исходного материала. За исключением того, что вам необходимо указать следующие параметры сборки:

CONFIGURE_STRING="--prefix=/usr/local/php7-fpm \
--enable-fpm \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--with-mcrypt \
--enable-intl \
--enable-zip \
--enable-mysqlnd \
--enable-mbstring \
--enable-sockets \
--disable-cgi \
--disable-phar \
--with-config-file-scan-dir=/usr/local/php7-fpm/etc/conf.d \
--with-curl \
--with-gd \
--with-mysql-sock=/var/run/mysqld/mysqld.sock \
--with-mysqli \
--with-pdo-mysql \
--with-openssl \
--with-zlib \
--without-sqlite3 \
--without-pdo-sqlite"

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

configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.
configure: error: mcrypt.h not found. Please reinstall libmcrypt.

Проблему легко устранить, выполнив установку следующих пакетов:

apt-get install libicu-dev libmcrypt-dev

Дополнительно на сервере где будет работать PHP7 нужно установить пакет:

apt-get install mcrypt

Установка PHP7 и Apache2 в Debian 8

Дата: 21.06.2016Метки: ,

Много лет назад, когда еще не было Nginx, в мире интернета де-факто стандартом была связка из PHP и Apache. В те времена не было ни Amazon Web Services, Azure, Cloud Platform и прочих облачных систем. А VPS хостинг только начинал набирать популярность. Как правило, виртуальные машины стоили дорого и имели очень мало оперативной памяти. На моем первом VPS c Jail мне приходилось бороться за каждый мегабайт оперативной памяти. Даже после отключения всех неиспользуемых модулей Apache и прочей оптимизации, VPS периодически не справлялся с нагрузкой.

Сегодня я всеми путями пытаюсь отказаться от использования Apache. Но бывают ситуации, когда по той или иной причине приходится использовать Apache2. В данной записи я расскажу о установке связки из PHP7 и Apache2. Для установки свежей версии PHP7 я буду использовать репозиторий Dotdeb.

Для начала обновим локальный кеш пакетов и обновим нашу систему:

apt-get update && apt-get dist-upgrade

Выполните команду ниже для того чтобы установить Apache2:

apt-get install apache2

Для установки PHP7 для начала нам необходимо добавить репозиторий Dotdeb. Откройте файл:

nano /etc/apt/sources.list

Добавьте в конец файла две строки:

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

Скачиваем и устанавливаем ключ:

wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Обновляем локальный кеш пакетов:

apt-get update

Список доступных пакетов для установки:

# apt-cache search php7
libapache2-mod-php7.0 - server-side, HTML-embedded scripting language (Apache 2 module)
libphp7.0-embed - HTML-embedded scripting language (Embedded SAPI library)
php-all-dev - package depending on all supported PHP development packages
php7.0 - server-side, HTML-embedded scripting language (metapackage)
php7.0-apcu - APC User Cache for PHP
php7.0-apcu-bc - APCu Backwards Compatibility Module
php7.0-bz2 - bzip2 module for PHP
php7.0-cgi - server-side, HTML-embedded scripting language (CGI binary)
php7.0-cli - command-line interpreter for the PHP scripting language
php7.0-common - Common files for packages built from the PHP source
php7.0-curl - CURL module for PHP
php7.0-dbg - Debug symbols for PHP7.0
php7.0-dev - Files for PHP7.0 module development
php7.0-enchant - Enchant module for PHP
php7.0-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php7.0-gd - GD module for PHP
php7.0-geoip - GeoIP module for PHP
php7.0-gmp - GMP module for PHP
php7.0-igbinary - igbinary serializer for PHP
php7.0-imagick - Provides a wrapper to the ImageMagick library
php7.0-imap - IMAP module for PHP
php7.0-interbase - Interbase module for PHP
php7.0-intl - Internationalisation module for PHP
php7.0-json - JSON module for PHP
php7.0-ldap - LDAP module for PHP
php7.0-mcrypt - libmcrypt module for PHP
php7.0-memcached - memcached extension module for PHP, uses libmemcached
php7.0-mongodb - MongoDB driver for PHP
php7.0-msgpack - MessagePack serializer for PHP
php7.0-mysql - MySQL module for PHP
php7.0-odbc - ODBC module for PHP
php7.0-opcache - Zend OpCache module for PHP
php7.0-pgsql - PostgreSQL module for PHP
php7.0-phpdbg - server-side, HTML-embedded scripting language (PHPDBG binary)
php7.0-pspell - pspell module for PHP
php7.0-readline - readline module for PHP
php7.0-recode - recode module for PHP
php7.0-redis - PHP extension for interfacing with Redis
php7.0-snmp - SNMP module for PHP
php7.0-sqlite3 - SQLite3 module for PHP
php7.0-ssh2 - Bindings for the libssh2 library
php7.0-sybase - Sybase module for PHP
php7.0-tidy - tidy module for PHP
php7.0-xdebug - Xdebug Module for PHP
php7.0-xmlrpc - XMLRPC-EPI module for PHP
php7.0-xsl - XSL module for PHP

Запускаем установку PHP7:

apt-get install php7.0 php-pear

Перезапустим Apache2:

service apache2 restart

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

nano /etc/apache2/sites-enabled/000-default.conf

Находим директиву DocumentRoot:

DocumentRoot /var/www/html

И в корне указанного каталога создаем файл, который выведет информацию о PHP7:

nano /var/www/html/info.php

Добавьте в файл следующие строки:

<?php phpinfo();
?>

Открываем страницу в браузере:

http://exemple.com/info.php

Если открылась страница с конфигурацией PHP7, то вы все сделали правильно.

Primary script unknown while reading response header from upstream

Дата: 17.02.2016Метки:

Собирал на днях PHP 7 для своего VPS, на котором крутится этот блог. Ради интереса решил провести небольшой эксперимент и максимально отключить все неиспользуемые WordPress компоненты PHP. В процессе сборки я стараюсь всегда отключать все неиспользуемые модули. В этот раз решил дополнительно указал параметры, которые ранее никогда не использовал:

--disable-fileinfo
--disable-json
--disable-posix

После того как я запустил процесс php-fpm, я обнаружил, что сайт не работает. Не могу сказать, что я был сильно удивлен, поэтому решил сразу проверить логи nginx. В логах повторялась следующая ошибка:

"Primary script unknown" while reading response header from upstream.

Благо эту напасть удалось быстро победить. Для того чтобы завести PHP, необходимо указать в секции location ~ \.php$ директорию root, которая будет указывать на расположение файлов php. Если вы столкнулись с подобной ошибкой, убедитесь что в конфиге виртуального хоста nginx присутствуют следующие директивы:

location ~ \.php$ {
    root /usr/share/nginx/html;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    ...
}

Установка PHP 7 в Ubuntu

Дата: 24.01.2016Метки: ,

В этой статье я опишу процесс установка PHP 7 в Ubuntu из PPA-репозитория. Эта заметка будет написана в формате небольшого мануала, поэтому я постараюсь кратко изложить техническую техническую сторону процесса. Дополнительно, в предыдущих моих постах вы можете прочить как установить PHP 7 в Debian и CentOS. А еще есть описание процесса установки PHP 7 из исходников в Debian, это вариант более трудоемкий, но зато имеет очевидные преимущества с точки зрения оптимизации.

Установка PHP 7 в Ubuntu

На данный момент PHP 7 официально не доступен для установки в Ubuntu. Но мы можем установить PHP 7 в Ubuntu используя PPA — персональный репозиторий apt, размещенный на сайте Launchpad. С помощью PPA сторонние разработчики имеют возможность создавать и распространять пакеты для Ubuntu за пределами официальных каналов.

С помощью команды ниже добавьте репозиторий PHP 7 в Ubuntu:

add-apt-repository ppa:ondrej/php

После установки PPA, обновите локальный кэш пакетов:

apt-get update

Теперь у нас есть доступ к новым пакетам, мы можем выполнить установку PHP 7 в Ubuntu. В этой статье я опишу процесс настройки PHP 7 для использования его в связке с веб-сервером Nginx. Для этого нам потребуется установить PHP-FPM:

apt-get install php7.0-fpm

Если ваше скрипты используют в процессе работы MySQL, выполните команду:

apt-get install php7.0-mysql

Настройка PHP 7 для работы с Nginx

Процессы PHP 7 и Nginx взаимодействуют между собой с помощью unix-сокета. По умолчанию в PHP 7 unix-сокет имеет следующее расположение:

/var/run/php/php7.0-fpm.sock

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

nano /etc/nginx/sites-enabled/default

Полностью удалите все содержимое файла default, а заетем скопируйте строки из примера ниже:

server {
    listen 80 default_server;

    root /var/www/html;
    index index.php index.html;

    server_name _;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Закройте файл и сохраните изменения. Чтобы использовать новые настройки необходимо перезапустить Nginx:

nginx -t
service nginx restart

Проверка работы PHP 7

Чтобы проверить правильность установки и настройки PHP 7 в Ubuntu, в коневом каталоге сайта создайте файл:

nano /var/www/html/info.php

Следующего содержания:

<?php
phpinfo();
?>

Откройте файл в вашем браузере:

http://server_ip/info.php

Если вы правильно установили и настроили PHP 7 в Ubuntu, вы должны увидеть страницу содержащую информацию о его конфигурации.

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

Дата: 22.01.2016Метки: ,

Информация в данной записи немного устарела, рекомендую частично использовать информацию из статьи Веб-сервер на CentOS 7: Nginx, PHP 7.x, PerconaDB

В данной статье я расскажу о установке PHP 7, выпуск финальной версии которого стал одним из важнейших событий прошедшего года. Команда разработчиков выполнила просто огромную работу, судя по тестам, производительность PHP 7 вплотную приблизилась к показателям конкурента HHVM. Следует отметить, что рост производительности был достигнуть за счет оптимизации и никак не повлиял на увеличение потребления ресурсов.

Если сравнивать с предыдущей версией, то по моему мнению, PHP 7 абсолютно лишен недостатков. Исходя из имеющейся информации, можно сделать прогноз, что темпы перехода на PHP 7 будут достаточно быстрыми. Ранее я уже описывал процесс установки PHP 7 из исходников или репозитория Debian, в этой записи я расскажу как быстро установить PHP 7 в Cent OS 7.

На данный момент в официальном репозитории Cent OS 7 отсутствуют пакеты для установки PHP 7. Связи с чем, стоит немного повременить с переводом на PHP 7 серьезных коммерческих проектов. Зато будет не лишним установить PHP 7 на тестовый серевер, чтобы заранее проверить совместимость приложений и ознакомиться с новыми возможностями языка PHP 7.

В этой записи я опишу свой опыт установки PHP 7 для использования его в сочетании с веб-сервером Nginx. Для установки я использовал систему CentOS 7.1 и пакеты PHP 7 из неофициального репозитория IUS.

Установка PHP 7 в Cent OS 7

Перед установкой PHP 7 нам необходимо подключить к Cent OS репозиторий IUS. Для этого нам необходимо загрузить и выполнить специальный скрипт, после его запуска репозиторий IUS будет автоматически добавлен в систему.

Переходим в каталог tmp и загружаем скрипт на сервер:

cd /tmp
curl 'https://setup.ius.io/' -o setup-ius.sh

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

bash setup-ius.sh

Если на сервере присутствует PHP, удалите все установленные пакеты. Для первой установки PHP 7 на сервере, следующий пункт нужно пропустить.

yum remove php-fpm php-cli php-common

Чтобы установить PHP 7 и модули php-fpm, php-mysqlnd, выполните команду:

yum install php70u-fpm-nginx php70u-cli php70u-mysqlnd

Я установил PHP 7 с минимальным набором модулей. В дальнейшем вы можете установить дополнительные модули по своему усмотрению. Если у вас процесс установки прошел без ошибок — я вас поздравляю. У меня же первый блин был комом, с первой попытки установить PHP 7 в CentOS мне не удалось. Подробнее описание решения проблемы вы можете прочитать в конце статьи.

Настройка PHP 7 для работы с Nginx

После завершения установки PHP 7, нам нужно внести изменения в конфигурацию PHP-FPM и Nginx. По умолчанию в PHP 7 для соединений использует локальный TCP-порт. Общеизвестным фактом является то, что для лучшего быстродействия PHP-FPM и Nginx желательно использовать Unix-сокет.

Используя PHP-FPM можно обрабатывать несколько пулов дочерних процессов. По умолчанию в PHP 7 сконфигурирован на использование одного общего пула WWW. Его настройки хранятся в файле /etc/php-fpm.d/www.conf. Откройте этот файл в текстовом редакторе:

nano /etc/php-fpm.d/www.conf

Закомментируйте строку listen = 127.0.0.1:9000, она отвечает за работу PHP-FPM через порт 9000. Вместо нее раскомментируйте строку listen = /run/php-fpm/www.sock расположенную ниже.

;listen = 127.0.0.1:9000
; WARNING: If you switch to a unix socket, you have to grant your webserver user
;          access to that socket by setting listen.acl_users to the webserver user.
listen = /run/php-fpm/www.sock

Затем найдите блок listen.acl_users и раскомментируйте в нем строку listen.acl_users = nginx.

; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored
;listen.acl_users = apache,nginx
;listen.acl_users = apache
listen.acl_users = nginx
;listen.acl_groups =

Закройте файл и сохраните изменения. Теперь нам необходимо изменить конфигурацию Nginx, для того чтобы веб-сервер использовал сокет во время взаимодействия с PHP-FPM. Откройте файл:

nano /etc/nginx/conf.d/php-fpm.conf

Нам необходимо переключить способ взаимодействия Nginx и PHP-FPM с tcp-порта 9000 на использование сокета. Для этого измените содержимое файла следующим образом:

# PHP-FPM FastCGI server
# network or unix domain socket configuration

upstream php-fpm {
        #server 127.0.0.1:9000;
        server unix:/run/php-fpm/www.sock;
}

Закройте файл и сохраните изменения. Чтобы новые директивы вступили в силу нам необходимо перезапустить PHP-FPM и Nginx:

systemctl restart php-fpm
systemctl restart nginx

Вы можете проверить статус каждого сервиса, используя systemctl:

systemctl status php-fpm
systemctl status nginx

Проверка работы PHP 7

После того как мы установили PHP 7 и подготовили к работе веб-сервер Nginx, необходимо убедится, что все настроено правильно. Начните с проверки версии PHP, для этого выполните команду:

# php -v
PHP 7.0.1 (cli) (built: Dec 18 2015 16:35:26) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies

Затем создадим в корневом каталоге веб-сервера файл info.php:

nano /usr/share/nginx/html/info.php

Скопируйте в файл следующий код:

<?php
phpinfo();

Закройте файл и сохраните изменения. Введите в браузере ip-адрес или доменное имя вашего сервера и укажите название файла info.php:

http://server_ip/info.php

Если вы правильно установили и настроили PHP 7 в CentOS, вы должны увидеть страницу содержащую информацию о конфигурации PHP 7.

Проблемы во время установки PHP 7

Далее я расскажу о небольшой проблеме, с которой я столкнулся во время установки PHP 7 на CentOS 7.1.

Error: Package: php70u-fpm-7.0.1-1.ius.centos7.x86_64 (ius)
           Requires: libsystemd.so.0()(64bit)
Error: Package: php70u-fpm-7.0.1-1.ius.centos7.x86_64 (ius)
           Requires: libsystemd.so.0(LIBSYSTEMD_209)(64bit)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Очень часто хостеры вносят свои изменения в шаблоны контейнеров виртуальных машин. В моем случае, проблема была вызвана тем, что CentOS 7 использовала кривые зеркала centos-base и testing репозиториев. Для тех, кто столкнулся с подобной проблемой, откройте файл:

nano /etc/yum.repos.d/CentOS-Base.repo

Чтобы устанавливать пакеты из официальных репозиториев CentOS 7, используйте конфигурацию ниже:

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7