We have a Magento 2 website. For some reason our Nginx/PHP-FPM is unable to read files from MAGEROOT/pub/
folder other than index.php
.
We are getting the following error in Nginx Log "Unable to open primary script: /home/goodprice/public_html/releases/current/pub/get.php (No such file or directory)"
and the browser shows No input file specified.
Here is the partial Nginx config file.
# Run Magento (behind Varnish)
server {
listen 8088;
server_name {{website name}}.com.au www.{{website name}}.com.au m2.{{website name}}.com.au;
set $MAGE_ROOT /home/goodprice/public_html/releases/current;
index index.php;
root $MAGE_ROOT/pub;
set $code default;
location /sitemap.xml {
root $MAGE_ROOT/pub/media;
autoindex off;
}
# Rewrites for edm
include /etc/nginx/global/rewrites.conf;
location / {
try_files $uri $uri/ /index.php?$args;
}
# Serve media under /pub/media/
location /pub/ {
location ~ ^/pub/media/(downloadable|customer|import|theme_customization/.*.xml) {
deny all;
}
alias $MAGE_ROOT/pub/;
add_header X-Frame-Options "SAMEORIGIN";
}
# Rewrite signed static files
rewrite ^/static/(versiond*/)?(.*)$ /static/$2 last;
# Static assets
location ~ ^/static/(versiond*/)?(.*)$ {
tcp_nodelay on;
# Images, CSS, JS
location ~* .(jpg|jpeg|png|gif|svg|js|css|ico|txt)$ {
expires max;
log_not_found off;
access_log off;
add_header ETag "";
add_header Access-Control-Allow-Origin "*";
add_header Cache-Control "public";
try_files $uri $uri/ @static;
}
# Fonts
location ~* .(swf|eot|ttf|otf|woff|woff2)$ {
expires max;
log_not_found off;
access_log off;
add_header ETag "";
add_header Access-Control-Allow-Origin "*";
add_header Cache-Control "public";
try_files $uri $uri/ @static;
}
# Catch all
try_files $uri $uri/ @static;
}
# Media assets
location /media/ {
tcp_nodelay on;
autoindex off;
# Images, CSS, JS
location ~* .(jpg|jpeg|png|gif|svg|js|css|ico|txt)$ {
expires max;
log_not_found off;
access_log off;
add_header ETag "";
add_header Access-Control-Allow-Origin "*";
add_header Cache-Control "public";
try_files $uri $uri/ @media;
}
# Fonts
location ~* .(swf|eot|ttf|otf|woff|woff2)$ {
expires max;
log_not_found off;
access_log off;
add_header ETag "";
add_header Access-Control-Allow-Origin "*";
add_header Cache-Control "public";
try_files $uri $uri/ @media;
}
# Catch all
try_files $uri $uri/ @media;
}
# Password paths
location /media/order_attachments {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;
}
location /media/convert {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;
}
# Below prescriptions dir does not contain actual prescriptions
#location /media/prescriptions {
# auth_basic "Restricted";
# auth_basic_user_file /etc/nginx/htpasswd;
#}
location /media/webforms {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;
}
location /media/raveinfosys/exporter {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;
}
location @static { rewrite /static/(versiond*/)?(.*)$ /static.php?resource=$2 last; }
location @media { try_files $uri $uri/ /get.php$is_args$args; }
# PHP entry point for setup application
location ~* ^/setup($|/) {
root $MAGE_ROOT;
location ~ ^/setup/index.php {
fastcgi_pass fastcgi_backend;
fastcgi_param PHP_FLAG "session.auto_start=off n suhosin.session.cryptua=off";
fastcgi_param PHP_VALUE "memory_limit=756M n max_execution_time=600";
fastcgi_read_timeout 300s;
fastcgi_connect_timeout 300s;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ ^/setup/(?!pub/). {
deny all;
}
location ~ ^/setup/pub/ {
add_header X-Frame-Options "SAMEORIGIN";
}
}
# PHP entry point for update application
location ~* ^/update($|/) {
root $MAGE_ROOT;
location ~ ^/update/index.php {
fastcgi_split_path_info ^(/update/index.php)(/.+)$;
fastcgi_pass fastcgi_backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
# Deny everything but index.php
location ~ ^/update/(?!pub/). {
deny all;
}
location ~ ^/update/pub/ {
add_header X-Frame-Options "SAMEORIGIN";
}
}
# Main PHP
location ~ (index|get|static|report|404|503|health_check|deploy_clear_opcache).php$ {
try_files $uri =404;
fastcgi_pass fastcgi_backend;
fastcgi_param PHP_FLAG "session.auto_start=off n suhosin.session.cryptua=off";
fastcgi_read_timeout 300s;
fastcgi_connect_timeout 300s;
# fastcgi_param MAGE_MODE $MAGE_MODE;
fastcgi_param MAGE_RUN_CODE $code;
fastcgi_param MAGE_RUN_TYPE store;
# Increase fastcgi buffer size to stop nginx errors on large posts
fastcgi_buffers 32 256k;
fastcgi_buffer_size 512k;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header 'X-Powered-By';
}
# Return 503 if the maintenance flag is found
# if (-f $MAGE_ROOT/var/.maintenance.flag) {
# return 503;
# }
#
# # Custom 503 error page
# error_page 503 @maintenance;
#
# location @maintenance {
# root /home/goodprice/public_html/maintenance;
# rewrite ^(.*)$ /503.html break;
# }
# Use Magento 403 404 page
error_page 403 404 /errors/404.php;
# Banned locations (only reached if the earlier PHP entry point regexes don't match)
location ~* (.php$|.htaccess$|.git) {
deny all;
}
}
This causes a few problems. One is Magento 2 can’t serve the place holder image as it need to execute get.php. It’s not a permission issue as index.php is being executed. Can anybody help fix the problem in the above mentioned Nginx config? Any help will much appreciated.
ls -la from pub dir following
drwxr-xr-x 6 goodprice goodprice 4096 Nov 24 16:16 .
drwxr-xr-x 16 goodprice goodprice 4096 Nov 30 12:11 ..
-rw-rw-r-- 1 goodprice goodprice 1038 Nov 11 01:12 cron.php
-rwxrwxr-x 1 goodprice goodprice 102 Nov 10 23:04 deploy_clear_opcache.php
drwxrwxr-x 3 goodprice goodprice 4096 Nov 11 01:12 errors
-rw-rw-r-- 1 goodprice goodprice 2775 Nov 24 16:16 get.php
-rw-rw-r-- 1 goodprice goodprice 3329 Nov 11 01:12 health_check.php
-rw-rw-r-- 1 goodprice goodprice 6206 Nov 11 01:12 .htaccess
-rw-r--r-- 1 goodprice goodprice 1360 Nov 12 11:49 index.php
-rw-rw-r-- 1 goodprice goodprice 169 Jan 10 2021 info.php
drwxrwxr-x 67 goodprice goodprice 4096 Nov 29 00:01 media
drwxrwxr-x 3 goodprice goodprice 4096 Nov 11 01:12 opt
drwxr-xr-x 4 goodprice goodprice 4096 Nov 30 13:12 static
-rw-rw-r-- 1 goodprice goodprice 445 Nov 11 01:12 static.php
-rw-rw-r-- 1 goodprice goodprice 101 Nov 11 01:12 .user.ini
Php Fpm conf.d file extract users and groups.
group = "goodprice"
listen.group = "nobody"
listen.mode = 0660
listen.owner = "goodprice"
user = "goodprice"
nginx.conf as following
include /etc/nginx/conf.d/modules/*.conf;
user nobody;
worker_processes 1;
worker_rlimit_nofile 16384;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/conf.d-custom/*.conf;
}
2
Answers
The issue here was php-fpm config. My mistake in asking the question was that I should have posted the whole php-fpm config with nginx config.
On our server the php-fpm settings are controlled from cpanel for each site. The problem was that php-fpm had
php_value[doc_root]
set to a folder above the pub folder. That was due to the fact the server and cpanel is configured to have code in/home/goodprice/public_html/
. Which I modified tophp_value[doc_root] = "/home/goodprice/public_html/releases/current/"
thinking that's Magento root so php should be reading there. But actually it should have beenphp_value[doc_root] = "/home/goodprice/public_html/releases/current/pub/"
. So on run time php is looking for a file, but the root (folder) is wrong where it's looking at. This problem was confusing because php was erroring out with the path of the file but not where it was actually trying to locate the file. I Can't explain why it would give out a correct path then look for just the file in it's root folder.So to summarise, if there is
try_files
in nginx config make sure that the nginx root, or the final path is same as folderphp_value[doc_root]
in php-fpm conf. Or better don't havephp_value[doc_root]
in your php-fpm at all.change the file permissions to
BTW, if this is a parked domain then your issue will have a different twist to it because NginX does not behave as smoothly has Apache in multiple domains.