PHP 7.2 fastcgi не работает на сервере Ubuntu 18.04

Я только что установил LAMP на сервер Ubuntu 18.04, и я не могу заставить PHP fastcgi работать. Вот мои настройки:

Мой fpm PHP-файл: /etc/php/7.2/fpm/pool.d/sites.mydomain.conf

[sites.mydomain]
 ...
user = sites
group = sites
 ...
listen = /run/php/php7.2-fpm.sites.mydomain.sock
 ...
listen.owner = www-data
listen.group = www-data

затем

sudo service php7.2-fpm reload
sudo service php7.2-fpm restart

Мой файл виртуального хоста: etc / apache2 / sites-available / sites.mydomain.conf

    ServerName sites.mydomain
    ServerAdmin webmaster@localhost
    DocumentRoot /srv/www/sites/html

    <IfModule mod_fastcgi.c>
      AddHandler php7-fcgi-sites .php
      Action php7-fcgi-sites /php7-fcgi-sites
      Alias /php7-fcgi-sites /usr/lib/cgi-bin/php7-fcgi-sites
     FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-sites -idle-timeout 60 -socket /var/run/php/php7.2-fpm.sites.mydomain.sock -pass-header Authorization

      <Directory /usr/lib/cgi-bin>
        Require all granted
      </Directory>
    </IfModule>

    <Directory /srv/www/sites/html>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride None
      Require all granted
    </Directory>

затем

sudo a2enmod actions
sudo service apache2 restart

Но PHP не интерпретируется при запуске скриптов, страницы отображаются в виде простого текста.
Может кто-нибудь подскажет, что не так в моей настройке?

Примечание: я установил его точно так же на моем сервере Ubuntu 16.04, и он работает нормально.

6 ответов

Решение

Наконец, нет необходимости устанавливать libapache2-mod-fastcgi пакет.
Трюк происходит в etc/apache2/sites-available/sites.mydomain.conf файл (см. мой пример выше).
Заменить <IfModule mod_fastcgi.c> расставаться с

<FilesMatch "\.php$">
   SetHandler "proxy:unix:///var/run/php/php7.2-fpm.sites.mydomain.sock|fcgi://sites/"
</FilesMatch>

и вы сделали.
Надеюсь, поможет.

Я, к сожалению, воспользовался советом здесь ответов, которые либо неверны, либо касательны.

Немного покопавшись, я понял, что рассматриваемый модуль (proxy_fcgi) на самом деле является частью пакета bionic apache2-bin

так что все, что нужно было:

a2enmod proxy_fcgi

Итак... Я немного покопался в этом.

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

Но оба они кажутся довольно устаревшими, и кажется, что пакет libapache2-mod-fastcgi был извлечен из Debian по разным причинам: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=835374

Однако, начиная с Apache 2.4.10, лучше всего использовать модуль mod_proxy_fcgi с php fpm. https://serverfault.com/questions/783173/differences-between-mod-fastcgi-and-mod-proxy-fcgi

Надеюсь, это поможет прояснить ситуацию. Кажется, что большинство руководств по php-fpm еще не обновлены для использования mod_proxy_fcgi, поэтому может вызвать путаницу.

Из того, что я понимаю, это может быть libapache2-mod-fastcgi пакет пока недоступен для бионики. Таким образом, нет модуля fastcgi для Apache2.

Я обновился с 17.10 до 18.04, и страницы просто загружались с содержимым php-файла, а не отображали страницу. Все, что мне нужно было сделать, это обновить мой /etc/apache2/mods-enabled/fastcgi.conf файл со следующим:

<IfModule mod_fastcgi.c>
  AddHandler php7-fcgi-sites .php
  Action php7-fcgi-sites /php7-fcgi-sites
  Alias /php7-fcgi-sites /usr/lib/cgi-bin/php7-fcgi-sites
 FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-sites -idle-timeout 60 -socket /var/run/php/php7.2-fpm.sock -pass-header Authorization

  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory>
</IfModule>

Для пользователей Ubuntu 20-22:

Цель:

Установите fpm с сокетами + модуль fcgid + примените права пользователя на запросы для каждого домена.

шаг 1: установка

      sudo apt-get update
sudo systemctl stop apache2
sudo apt-get install libapache2-mod-fcgid
sudo apt-get install php8.1-fpm

# ubuntu 20 missing libs?!
sudo apt-get install php-mbstring
sudo apt-get install php-gd

шаг 2: отключить/включить модули

      sudo a2dismod php* mpm_prerfork cgi cgid
sudo a2enmod mpm_event fcgid proxy_fcgi headers rewrite
# Ubuntu 20
sudo a2enconf php7.4-fpm
# Ubuntu 22
sudo a2enconf php8.1-fpm

шаг 3: добавьте команды конфигурации

Пользователь: "Джон"

Домен: "mydomain.com"

(а). Конфигурация Apache FPM

      sudo nano /etc/apache2/mods-available/fcgid.conf

тип:

      <IfModule mod_fcgid.c>
  FcgidConnectTimeout 20
  AddType   application/x-httpd-php .php
  AddHandler    application/x-httpd-php .php
  <IfModule mod_mime.c>
    AddHandler fcgid-script .fcgi
  </IfModule>
</IfModule>

(б). Конфигурация ФПМ

      # Ubuntu 20
sudo cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/mydomain.com.conf
# Ubuntu 22
sudo cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/mydomain.com.conf

изменять:

      [www] -> [mydomain.com]
user = www-data -> user = john
group = www-data -> group = john

добавить или оставить пустым:

      ;;;;;;;;;;
; Memory ;
;;;;;;;;;;
php_admin_value[memory_limit] = 12M
php_admin_value[post_max_size] = 12M
php_admin_value[upload_max_filesize] = 12M
;;;;;;;;;;;;
; Settings ;
;;;;;;;;;;;;
php_value[user_ini.filename] = ".user.ini"
php_value[default_charset] = "UTF-8"
php_flag[short_open_tag] = Off
php_flag[display_errors] = On
php_flag[display_startup_errors] = On
php_flag[log_errors] = On
php_value[log_errors_max_len] = 1024
php_flag[report_memleaks] = On
php_flag[html_errors] = On
php_value[error_reporting] = E_ALL & ~E_DEPRECATED & ~E_STRICT
php_flag[file_uploads] = On
php_value[max_file_uploads] = 20
php_flag[allow_url_fopen] = On
php_flag[allow_url_include] = Off
php_value[session.save_handler] = files
php_flag[session.use_strict_mode] = 1
php_flag[session.use_cookies] = 1
php_flag[session.use_only_cookies] = 1
; temporary disabled for step 5 system('whoami'); to run!
;php_admin_value[disable_functions] = exec,passthru,shell_exec,system
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
php_admin_value[error_log] = "/var/www/mydomain.com/log/php_errors.log"
php_admin_value[open_basedir] = "/var/www/mydomain.com/"
php_admin_value[doc_root] = "/var/www/mydomain.com"
php_admin_value[sys_temp_dir] = "/var/www/mydomain.com/tmp"
php_admin_value[upload_tmp_dir] = "/var/www/mydomain.com/tmp"
php_admin_value[session.save_path] = "/var/www/mydomain.com/session"
php_admin_value[soap.wsdl_cache_dir] = "/var/www/mydomain.com/tmp"
php_admin_value[curl.cainfo] = "/var/www/mydomain.com/server/registry/cacert.pem"

php_admin_value,php_admin_flag: не может быть изменен пользователем

php_value,php_flag: может быть изменен пользователем

(с). Создать виртуальный хост

      sudo nano /etc/apache2/sites-available/mydomain.com.conf

тип:

      <VirtualHost *:80>
ServerName mydomain.com.localhost
ServerAlias mydomain.com.localhost
ServerAdmin admin@mydomain.com

DocumentRoot /var/www/mydomain.com

Header set Access-Control-Allow-Origin "*"

<IfModule mod_fcgid.c>
    FcgidConnectTimeout 20
    AddType   application/x-httpd-php .php
    AddHandler    application/x-httpd-php .php

    # Ubuntu 20
    ProxyPassMatch " ^/(.*\.php(/.*)?)$" "unix:/run/php/php7.4-fpm.mydomain.com.sock|fcgi://localhost/var/www/mydomain.com/"
    # Ubuntu 22
    ProxyPassMatch " ^/(.*\.php(/.*)?)$" "unix:/run/php/php8.1-fpm.mydomain.com.sock|fcgi://localhost/var/www/mydomain.com/"

    <Directory /var/www/mydomain.com/>
        Options +ExecCGI
        Options -Indexes
        AllowOverride None
        Require all granted
#        FRONT CONTROLLER PATTERN
#        RewriteEngine On
#        RewriteCond "%{REQUEST_URI}" "!=/public_html/index.php"
#        RewriteRule "^(.*)$" "/public_html/index.php?$1" [NC,NE,L,PT,QSA]
    </Directory>
</IfModule>

# CPU usage limits 5s 10s
RLimitCPU 5 10
# memory limits to 10M 20M
RLimitMEM 10000000 20000000
# limit of forked processes 20 30
RLimitNPROC 20 30
LogLevel warn
ErrorLogFormat connection "[%t] New connection: [%{c}L] [ip: %a]"
ErrorLogFormat request "[%t] [%{c}L] New request: [%L] [pid %P] %F: %E"
ErrorLogFormat "[%t] [%{c}L] [%L] [%l] [pid %P] %F: %E: %M"
ErrorLog /var/www/mydomain.com/log/apache_error.log
CustomLog /var/www/mydomain.com/log/apache_access.log combined
ServerSignature Off
</VirtualHost>

(г). Сеть

      sudo nano /etc/hosts

тип(*):

      127.0.0.1   localhost
127.0.0.1   mydomain.com
127.0.1.1   aspire1.machine.com aspire1

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

создать или отредактировать файл:

      sudo nano /etc/localhost

введите туда(*):

      aspire1

(*)заменятьaspire1с любым коротким именем, которое вам нравится.

шаг 4: загрузить виртуальный хост

      sudo a2ensite mydomain.conf

шаг 5: создайте файлы домена + разрешения

      sudo mkdir -p  /var/www/mydomain.com/public_html
sudo mkdir /var/www/mydomain.com/log/
sudo touch /var/www/mydomain.com/public_html/info.php
sudo nano /var/www/mydomain.com/public_html/info.php

вinfo.phpтип:

      <?php

echo '<b>';
echo php_sapi_name();
echo '</b><br>';

printf("%s<br>", 'DOCUMENT_ROOT=<b>'.$_SERVER['DOCUMENT_ROOT'].'</b>');

printf("%s", 'User=<b>');
system('whoami');
echo '</b><br>';

phpinfo();

Назначение разрешений:

      sudo chown -R  john:john /var/www/mydomain.com
sudo find /var/www/mydomain.com -type d -name '*' -exec chmod 700 {} \;
sudo find /var/www/mydomain.com -type f -name '*' -exec chmod 600 {} \;
# open execute
sudo chmod 711 /var/www/mydomain.com
sudo chmod 711 /var/www/mydomain.com/public_html

Шаг 6: Зажигание!

      # Ubuntu 20
sudo service php7.4-fpm reload
sudo service php7.4-fpm restart
# Ubuntu 22
sudo service php8.1-fpm reload
sudo service php8.1-fpm restart
sudo systemctl restart apache2

шаг 7: кабина!

Предположим, вы не включилиrewriteв файле vhost откройте браузер и введите:

      mydomain.localhost/public_html/info.php

шаг 8: переключите конфигурацию Apache

Давайте переключимся с FPM на modphp:

      # Ubuntu 20
sudo a2disconf php7.4-fpm
sudo a2enmod php7.4
# Ubuntu 22
sudo a2disconf php8.1-fpm
sudo a2enmod php8.1
######
sudo a2dismod mpm_event
sudo a2dismod fcgid
sudo a2dismod proxy_fcgi
sudo a2enmod mpm_prefork
sudo systemctl restart apache2

Давайте переключимся с modphp на FPM:

      # Ubuntu 20
sudo a2enconf php7.4-fpm
sudo a2dismod php7.4
# Ubuntu 22
sudo a2enconf php8.1-fpm
sudo a2dismod php8.1
######
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod fcgid
sudo a2enmod proxy_fcgi
# Ubuntu 20
sudo service php7.4-fpm reload
# Ubuntu 22
sudo service php8.1-fpm reload
######
sudo systemctl restart apache2

Удачи!

Ссылка:

  1. https://www.linode.com/docs/guides/how-to-install-and-configure-fastcgi-and-php-fpm-on-ubuntu-18-04/
  2. https://www.linode.com/docs/guides/how-to-install-and-configure-fastcgi-and-php-fpm-on-debian-10/
Другие вопросы по тегам