2009-03-04 13 views
13

Tengo un sitio alojado y tengo problemas para configurar Joomla (ejecutando Joomla + php + mySQL en IIS7 + win server 2008). Tengo una configuración similar ejecutándose en una máquina local (Joomla + php + mySQL en IIS7 + vista x64), así que al menos pude seguir las instrucciones que se muestran en varios tutoriales sobre cómo configurar esto.Cómo saber con certeza si FastCGI se está utilizando para ejecutar scripts php

Este síntoma con el sitio alojado es que no puedo activar ninguna configuración de SEO en Joomla (ni siquiera la primera configuración, "URLs amigables para el motor de búsqueda"). Recibo 404 (archivo no encontrado) o la URL aparece correctamente reescrita, pero siempre se muestra el contenido de la página de inicio. Tuve un problema similar en mi máquina doméstica y resultó ser porque no estaba usando FastCGI para alojar php, así que decidí investigar eso en el sitio alojado.

De todos modos, me di cuenta en el archivo web.config del directorio de alojamiento Joomla en el sitio alojado la línea siguiente:

<add name="Plesk_Handler_3522909676" path="*.php" verb="*" modules="IsapiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php5isapi.dll" resourceType="Either" /> 

Por experiencia, sé que PHP tiene algunos problemas cuando no se ejecuta bajo fastcgi . Noté el web.config en la carpeta raíz utiliza la siguiente línea en su lugar:

<add name="Plesk_Handler_0286090609" path="*.php" verb="*" modules="CgiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php-cgi.exe" resourceType="Either" /> 

que he copiado en el web.config en el directorio de Joomla, y consiguió un comportamiento diferente ... pero aún no funciona. Si cargo un archivo .php en el directorio joomla que ejecuta phpInfo(), en Server API dice CGI/FastCGI. ¿Es la confirmación positiva que FastCGI se está utilizando? ¿Por qué el controlador en la configuración web apunta a modules = "CgiModule" en lugar de modules = "FastCgiModule" (ni siquiera estoy seguro de que exista, pero me parece sospechoso mencionar a CgiModule).

Es un sitio alojado, por lo que yo sé que no tengo acceso al archivo ApplicationHost.config ...

Respuesta

24

He aquí una prueba sencilla:

  1. Crear un archivo phpinfo.php con

<?php phpinfo(); ?> 

en el interior;

  1. Solicitud http://yoursite.com/phpinfo.php/foobar?foo=bar

  2. Compruebe la salida de phpinfo y buscar _SERVER [ "REQUEST_URI"].

Si falta esta variable, se utiliza CGI.Si la variable está presente y configurada correctamente en /phpinfo.php/foobar?foo=bar, entonces se usa ISAPI o FastCGI. Mire cerca de la parte superior de la salida para Server API; debe establecerse en ISAPI (lo que significa que se está utilizando ISAPI) o CGI/FastCGI (lo que significa que se está utilizando FastCGI, ya que ya descartamos CGI).

+1

$ _SERVER ['REQUEST_URI'] puede aparecer correctamente en CGI y FastCGI y la API del servidor puede mostrar 'CGI/FastCGI' tanto para CGI como para FastCGI. Una diferencia es que en FastCGI $ _SERVER ["REDIRECT_HANDLER"] podría mostrar php-fastcgi, pero eso tampoco confirma que se esté usando "FastCGI" ya que "php-fastcgi" es solo un nombre de variable utilizado en el archivo de configuración . –

+0

@Jimmy, esta respuesta es mucho [necesidad de citas] (http://xkcd.com/285). Además, el método que describes suena un poco * hacky *, ¿hay una manera mejor y más sólida de determinar la configuración directamente? – Pacerier

+0

@Pacerier Funcionó para mí, y aparentemente para muchas otras personas. No pude encontrar una mejor manera, pero no dude en publicar una respuesta "mejor y más sólida" si tiene una. Yo mismo se me ocurrió, por lo tanto no hay citas. – Jimmy

0

Debería ver una hizo referencia a ella desde

<?php 
phpinfo(); 
?> 

Server API = CGI/FastCGI

+0

Pero es que a ciencia cierta? Mi anfitrión dice que no son compatibles con FastCGI; el web.config anterior dice que están usando CGI, no FastCGI; y, sin embargo, todavía veo Server API = CGI/FastCGI en phpinfo() – Jimmy

0

Joomla crea un archivo .htaccess con reglas de reescritura para habilitar las URL amigables para los motores de búsqueda. Si está utilizando Apache, tendrá que configurar "AllowOverride FileInfo" para el directorio que contiene la instalación de Joomla. Si está utilizando IIS, necesitará un módulo como IISModRewrite. Aquí están las instrucciones para esto: [http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

2

Lamentablemente, la comprobación \_SERVER["REQUEST_URI"] no funcionó para mí. Con CGI o FastCGI, siempre se muestra /phpinfo.php/foobar?foo=bar.

Tampoco se vio si se configuró Server API = CGI/FastCGI, eso solo indica qué interfaces admite la versión compilada de php, no qué se está utilizando. Sin embargo, encontré otro método que puede funcionar de manera más confiable.

Plonk un archivo en el lugar llamado phpinfo.php que contiene el texto: <? php phpinfo(); ?>

Compruebe si la variable \_ENV["REDIRECT_HANDLER"]:
Si se establece a php5-fastcgi (o algo más fastcgi-ish) la petición más probable pasó por FastCGI. Si está configurado en application/x-httpd-php (o asumo algo diferente a lo anterior), está usando CGI.

Sin embargo, una forma segura es realizar una pequeña prueba. Necesitará la herramienta ab (Apache Bench) para esto.
con y sin CGI, ejecute esto desde otra máquina:

ab -c 100 -n 1000 http://yourdomain.com/path/phpinfo.php 

compruebe la línea Time taken for tests:. Al menos en mi caja, al acceder a mi VPS a través de una conexión ADSL de 1.3 Mbps, FastCGI la aprovechó al máximo, mientras que con CGI solo pude completar la mitad.

Espero que esto ayude.

0

Asegúrate de que las cosas estén configuradas inicialmente en donde la secuencia de comandos falla completamente cuando fastcgi no se está ejecutando. Entonces sabrá, cuando funcione, que fastcgi daemon es la razón.

0

Esto funcionó para mí.

/** 
* return phpinfo() results as an array 
* 
* @credit http://php.net/manual/en/function.phpinfo.php#106862 
* @param void 
* @return array 
*/ 
function phpinfo_array(){ 
    ob_start(); 
    phpinfo(); 
    $info_arr = array(); 
    $info_lines = explode("\n", strip_tags(ob_get_clean(), '<tr><td><h2>')); 
    $cat = 'general'; 
    foreach($info_lines as $line){ 
     preg_match('/<h2>(.*)<\/h2>/', $line, $title) ? $cat = preg_replace('/\s+/', '_', strtolower(trim($title[1]))) : null; 
     if(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){ 
      $subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1]))); 
      $info_arr[$cat][$subcat] = $val[2]; 
     } elseif(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){ 
      $subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1]))); 
      $info_arr[$cat][$subcat] = array('local' => $val[2], 'master' => $val[3]); 
     } 
    } 
    return $info_arr; 
} 


// output proper response code 
$phpinfo = phpinfo_array(); 
$configure = (@isset($phpinfo['general']['configure_command'])) ?: null; 

// properly account for FastCGI 
if ($configure && preg_match('/--enable-fastcgi/', $configure)){ 
    // fastcgi response 
    header('Status: 403 Access is forbidden'); 
} else { 
    // http response 
    header('HTTP/1.0 403 Access is forbidden'); 
} 
+1

¿Cómo funciona el script y qué hace el script? – Pacerier

3

Se puede utilizar (en CentOS) -M apachectl, voy a mostrar lo que los módulos están habilitados:

apachectl -M:

file_cache_module (compartido) mem_cache_module (compartido) version_module (compartido) fastcgi_module (compartido)

+0

También funciona en Ubuntu, aunque tuve que usar sudo – Sam

Cuestiones relacionadas