2012-06-27 11 views
11

DOMANDA: Cosa mi manca o cosa non funziona?nginx php5-fpm non riuscito (2: Nessun file o directory di questo tipo)

Sto provando a migrare l'applicazione Zend Framework completamente funzionale da Apache2 con mod_php5 a nginx con php5-fpm. Ottengo questo tipo di errori:

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"

qui sono i miei file di configurazione:

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 (questa è la versione CLI, ma giuro che sto eseguendo 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

Ho anche cambiato in fastcgi_params come le persone si sono lamentate nel seguente articolo e ancora nulla: http://forum.nginx.org/read.php?11,214780,215113 – eistrati

+0

Qual è l'output di 'ls -l/var/www/public/sales/live-trials- json'? – sarnold

+0

Non esiste, ovviamente. Zend Framework riscrive le regole ed esegue il controller e l'azione corrispondenti. Dai un'occhiata a questo: http://framework.zend.com/manual/en/learning.quickstart.intro.html – eistrati

risposta

8

Bene, dopo lunghe ed estenuanti lotte, sono riuscito a capire questa follia. tutto così, ho iniziato da zero e qui è quello che ho imparato:

intera stranezza è da qualche parte in location ~* ... { ... }, così anche colui che hanno una migliore esperienza, si prega di spiegare perché :-) Intanto io gestire le attività e la cache sul livello dell'applicazione.

mio file di configurazione funzionale simile al seguente:

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; 
    } 
} 

Grazie per aver provato, in particolare @sarnold e @ Sergei-lomakov!

+0

questo ha funzionato per me, tranne che ho dovuto cambiare una riga: commento "include/etc/nginx/fastcgi_params;" e aggiungi "include fastcgi.conf;" – Saad

7

La configurazione di nginx è leggermente errata.

Perché sono d'accordo con le tue regole, nginx prova ad accedere a/var/www/public/sales/live-trials-json che non esiste.

Perché non so quali endpoint utilizzare l'applicazione, ti suggerisco di creare due posizioni nginx. In primo luogo, per tutti i file statici (con regexp) creare questa posizione:

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

Tutte le altre richieste devono essere inoltrate a apache:

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

Fare piccolo cambiamento con questa regola:

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

Ovviamente, puoi lasciare ".ht settings" inalterato:

location ~ /\.ht { 
    deny all; 
    } 

Quindi, configurazione finale sarà:

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, questa non è la risposta giusta. Ho letteralmente copiato il tuo file di configurazione e non funziona ancora, generando gli stessi errori. – eistrati

2

Come annotato, il problema è con

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

Questo corrisponde al tuo uri POST di/vendite/live-prove-JSON, perché non è stato ancorato alla fine del percorso uri, e. corrisponde a qualsiasi personaggio. Ciò significa che le partite '-js'. Per risolvere questo problema, è sufficiente aggiungere un \ (per abbinare un letterale '') ed un $ (per ancorare la partita alla fine del percorso di uri):

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

La tua risposta è corretta, ma è solo il 50% del problema. L'altro 50% del problema è stato segnalato dal precedente rispondente, Sergei Lomakov ... Quindi non so come dividere i punti di taglie tra voi ragazzi! Immagino sia giusto darle a Sergei, dato che ha guidato le risposte giuste :) – eistrati

Problemi correlati