问题:我错过了什么或错在哪里?
我正在尝试将function齐全的Zend Framework应用程序从mod_php5的Apache2迁移到php5-fpm的nginx。 我得到这样的错误:
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"
这是我的configuration文件:
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(这是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
好吧,经过漫长而艰苦的斗争之后,我设法弄清了这个疯狂。 所以,我从头开始了一切,这是我所学到的:
整个怪异的地方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和@ sergei-lomakov!
你的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; } }
正如你所说,你的问题是
location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico|xml) { access_log off; expires 30d; }
这匹配你的POST uri of / sales / live-trials-json,因为它还没有被锚定到uri路径的末尾。 匹配任何字符。 这意味着'-js'匹配。 为了解决这个问题,你只需要添加一个\(来匹配一个文字'。')和一个$(在uri路径的末尾锚点匹配):
location ~* \.(css|js|jpeg|jpg|gif|png|ico|xml)$ { access_log off; expires 30d; }