Установка PHP 7(php-fpm) с Nginx в Unix/Linux

Еще в 2014м годе, Zend провел голосование и по результатам голосов, новая версия ПО получила название — PHP7. На данный момент (2019 год), самая последняя версия ПО — это PHP-7.4.

Установка PHP 7(php-fpm) с Nginx в Centos/RedHat/Fedora

Подключаем необходимые репозитории, — стоит подключить EPEL и REMI. Документация тут:

Установка EPEL

Установка REMI

Выполним поиск пакета:

$ yum --enablerepo=remi search php74

Чтобы поставить, выполняем:

$ yum --enablerepo=remi install php74 php74-php-fpm -y

PS: Версии можно менять, например php71, php72, php73.

Если необходимо, можно поставить модули, например:

$ yum --enablerepo=remi-php74 install -y \
	php74-php-bcmath \
	php74-php-gd \
	php74-php-gmp \
	php74-php-imap \
	php74-php-intl \
	php74-php-json \
	php74-php-ldap \
	php74-php-mbstring \
	php74-php-mysql \
	php74-php-odbc \
	php74-php-pdo \
	php74-php-snmp \
	php74-php-soap \
	php74-php-tidy \
	php74-php-xml \
	php74-php-xmlrpc \
	php74-php-cli \
	php74-php-devel \
	php74-php-lz4 \
	php74-php-opcache \
	php74-php-pecl-apcu \
	php74-php-pecl-crypto \
	php74-php-pecl-json-post \
	php74-php-pecl-memcache \
	php74-php-pecl-memcached \
	php74-php-pecl-rrd \
	php74-unit-php

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

# yum-config-manager --enable remi-php74

Чтобы проверить версию, выполним:

$ php74 -v
PHP 7.4.0RC4 (cli) (built: Oct 15 2019 11:28:21) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.0RC4, Copyright (c), by Zend Technologies

Если есть необходимость внести какие-то настройки в сам php, то открываем:

# vim /etc/opt/remi/php74/php.ini

Если нужно внести изменения в php-fpm, открываем:

# vim /etc/opt/remi/php74/php-fpm.d/www.conf

У меня он выглядит:

; Start a new pool named 'www'.
[www]

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.

user = www
group = www

;user = nginx
;group = nginx

listen = 127.0.0.1:9001
;listen = /tmp/php74-fpm.sock  ;/var/run/php74-fpm/php74-fpm.sock

;listen.allowed_clients = 127.0.0.1:/php_admin_value


; Set listen(2) backlog. A value of '-1' means unlimited.
; Default Value: -1
;listen.backlog = -1

; List of ipv4 addresses of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
listen.allowed_clients = 127.0.0.1

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
;                 mode is set to 0666
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0666

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
;user = apache
; RPM: Keep a group allowed to write in log dir.
;group = apache

; Choose how the process manager will control the number of child processes.
; Possible Values:
;   static  - a fixed number (pm.max_children) of child processes;
;   dynamic - the number of child processes are set dynamically based on the
;             following directives:
;             pm.max_children      - the maximum number of children that can
;                                    be alive at the same time.
;             pm.start_servers     - the number of children created on startup.
;             pm.min_spare_servers - the minimum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is less than this
;                                    number then some children will be created.
;             pm.max_spare_servers - the maximum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is greater than this
;                                    number then some children will be killed.
; Note: This value is mandatory.
pm = dynamic

; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes to be created when pm is set to 'dynamic'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI.
; Note: Used when pm is set to either 'static' or 'dynamic'
; Note: This value is mandatory.
pm.max_children = 110
;50

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 30

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 30

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 45

; The number of seconds after which an idle process will be killed.
; Note: Used only when pm is set to 'ondemand'
; Default Value: 10s
pm.process_idle_timeout = 30s

; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
pm.max_requests = 500000000

; The URI to view the FPM status page. If this value is not set, no URI will be
; recognized as a status page. By default, the status page shows the following
; information:
;   accepted conn    - the number of request accepted by the pool;
;   pool             - the name of the pool;
;   process manager  - static or dynamic;
;   idle processes   - the number of idle processes;
;   active processes - the number of active processes;
;   total processes  - the number of idle + active processes.
; The values of 'idle processes', 'active processes' and 'total processes' are
; updated each second. The value of 'accepted conn' is updated in real time.
; Example output:
;   accepted conn:   12073
;   pool:             www
;   process manager:  static
;   idle processes:   35
;   active processes: 65
;   total processes:  100
; By default the status page output is formatted as text/plain. Passing either
; 'html' or 'json' as a query string will return the corresponding output
; syntax. Example:
;   http://www.foo.bar/status
;   http://www.foo.bar/status?json
;   http://www.foo.bar/status?html
; Note: The value must start with a leading slash (/). The value can be
;       anything, but it may not be a good idea to use the .php extension or it
;       may conflict with a real PHP file.

; The ping URI to call the monitoring page of FPM. If this value is not set, no
; URI will be recognized as a ping page. This could be used to test from outside
; that FPM is alive and responding, or to
; - create a graph of FPM availability (rrd or such);
; - remove a server from a group if it is not responding (load balancing);
; - trigger alerts for the operating team (24/7).
; Note: The value must start with a leading slash (/). The value can be
;       anything, but it may not be a good idea to use the .php extension or it
;       may conflict with a real PHP file.
; Default Value: not set
;ping.path = /ping

pm.status_path = /status

; This directive may be used to customize the response of a ping request. The
; response is formatted as text/plain with a 200 response code.
; Default Value: pong
;ping.response = pong

; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_terminate_timeout = 600s

; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
;request_slowlog_timeout = 0

; The log file for slow requests
; Default Value: not set
; Note: slowlog is mandatory if request_slowlog_timeout is set
slowlog = /var/log/php-fpm/www-slow.log

; Set open file descriptor rlimit.
; Default Value: system defined value
rlimit_files = 65535

; Set max core size rlimit.
; Possible Values: 'unlimited' or an integer greater or equal to 0
; Default Value: system defined value
;rlimit_core = 0

; Chroot to this directory at the start. This value must be defined as an
; absolute path. When this value is not set, chroot is not used.
; Note: chrooting is a great security feature and should be used whenever
;       possible. However, all PHP paths will be relative to the chroot
;       (error_log, sessions.save_path, ...).
; Default Value: not set
;chroot =

; Chdir to this directory at the start. This value must be an absolute path.
; Default Value: current directory or / when chroot
chdir = /

; Redirect worker stdout and stderr into main error log. If not set, stdout and
; stderr will be redirected to /dev/null according to FastCGI specs.
; Default Value: no
;catch_workers_output = yes

; Limits the extensions of the main script FPM will allow to parse. This can
; prevent configuration mistakes on the web server side. You should only limit
; FPM to .php extensions to prevent malicious users to use other extensions to
; exectute php code.
; Note: set an empty value to allow all extensions.
; Default Value: .php
security.limit_extensions = .php .php3 .php4 .php5

; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

; Additional php.ini defines, specific to this pool of workers. These settings
; overwrite the values previously defined in the php.ini. The directives are the
; same as the PHP SAPI:
;   php_value/php_flag             - you can set classic ini defines which can
;                                    be overwritten from PHP call 'ini_set'.
;   php_admin_value/php_admin_flag - these directives won't be overwritten by
;                                     PHP call 'ini_set'
; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.

; Defining 'extension' will load the corresponding shared extension from
; extension_dir. Defining 'disable_functions' or 'disable_classes' will not
; overwrite previously defined php.ini values, but will append the new value
; instead.

; Default Value: nothing is defined by default except the values in php.ini and
;                specified at startup with the -d argument
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_reporting] = 0
php_admin_value[error_log] = /var/log/php-fpm/php74-fpm.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M

php_admin_flag[log_errors] = on
php_admin_flag[display_errors] = on

; Set session path to a directory owned by process user
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

Чтобы запустить php-fpm, выполните:

 # systemctl start php74-php-fpm.service

Чтобы проверить статус, выполните:

# systemctl status php74-php-fpm.service

Можно сервис добавить в автозагрузку ОС:

# systemctl enable php74-php-fpm.service

Как-то так.

Установка PHP 7(php-fpm) с Nginx 1.9 в Debian 8

Недавно, вышла новая версия PHP7. В данной статье «Установка PHP 7 в Debian 8» я хотел бы уделить внимание установки PHP 7 в Debian 8.

И так начнем…

Установка nginx 1.9 в Debian 8.

Для начала, добавляем ключ:

#apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62

Добавляем репозиторий:

# echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list

И выполняем установку:

# apt-get update && apt-get install -y ca-certificates nginx

Я ленивый иногда, по этому для этой задачи, я написал bash скрипт. Вы можете его тоже использовать:

# cd /usr/local/src && wget https://raw.githubusercontent.com/SebastianUA/Nginx-1.9-PHP-7-PHP7-FPM/master/Install-nginx1.9.x.sh   && bash Install-nginx1.9.x.sh

Установка PHP 7 в Debian 8 с использованием репозитория Dotdeb.

Чтобы установить PHP 7 на Debian 8, но для начала добавляем репозиторий:

# echo "deb http://packages.dotdeb.org jessie all" >> /etc/apt/sources.list && echo "deb-src http://packages.dotdeb.org jessie all" >> /etc/apt/sources.list

После этого, загружаем и запускаем ключ GnuPG:

# cd /usr/local/src && wget https://www.dotdeb.org/dotdeb.gpg && apt-key add dotdeb.gpg

Обновляем репозиторий:

# apt-get update

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

# apt-get install -y php7.0-fpm

Чтобы запустить PHP 7, используйте:

Запуск:

# service php7.0-fpm start

Останавливаем:

# service php7.0-fpm stop

Перезапуск:

# service php7.0-fpm restart

Чтобы проверить, правильно ли сконфигурирован конфиг php-fpm, используйте:

# php7.0-fpm -t

Ну это простой вариант и взят в качестве примера (что можно использовать данный репозиторий), а дальше, я опишу нормальное решение.

Установка PHP 7 в Debian 8 с исходного кода.

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

# apt-get install -y wget curl git vim make checkinstall build-essential libtool gettext libpcre3 libpcre3-dev libldap2-dev libpq-dev libxslt-dev libxpm-dev libmysqlclient-dev libgmp3-dev libpng12-dev libpng-dev libfreetype6-dev autoconf re2c bison libssl-dev libcurl4-openssl-dev pkg-config openssl libpng-dev libpspell-dev librecode-dev libreadline-dev libjpeg-dev libxml2 libxml2-dev libbz2-dev libmcrypt-dev libicu-dev libltdl-dev libcurl3

Я указал все нужные зависимости для моей сборки, вы можете дополнить их (в зависимости от своих нужд). Если не сделать это, то вы получите ошибку в процессе выполнения команды ./configure.

Переходим в директорию, скачиваем и распаковываем архив с php7, для этого выполните команду:

# cd /usr/src && wget http://be2.php.net/get/php-7.0.2.tar.gz/from/this/mirror -O php-7.0.2.tar.gz && tar -xzf php-*.tar.gz

Вы можете использовать другую ссылку (если вышла пхп свежей версии) с официального сайта.

Переходим в папку:

# cd php-*

Добавляем нужные модули в свою сборку и указываем параметры:

./buildconf --force CONFIGURE_STRING=" --prefix=/usr/local/php7 \  --with-config-file-path=/usr/local/etc \  
--with-config-file-scan-dir=/usr/local/php7/etc/conf.d \  
--enable-mbstring \  
--with-curl \  
--with-openssl \  
--with-xmlrpc \  
--enable-soap \  
--enable-zip \  
--with-gd \  
--with-jpeg-dir \  
--with-png-dir \  
--with-pgsql \  
--enable-embedded-mysqli \  
--with-freetype-dir \  
--enable-intl \  
--with-xsl \  
--with-mysqli \  
--with-pdo-mysql \  
--enable-pdo=shared \  
--with-pdo-mysql=shared \  
--with-pdo-sqlite=shared \  
--with-pdo-pgsql=shared \  
--disable-short-tags \  
--enable-phpdbg \  
--with-readline \  
--with-gettext \  
--enable-opcache \  
--enable-xdebug \  
--enable-intl \  
--enable-mbstring \  
--enable-pcntl \  
--enable-sockets \  
--enable-sysvmsg \  
--enable-sysvsem \  
--enable-sysvshm \  
-enable-ftp \  
--enable-fpm \  
--enable-shmop \  
--with-fpm-user=www-data \  
--with-fpm-group=www-data \  
--bindir=/usr/local/bin \  
--sbindir=/usr/local/sbin \  
--libdir=/usr/local/php7/lib \  
--includedir=/usr/local/php7/include \  
--mandir=/usr/local/php7"

При необходимости, можно просмотреть весь список доступных модулей:

# ./configure --help

А сейчас, приступаем к компиляции и собственно к самой установки PHP 7:

# ./configure $CONFIGURE_STRING 
# make && make install

Идем далее, копируем конфигурационный файл с php.ini в папку установки PHP:

# cp /usr/src/php-7.0.2/php.ini-production /usr/local/etc/php.ini

Подключаем модуль Zend OPcache: /usr/local/php7/etc/conf.d

# vim /usr/local/etc/modules.ini

Прописываем в него:

# Zend OPcache
zend_extension=opcache.so

И так, настроим сейчас PHP-FPM, для этого открываем файл:

# vim /usr/local/php7/etc/php-fpm.d/www.conf

И прописываем в него:

[global] 
pid = /var/run/php7-fpm.pid 
error_log = /var/log/php7-fpm.log 
include=/usr/local/php7/etc/php-fpm.d/*.conf 
Затем создайте файл: nano /usr/local/php7/etc/php-fpm.d/www.conf И добавьте в него параметры: 
[www] 
user = www-data 
group = www-data 
listen = /var/run/php7-fpm.sock 
listen.owner = www-data 
listen.group = www-data 
listen.mode = 0660 
pm = dynamic 
pm.max_children = 5 
pm.start_servers = 2 
pm.min_spare_servers = 1 
pm.max_spare_servers = 3 

И для этого, создаем init.d скрипт:

# cd /etc/init.d && wget http://linux-notes.org/wp-content/uploads/files/php7-fpm

Назначаем нужные права (исполнение) и добавляем скрипт в автозагрузку своей ОС:

# chmod +x /etc/init.d/php7-fpm
# update-rc.d php7-fpm defaults

Чтобы запустить (в данном случае перезапусить) php7-fpm выполняем:

# service php7-fpm restart

Если используете PHP-FPM с Nginx, то нужно добавьте в блок server виртуального хоста следующий текст:

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

PS: Для всего этого, я написал bash скрипт, вы можете его использовать для своих нужд:

# cd /usr/local/src && wget https://raw.githubusercontent.com/SebastianUA/Nginx-1.9-PHP-7-PHP7-FPM/master/Install-PHP7.sh && bash Install-PHP7.sh

Осталось только перезапустить все службы:

# service nginx restart &&  service php7-fpm restart

Вот и все!

Чтобы проверить, правильно ли сконфигурирован конфиг php-fpm, используйте:

# php7-fpm -t

Установка PHP 7(php-fpm) с Nginx в MacOS

Для начала устанавливаем homebrew, ссылку можно найти тут:

Установка homebrew на MacOS

После чего, можно выполнить поиск и посмотреть какие версии актуальны на данный момент:

$ brew search php7
==> Formulae
php@7.1                                                             php@7.2                                                             php@7.3

Чтобы уствновить, используем:

$ brew install php@7.3

Проверить версию, можно так:

$ php -v

Установка PHP 7(php-fpm) с Nginx на другие Unix/Linux ОС

Для других Unix/Linux ОС, не приходилось ставить еще. Но можно заюзать — Docker, как пример!

Обновление PHP (php-fpm) с Nginx в CentOS/Fedora/Redhat

Будет скоро…

А на этом у меня все, статья «Установка PHP 7(php-fpm) с nginx в Unix/Linux» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.