PHP5-FPM + Apache2 no Debian Wheezy: connect () falhou com o FastCGI

1

Eu tenho esse erro no Debian Wheezy, eu não entendo o que estou perdendo. Logs do php5-fpm estão OK.

Erro do apache2 log:

[error] (2)No such file or directory: FastCGI: failed to connect to server "/var/lib/apache2/fastcgi/php5.fastcgi": connect() failed
[error] FastCGI: incomplete headers (0 bytes) received from server "/var/lib/apache2/fastcgi/php5.fastcgi"

O conteúdo do fastcgi.conf :

<IfModule mod_fastcgi.c>
  AddHandler fastcgi-script .fcgi
  #FastCgiWrapper /usr/lib/apache2/suexec
  FastCgiIpcDir /var/lib/apache2/fastcgi
</IfModule>

O conteúdo do php5-fpm.conf :

<IfModule mod_fastcgi.c>
  Alias /php5.fastcgi /var/lib/apache2/fastcgi/php5.fastcgi
  AddHandler php-script .php
  FastCGIExternalServer /var/lib/apache2/fastcgi/php5.fastcgi -socket /var/run/php5-fpm.sock -idle-timeout 610
  Action php-script /php5.fastcgi virtual

  # Forbid access to the fastcgi handler.
  <Directory /var/lib/apache2/fastcgi>
    <Files php5.fastcgi>
      Order deny,allow
      Allow from all
    </Files>
  </Directory>

  # FPM status page.
  <Location /php-fpm-status>
    SetHandler php-script
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 ::1
  </Location>

  # FPM ping page.
  <Location /php-fpm-ping>
    SetHandler php-script
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 ::1
  </Location>
</IfModule>

O conteúdo de pool.d / www.conf :

[www]
listen = /var/run/www.sock

; Permission socket
listen.owner = www
listen.group = www

; Utilsateur/Groupe des processus
user = www
group = www

; gestion des processus
pm = dynamic

pm = dynamic
pm.max_children = 500
pm.start_servers = 500
pm.min_spare_servers = 150
pm.max_spare_servers = 500

request_terminate_timeout = 605

; Status
pm.status_path = /php-fpm-status
ping.path = /php-fpm-ping

; log
access.log = /var/log/php/access.www.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

;Conf PHP
php_admin_value[open_basedir]=/home/web/xxx/www/prod
php_admin_value[session.save_path]=/home/web/xxx/www/tmp
php_admin_value[upload_tmp_dir]=/home/web/xxx/www/tmp
php_admin_value[error_log] = /var/log/php/error.www.log
php_admin_flag[log_errors] = on
php_admin_value[max_execution_time] = 0
php_admin_value[max_input_time] = 0
; upload
php_admin_value[upload_max_filesize] = 105M
php_admin_value[post_max_size] = 105M

O Apache VHost www :

<VirtualHost *:80>
  ServerName xxxx.com

  ServerAdmin [email protected]
  DocumentRoot /home/web/xxxx/www/prod
  Options None

O Fast CGI + FPM :

 FastCgiExternalServer /home/web/xxxx/www/cgi-bin/php5.external -idle-timeout 310 -flush -socket /var/run/www.sock
  Alias /cgi-bin/ /home/web/xxxx/www/cgi-bin/


 <Directory /home/web/xxxx/www/prod/>
    Options Indexes FollowSymLinks Includes
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  ErrorLog /var/log/apache2/error.www_prod.log
  LogLevel debug
  CustomLog /var/log/apache2/access.www_prod combined
</VirtualHost>

A saída de grep www / etc / passwd :

www:x:1001:1001:,,,:/home/web/xxxx/www:/bin/bash

A saída de apache2ctl -t -D DUMP_MODULES :

Loaded Modules:
 core_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 mpm_worker_module (static)
 http_module (static)
 so_module (static)
 actions_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_file_module (shared)
 authz_default_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgid_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 fastcgi_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 ssl_module (shared)
 status_module (shared)
Syntax OK

O que estou perdendo?

    
por Dingding 19.07.2013 / 13:12

2 respostas

1

no pool.d / www.conf, anote

listen = /var/run/www.sock

no php5-fpm.conf, nesta linha:

FastCGIExternalServer /var/lib/apache2/fastcgi/php5.fastcgi -socket /var/run/php5-fpm.sock -idle-timeout 610

/var/run/php5-fpm.sock deve ser o mesmo que a opção de escuta no pool.d / www.conf

No VHost www:

FastCgiExternalServer /home/web/xxxx/www/cgi-bin/php5.external -idle-timeout 310 -flush -socket /var/run/www.sock

Esta linha é inútil sem

Alias /php5.external /home/web/xxxx/www/cgi-bin/php5.external
Action php-script /php5.external virtual

Espero que isso ajude.

    
por 20.07.2013 / 12:51
0

Você pode ler sobre isso aqui: link

Estou assumindo que você deseja executar cada vhost como um usuário / grupo diferente. Caso contrário, você precisará apenas deles praticamente em qualquer lugar em seus arquivos conf (pode estar em fastcgi.conf). Para isso, confira este URL:

link

Para a corrida como coisa do usuário, tentarei explicar como isso funciona:

Eu não acho que você tenha que tocar o php-fpm.conf, apenas deixe como é quando você instalou o php5-fpm Sem comentários, o meu parece assim:

php-fpm.conf

[global]

pid = /var/run/php5-fpm.pid
error_log = /var/log/php5-fpm.log
include=/etc/php5/fpm/pool.d/*.conf

Você parece ter um host virtual, então eu não sei o que você faria com 2 fastcgiexternalservers de qualquer maneira.

Os passos pelos quais o php é espremido são os seguintes:

  1. AddHandler php-script .php
  2. Ação php-script /php5.fastcgi
  3. Alias /php5.fastcgi /var/lib/apache2/fastcgi/php5.fastcgi
  4. FastCgiExternalServer /var/lib/apache2/fastcgi/php5.fastcgi -socket php5-fpm.sock

Aqui em # 4, o alias dado em # 3 será resolvido pelo fastcgiexternalserver (o caminho não precisa existir), e o parâmetro socket é um nome de arquivo relativo ao FastCgiIpcDir que você definiu anteriormente. Atualmente estou usando o seguinte diretório para isso:

FastCgiIpcDir  /var/run/

O que significa que sua jornada continua em /etc/php5/fpm/pool.d/www.conf

A linha importante é:

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

O caminho tem que ser o mesmo que fastcgiipcdir mais o socketname relativo, então o fluxo será captado aqui. Sem comentários:

www.conf

[www]
user = www-data
group = www-data

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

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

chdir = /

Para cada soquete (para cada site, se cada soquete for diferente) você quiser ouvir, você tem que criar novos arquivos conf (como o www.conf). As quatro etapas que descrevi anteriormente devem estar em cada host virtual que você deseja executar como outro usuário / grupo. Eu acredito que deveria ser assim:

Vhost www

<VirtualHost *:80>
  ServerName xxxx.com

  ServerAdmin [email protected]
  DocumentRoot /home/web/xxxx/www/prod
  Options None

  AddHandler php-script .php
  Action php-script /php5.fastcgi
  Alias /php5.fastcgi /var/lib/apache2/fastcgi/php5.fastcgi
  FastCgiExternalServer /var/lib/apache2/fastcgi/php5.fastcgi -socket php5-fpm.sock


 <Directory /home/web/xxxx/www/prod/>
    Options Indexes FollowSymLinks Includes
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  ErrorLog /var/log/apache2/error.www_prod.log
  LogLevel debug
  CustomLog /var/log/apache2/access.www_prod combined
</VirtualHost>

Depois disso, certifique-se sempre de dar acesso de gravação onde os soquetes serão criados. Isso seria o fastcgiipcdir / var / run para mim no ubuntu, que aponta para / run, então eu apenas chmodded que:

chmod 777 /run

(Claro que não é muito bom de fazer, mas para demonstração e testes locais, tudo bem)

Ativar seu site:

a2ensite site  //site: just whatever your www vhost conf file name is

E quando quiser experimentar, reinicie sempre o php-fpm e o apache :

service php5-fpm restart
service apache2 restart

Tente entender isso primeiro e, em seguida, fazê-lo funcionar será fácil. Eu tive a minha quota de tentar muitas combinações diferentes, mas quando eu entendi, fazia sentido.

    
por 04.09.2013 / 15:55