2012-06-27 29 views
11

PREGUNTA: ¿Qué estoy perdiendo o haciendo mal?nginx php5-fpm failed (2: No such such file or directory)

Estoy intentando migrar la aplicación Zend Framework completamente funcional de Apache2 con mod_php5 a nginx con php5-fpm. Consigo este tipo de errores:

2012/06/27 12:08:04 [error] 1986#0: *1 open() "/var/www/public/sales/live-trials-json" failed (2: No such file or directory), client: *.*.*.*, server: www.mydomain.com, request: "POST /sales/live-trials-json HTTP/1.1", host: "www.mydomain.com", referrer: "https://www.mydomain.com/sales/live-trials"

Éstos son mis archivos de configuración:

a)/etc/nginx/sites-enabled/www

server { 
    listen 80; 
    listen 443 default ssl; 

    server_name www.mydomain.com; 
    root /var/www/public; 

    ssl_certificate /etc/nginx/ssl/mydomain.crt; 
    ssl_certificate_key /etc/nginx/ssl/mydomain.key; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log error; 

    index index.php index.phtml index.html; 

    location = /(favicon.ico|robots.txt) { 
    access_log off; 
    log_not_found off; 
    } 

    location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico|xml) { 
    access_log off; 
    expires 30d; 
    } 

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

    location ~ /\.ht { 
    deny all; 
    } 

    location ~ \.php$ { 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    fastcgi_intercept_errors on; 
    include /etc/nginx/fastcgi_params; 
    } 
} 

b)/etc/nginx/fastcgi_params

fastcgi_param QUERY_STRING  $query_string; 
fastcgi_param REQUEST_METHOD  $request_method; 
fastcgi_param CONTENT_TYPE  $content_type; 
fastcgi_param CONTENT_LENGTH  $content_length; 
fastcgi_param SCRIPT_FILENAME  $request_filename; 
fastcgi_param SCRIPT_NAME  $fastcgi_script_name; 
fastcgi_param REQUEST_URI  $request_uri; 
fastcgi_param DOCUMENT_URI  $document_uri; 
fastcgi_param DOCUMENT_ROOT  $document_root; 
fastcgi_param SERVER_PROTOCOL  $server_protocol; 
fastcgi_param GATEWAY_INTERFACE CGI/1.1; 
fastcgi_param SERVER_SOFTWARE  nginx/$nginx_version; 
fastcgi_param REMOTE_ADDR  $remote_addr; 
fastcgi_param REMOTE_PORT  $remote_port; 
fastcgi_param SERVER_ADDR  $server_addr; 
fastcgi_param SERVER_PORT  $server_port; 
fastcgi_param SERVER_NAME  $server_name; 
fastcgi_param HTTPS   $https; 
# PHP only, required if PHP was built with --enable-force-cgi-redirect 
fastcgi_param REDIRECT_STATUS  200; 

c) /etc/php5/fpm/pool.d/www.conf

[www] 
user = www-data 
group = www-data 
listen = 127.0.0.1:9000 
pm = dynamic 
pm.max_children = 20 
pm.start_servers = 4 
pm.min_spare_servers = 2 
pm.max_spare_servers = 6 
chdir =/

d) ls -al/var/www

drwxr-xr-x 7 www-data www-data 4096 Jun 27 10:52 application 
drwxr-xr-x 5 www-data www-data 4096 Jun 27 10:52 library 
drwxr-xr-x 10 www-data www-data 4096 Jun 27 12:05 public 

e) nginx -V

nginx version: nginx/1.1.19 
TLS SNI support enabled 
configure arguments: 
    --prefix=/etc/nginx 
    --conf-path=/etc/nginx/nginx.conf 
    --error-log-path=/var/log/nginx/error.log 
    --http-client-body-temp-path=/var/lib/nginx/body 
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi 
    --http-log-path=/var/log/nginx/access.log 
    --http-proxy-temp-path=/var/lib/nginx/proxy 
    --http-scgi-temp-path=/var/lib/nginx/scgi 
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi 
    --lock-path=/var/lock/nginx.lock 
    --pid-path=/var/run/nginx.pid 
    --with-debug 
    --with-http_addition_module 
    --with-http_dav_module 
    --with-http_geoip_module 
    --with-http_gzip_static_module 
    --with-http_image_filter_module 
    --with-http_realip_module 
    --with-http_stub_status_module 
    --with-http_ssl_module 
    --with-http_sub_module 
    --with-http_xslt_module 
    --with-ipv6 
    --with-sha1=/usr/include/openssl 
    --with-md5=/usr/include/openssl 
    --with-mail 
    --with-mail_ssl_module 
    --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-auth-pam 
    --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-echo 
    --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-upstream-fair 
    --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-dav-ext-module 

f) php -v (esta es la versión CLI, pero juro I estoy ejecutando nginx con fpm :)

PHP 5.3.10-1ubuntu3 with Suhosin-Patch (cli) (built: Apr 11 2012 17:25:33) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies 
+0

También he cambiado en fastcgi_params como las personas se quejaron en el artículo a continuación y todavía nada: http://forum.nginx.org/read.php?11,214780,215113 – eistrati

+0

¿Cuál es el resultado de 'ls -l/var/www/public/sales/live-trials- json'? – sarnold

+0

No existe, por supuesto. Zend Framework reescribe las reglas y ejecuta el controlador y la acción correspondientes. Mira esto: http://framework.zend.com/manual/en/learning.quickstart.intro.html – eistrati

Respuesta

8

bien, después de largas y agotadoras, he conseguido averiguar esta locura. Por lo tanto, he comenzado todo desde cero y esto es lo que he aprendido:

rareza Todo está en algún lugar location ~* ... { ... }, así que quien tiene experiencia mejor, explique por qué :-) Mientras tanto voy a gestionar los activos y el almacenamiento en caché en la capa de aplicación.

Mi archivo de configuración funcional es el siguiente:

server { 
    listen 80; 
    listen 443 default ssl; 

    server_name www.mydomain.com; 
    root /var/www/public; 

    ssl_certificate /etc/nginx/ssl/mydomain.crt; 
    ssl_certificate_key /etc/nginx/ssl/mydomain.key; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log error; 

    index index.php index.phtml index.html; 

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

    location ~ \.php$ { 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    fastcgi_intercept_errors on; 
    include /etc/nginx/fastcgi_params; 
    } 
} 

Gracias por intentarlo, especialmente @sarnold y Sergei @-lomakov!

+0

esto funcionó para mí, excepto que tuve que cambiar una línea: comentar "include/etc/nginx/fastcgi_params;" y agregue "include fastcgi.conf;" – Saad

7

Su configuración de nginx es pequeña.

Porque de acuerdo con sus reglas, nginx intenta acceder a/var/www/public/sales/live-trials-json que no existe.

Porque no sé qué puntos finales utiliza la aplicación, le sugiero que haga dos ubicaciones nginx. En primer lugar, para todos los archivos estáticos (con regexp) crear esta ubicación:

location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico|xml) { 
    access_log off; 
    expires 30d; 
    } 

Todas las otras consultas deben proxy de Apache:

location/{ 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    fastcgi_intercept_errors on; 
    include /etc/nginx/fastcgi_params; 
    } 

hacer pequeños cambios con esta regla:

location ~* ^/(favicon.ico|robots.txt)$ { 
    access_log off; 
    log_not_found off; 
    } 

Por supuesto, puede dejar intacta la "configuración .ht":

location ~ /\.ht { 
    deny all; 
    } 

Así, configuración final será:

luchas
server { 
    listen 80; 
    listen 443 default ssl; 

    server_name www.mydomain.com; 
    root /var/www/public; 

    ssl_certificate /etc/nginx/ssl/mydomain.crt; 
    ssl_certificate_key /etc/nginx/ssl/mydomain.key; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log error; 

    index index.php index.phtml index.html; 

    location ~* ^/(favicon.ico|robots.txt)$ { 
    access_log off; 
    log_not_found off; 
    } 

    location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico|xml) { 
    access_log off; 
    expires 30d; 
    } 

    location ~ /\.ht { 
    deny all; 
    } 

    location/{ 
    fastcgi_pass 127.0.0.1:9000; 
# I'm not sure that this setting is needed: 
#  fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    fastcgi_intercept_errors on; 
    include /etc/nginx/fastcgi_params; 
    } 


} 
+0

No, esta no es la respuesta correcta. He copiado literalmente su archivo de configuración y todavía no está funcionando, arrojando los mismos errores. – eistrati

2

Como se anotó, su problema es con

location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico|xml) { 
    access_log off; 
    expires 30d; 
} 

Esto coincide con el URI de la POST/ventas/live-ensayos-JSON, ya que no se ha anclado al final de la ruta URI, y. coincide con cualquier personaje. Esto significa que coincide con '-js'. Para solucionar este problema, sólo tiene que añadir un \ (para que coincida con un literal '') y un $ (para anclar el partido en el final de la ruta URI):

location ~* \.(css|js|jpeg|jpg|gif|png|ico|xml)$ { 
    access_log off; 
    expires 30d; 
} 
+0

Su respuesta es correcta, pero es solo el 50% del problema. El otro 50% del problema fue señalado por el respondedor anterior, Sergei Lomakov ... ¡Así que no sé cómo dividir los puntos de recompensa entre ustedes! Creo que es justo dárselos a Sergei, ya que él guió a las respuestas correctas :) – eistrati

Cuestiones relacionadas