2012-06-27 83 views
11

问题:我错过了什么或做错了什么?nginx php5-fpm失败(2:没有这样的文件或目录)

我正尝试将功能齐全的Zend Framework应用程序从Apache2与mod_php5迁移到nginx与php5-fpm。我得到这样的错误:

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"

这里是我的配置文件:

一)在/ etc/nginx的//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 /无功/网络

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(这是CLI的版本,但我发誓我正在用fpm运行nginx :)

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

我也曾在fastcgi_params改变人们在下面的文章中抱怨,但仍然没有:http://forum.nginx.org/read.php?11,214780,215113 – eistrati

+0

什么是'ls -l/var/www/public/sales/live-trials- json'? – sarnold

+0

当然,它不存在。 Zend框架重写规则并运行相应的控制器和操作。看看这个:http://framework.zend.com/manual/en/learning.quickstart.intro.html – eistrati

回答

8

好了,经过长时间的辛苦奋斗,我已经成功地找出这种疯狂。从无到有,所以在这里,我已经开始一切都是我所学到的:

整个怪事则介于location ~* ... { ... },所以谁拥有更好的体验,请解释原因:-)同时我将资产管理和缓存在应用程序层。

我的功能配置文件看起来像这样:

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

感谢您尝试,尤其是@sarnold和@谢尔盖 - lomakov!

+0

这为我工作,除了我不得不改变一行:注释掉“include/etc/nginx/fastcgi_params;”并添加“include fastcgi.conf;” – Saad

7

你的nginx配置是错误的。

因为同意你的规则,nginx会尝试访问不存在的/ var/www/public/sales/live-trials-json 。

因为我不知道您的应用程序使用了哪些端点,所以我建议您创建两个nginx位置。首先,对于所有静态文件(用正则表达式)创建此位置:

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

所有其他的查询应该被代理到Apache:

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

使这一规则变化不大:

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

当然,您可以不使用“.ht设置”:

location ~ /\.ht { 
    deny all; 
    } 

所以,最终的配置将是:

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

不,这不是正确的答案。我从字面上复制粘贴你的配置文件,它仍然无法正常工作,抛出相同的错误。 – eistrati

2

正如你指出,你的问题是与

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

这种/销售/真人试验,JSON的您的文章URI,因为它没有被固定在URI路径的终点相匹配,和。匹配任何字符。这意味着'-js'匹配。为了解决这个问题,你只需要添加一个\(来匹配字符“”)和$(锚定匹配的URI路径的末尾):

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

你的回答是正确的,但它只有50%的问题。另外50%的问题是由前任响应者Sergei Lomakov指出的......所以我不知道如何分配你们之间的赏金点!我想这是公平的,把他们给谢尔盖,因为他引导到正确的答案:) – eistrati

相关问题