2009-06-25 16 views
9

Hola, por favor, por favor, ayúdenme, estoy intentando configurar un entorno cakephp en un servidor Centos que ejecute Nginx con CGI de hechos. Ya tengo un sitio de wordpress ejecutándose en el servidor y un sitio de phpmyadmin, así que tengo PHP configurado correctamente.¿Cómo configuro las reglas de reescritura de nginx para que CakePHP funcione en CentOS?

Mi problema es que no puedo hacer que la configuración de las reglas de reescritura sea correcta en mi vhost para que cake muestre las páginas correctamente, es decir, con estilo, etc. He buscado en Google tanto como sea posible y el principal consenso de los sitios como el que se enumeran a continuación es que necesito tener la siguiente regla de reescritura en su lugar

location/{ 
      root /var/www/sites/somedomain.com/current; 
      index index.php index.html; 

      # If the file exists as a static file serve it 
      # directly without running all 
      # the other rewrite tests on it 
      if (-f $request_filename) { 
      break; 
      } 
      if (!-f $request_filename) { 
      rewrite ^/(.+)$ /index.php?url=$1 last; 
      break; 
      } 
     } 

http://blog.getintheloop.eu/2008/4/17/nginx-engine-x-rewrite-rules-for-cakephp

problema es que estos reescritura debe asumir ejecuta la torta directamente fuera de la webroot, que no es lo que quiero hacer. Tengo una configuración estándar para cada sitio, es decir, una carpeta por sitio que contiene las siguientes carpetas de registro, copia de seguridad, privada y pública. bienestar público donde Nginx está en busca de sus archivos para servir pero tengo torta instalado en privado con un enlace simbólico de vinculación pública de nuevo a/private/torta/

este es mi host virtual

server { 
      listen  80; 
      server_name app.domain.com; 

      access_log /home/public_html/app.domain.com/log/access.log; 
      error_log /home/public_html/app.domain.com/log/error.log; 

    #configure Cake app to run in a sub-directory 
    #Cake install is not in root, but elsewhere and configured 
    #in APP/webroot/index.php** 

       location /home/public_html/app.domain.com/private/cake { 
       index index.php; 

    if (!-e $request_filename) { 
     rewrite ^/(.+)$ /home/public_html/app.domain.com/private/cake/$1 last; 
     break; 
    } 
} 

       location /home/public_html/app.domain.com/private/cake/ { 
       index index.php; 

    if (!-e $request_filename) { 
     rewrite ^/(.+)$ /home/public_html/app.domain.com/public/index.php?url=$1 last; 
     break; 
     } 
} 

     # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
     location ~ \.php$ { 
      fastcgi_pass 127.0.0.1:9000; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME /home/public_html/app.domain.com/private/cake$fastcgi_script_name; 
      include  /etc/nginx/fastcgi_params; 
     } 

} 

Ahora como dije Puedo ver el index.php principal de la torta y lo he conectado a mi DB, pero esta página no tiene estilo, así que antes de continuar, me gustaría configurarlo correctamente. ¿Qué estoy haciendo mal?

Gracias seanl

Respuesta

9

A primera vista, el problema podría ser que usted no está apuntando a la nginx web raíz de su aplicación. Desplegar en la carpeta raíz de la torta realmente no es la forma de pasar por debajo de cualquier servidor web.

El siguiente es un completo bloque de servidor que utilizo para ejecutar aplicaciones de Cake. En realidad, solo tengo las primeras cuatro líneas y luego incluyo el resto de un archivo separado "cakephp.inc".

Una nota en la línea "fastcgi_param SERVER_NAME $ host;". Esto se debe a que algunas de mis aplicaciones usan $ _SERVER ['SERVER_NAME'] y no tiene el mismo significado en nginx que en Apache. Si tu servidor tiene varios nombres_servidor definidos, nginx siempre pasará el primero a php.

server { 
    server_name cakeapp.example.com; 
    root /var/www/vhosts/cake/app/webroot; 
    access_log /var/log/nginx/cakeapp.access.log; 
    error_log /var/log/nginx/cakeapp.error.log; 

    listen  80; 
    rewrite_log on; 

    # rewrite rules for cakephp 
    location/{ 
     index index.php index.html; 

     # If the file exists as a static file serve it 
     # directly without running all 
     # the other rewite tests on it 
     if (-f $request_filename) { 
      break; 
     } 
     if (!-f $request_filename) { 
      rewrite ^/(.+)$ /index.php?url=$1 last; 
      break; 
     } 
    } 

    location ~* \favicon.ico$ { 
     expires 6m; 
    } 
    location ~ ^/img/ { 
     expires 7d; 
    } 

    location ~ \.php$ { 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include /etc/nginx/fastcgi_params; 
     fastcgi_param SERVER_NAME $host; 
    } 

    location ~ /\.ht { 
     deny all; 
    } 
} 
+0

Martin gracias por su aporte, hice la misma pregunta sobre el error de SErver en el sitio hermano de SO y tenía algunas respuestas que podrían interesarle http://serverfault.com/questions/32070/cakephp-nginx-config-rewrite- rules –

3

Tengo este trabajo:

root DIR/app/webroot/; 
location/{ 
    index index.php index.html; 
    rewrite ^/$ /index.php?url=/; 
    if (!-e $request_filename) { 
     rewrite ^(/.*)$ /index.php?url=$1 last; 
    } 
} 

y después de los manipuladores de cursos para php y esas cosas ...

7

Ahora hay official documentation on this issue, que utilicé y confirmó obras.

La documentación:

server { 
    listen 80; 
    server_name www.example.com; 
    rewrite ^(.*) http://example.com$1 permanent; 
} 

server { 
    listen 80; 
    server_name example.com; 

    # root directive should be global 
    root /var/www/example.com/public/app/webroot/; 
    index index.php; 

    access_log /var/www/example.com/log/access.log; 
    error_log /var/www/example.com/log/error.log; 

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

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

Lanzando esto aquí como una especie de "yo también" - Lo he hecho más de una vez ahora, tenga en cuenta que el root apunta al subdirectorio de WEBROOT, no al directorio raíz de la torta. De lo contrario, todos los bits de la torta funcionan bien, pero no se cargan archivos estáticos, etc. –

0

yo tenía un montón de problemas de creación de un sitio de CakePHP que se estaba ejecutando una versión anterior de CakePHP 1.2 - pasando por la fecha de este post podría ser alrededor de la época. Hace poco blogged y simplemente sugiero actualizar o instalar una nueva versión de la biblioteca de Cake y todos los problemas desaparecieron.

0

Utilice a continuación el código en

vi/etc/nginx/sites-available/nombre de dominio.com

server { 
server_name cakeapp.example.com; 
root /var/www/vhosts/cake/app/webroot; 
access_log /var/log/nginx/cakeapp.access.log; 
error_log /var/log/nginx/cakeapp.error.log; 

listen  80; 
rewrite_log on; 

# rewrite rules for cakephp 
location/{ 
    index index.php index.html; 

    # If the file exists as a static file serve it 
    # directly without running all 
    # the other rewite tests on it 
    if (-f $request_filename) { 
     break; 
    } 
    if (!-f $request_filename) { 
     rewrite ^/(.+)$ /index.php?url=$1 last; 
     break; 
    } 
} 

location ~* \favicon.ico$ { 
    expires 6m; 
} 
location ~ ^/img/ { 
    expires 7d; 
} 

location ~ \.php$ { 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_param SERVER_NAME $host; 
} 

location ~ /\.ht { 
    deny all; 
} 

}

Su trabajo para mí.

2

No es aconsejable utilizar bloques 'IF' dentro de un bloque de 'ubicación'.

Aquí hay una forma más natural de lograr lo mismo, usando ubicaciones de expresiones regulares.

En este ejemplo, CakePHP 2.x es la aplicación root en un host virtual (se pierden cosas comunes, como server, registros, etc.):

root /path/to/cakephp-2.x_root/app/webroot; 
index index.php; 

location ~ .+\.php$ { 
     try_files $uri =404; #handle requests for missing .php files 
     include  fastcgi_params; 
     fastcgi_pass 127.0.0.1:7001; #the FPM pool port 
    } 


    location ~ ^/(.*) { 
     try_files $uri $uri/ /index.php?url=$1&$args; 
    } 

Tenga en cuenta que el bloque de ubicación .php es ANTES de la/bloque de ubicación Eso es importante porque con las ubicaciones de expresiones regulares, se buscan hasta la primera coincidencia.

Si necesita hacer que se ejecute en una sublocación, por ejemplo http://www.example.com/something/, así es como logré hacerlo. Primero tuve que hacer un enlace simbólico para engañar a nginx: extraer cakephp-2.x en algún lugar, luego en 'app/webroot' crear un enlace simbólico a sí mismo con el mismo nombre que la sublocación, p. 'ln -s ../webroot algo'.

A continuación, la siguiente configuración funciona para acceder cackephp bajo/algo /:

location ~ ^/something/.+\.php$ { 
     try_files $uri =404; #handle requests for missing .php files 
     root /path/to/cakephp-2.x_root/app/webroot; 
     include  fastcgi_params; 
     fastcgi_pass 127.0.0.1:7001; #the FPM pool port 
    } 

    location ~ ^/something(?:/)(.*) { 
     root /path/to/cakephp-2.x_root/app/webroot; 
     index index.php; 
     try_files $uri $uri/ /something/index.php?url=$1&$args; 
    } 

enlace simbólico, probablemente, se puede evitar mediante el uso de Istead de 'root' 'alias' pero no pude encontrar la manera.

Cuestiones relacionadas