1

I'm running Drupal 8.1.2 on a Docker image of Nginx + PHP7 + PHP 7 FPM and it's linked to another Docker image of PostgreSQL both of them based from Alpine Linux.

After successfully running Drupal installation (on core/install.php url) and setting up website name, admin name and other details, it throws 404 right after I hit the submit button. I am only able to access /update.php URL.

The error log:

2016/06/17 16:32:49 [error] 11#0: *80 open() "/usr/share/nginx/html/404.html" failed (2: No such file or directory), client: 172.17.0.1, server: _, request: "GET /favicon.ico HTTP/1.1", host: "localhost"
2016/06/18 11:47:32 [error] 13#0: *40 open() "/var/www/html/user/1" failed (2: No such file or directory), client: 172.17.0.1, server: _, request: "GET /user/1 HTTP/1.1", host: "localhost", referrer: "http://localhost/core/install.php?langcode=en&profile=minimal"
2016/06/18 11:29:00 [error] 170#0: *83 open() "/var/www/html/update.php/selection" failed (20: Not a directory), client: 172.17.0.1, server: _, request: "GET /update.php/selection HTTP/1.1", host: "localhost", referrer: "http://localhost/update.php"
2016/06/18 11:28:19 [error] 170#0: *83 open() "/var/www/html/node" failed (2: No such file or directory), client: 172.17.0.1, server: _, request: "GET /node HTTP/1.1", host: "localhost"
2016/06/18 11:28:19 [error] 170#0: *83 open() "/usr/share/nginx/html/404.html" failed (2: No such file or directory), client: 172.17.0.1, server: _, request: "GET /node HTTP/1.1", host: "localhost"

The nginx.conf

server {
    listen       [::]:80;
    server_name  localhost;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Very rarely should these ever be accessed outside of your lan
    location ~* \.(txt|log)$ {
        allow 192.168.0.0/16;
        deny all;
    }

    location ~ \..*/.*\.php$ {
        return 403;
    }

    location ~ ^/sites/.*/private/ {
        return 403;
    }

    # Allow "Well-Known URIs" as per RFC 5785
    location ~* ^/.well-known/ {
        allow all;
    }

    # Block access to "hidden" files and directories whose names begin with a
    # period. This includes directories used by version control systems such
    # as Subversion or Git to store control files.
    location ~ (^|/)\. {
        return 403;
    }

    location / {
        # try_files $uri @rewrite; # For Drupal <= 6
        try_files $uri /index.php?$query_string; # For Drupal >= 7
    }

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;
    }

    # Don't allow direct access to PHP files in the vendor directory.
    location ~ /vendor/.*\.php$ {
        deny all;
        return 404;
    }

    # In Drupal 8, we must also match new paths where the '.php' appears in
    # the middle, such as update.php/selection. The rule we use is strict,
    # and only allows this pattern with the update.php front controller.
    # This allows legacy path aliases in the form of
    # blog/index.php/legacy-path to continue to route to Drupal nodes. If
    # you do not have any paths like that, then you might prefer to use a
    # laxer rule, such as:
    #   location ~ \.php(/|$) {
    # The laxer rule will continue to work if Drupal uses this new URL
    # pattern with front controllers other than update.php in a future
    # release.
    location ~ '\.php$|^/update.php|selection$|add$|^/user/\d' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        # Security note: If you're running a version of PHP older than the
        # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
        # See http://serverfault.com/q/627903/94922 for details.
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/var/run/php7.0-fpm.sock;
    }

    # Fighting with Styles? This little gem is amazing.
    # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6
    location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7
        try_files $uri @rewrite;
    }

    # Handle private files through Drupal.
    location ~ ^/system/files/ { # For Drupal >= 7
        try_files $uri /index.php?$query_string;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}

The default.conf

#
# The default server
#
server {
listen       80 default_server;
server_name  _;

    root /var/www/html;

    #charset koi8-r;

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

    location / {
        index  index.html index.htm index.php;
    }

    error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass   localhost:9000;
        fastcgi_param  SCRIPT_FILENAME          $document_root$fastcgi_script_name;    
        include        fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }
}

/etc/nginx/ file tree

/etc # tree nginx      
nginx                  
├── conf.d             
│   └── default.conf   
├── default.d          
├── fastcgi.conf       
├── fastcgi_params     
├── koi-utf            
├── koi-win            
├── mime.types         
├── nginx.conf         
├── scgi_params        
├── uwsgi_params       
└── win-utf            

2 directories, 10 files
1

The configuration looks like it is not valid for Drupal 8. According to https://pantheon.io/blog/update-your-nginx-config-drupal-8 article, Drupal 8 has some unusual paths that need to be covered separately in nginx configuration. The article should contain the information you need to fix the issues.

0

I think you used try_files wrong in the section

location / {
    # try_files $uri @rewrite; # For Drupal <= 6
    try_files $uri /index.php?$query_string; # For Drupal >= 7
}

The last argument of try_files is the "404" location. Id you edit it to

try_files $uri /index.php?$query_string =404;

it might work

0

Solved it by adding this configuration in /etc/nginx/conf.d/default.conf

#
# The default server
#
server {
    server_name drupaldocker.com;
    root /var/www/html; ## <-- Your only path reference.

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Very rarely should these ever be accessed outside of your lan
    location ~* \.(txt|log)$ {
        allow 192.168.0.0/16;
        deny all;
    }

    location ~ \..*/.*\.php$ {
        return 403;
    }

    location ~ ^/sites/.*/private/ {
        return 403;
    }

    # Allow "Well-Known URIs" as per RFC 5785
    location ~* ^/.well-known/ {
        allow all;
    }

    # Block access to "hidden" files and directories whose names begin with a
    # period. This includes directories used by version control systems such
    # as Subversion or Git to store control files.
    location ~ (^|/)\. {
        return 403;
    }

    location / {
        # try_files $uri @rewrite; # For Drupal <= 6
        try_files $uri /index.php?$query_string; # For Drupal >= 7
    }

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;
    }

    # Don't allow direct access to PHP files in the vendor directory.
    location ~ /vendor/.*\.php$ {
        deny all;
        return 404;
    }

    # In Drupal 8, we must also match new paths where the '.php' appears in
    # the middle, such as update.php/selection. The rule we use is strict,
    # and only allows this pattern with the update.php front controller.
    # This allows legacy path aliases in the form of
    # blog/index.php/legacy-path to continue to route to Drupal nodes. If
    # you do not have any paths like that, then you might prefer to use a
    # laxer rule, such as:
    #   location ~ \.php(/|$) {
    # The laxer rule will continue to work if Drupal uses this new URL
    # pattern with front controllers other than update.php in a future
    # release.
    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        # Security note: If you're running a version of PHP older than the
        # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
        # See http://serverfault.com/q/627903/94922 for details.
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_intercept_errors on;
        fastcgi_pass localhost:9000;
    }

    # Fighting with Styles? This little gem is amazing.
    # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6
    location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7
        try_files $uri @rewrite;
    }

    # Handle private files through Drupal.
    location ~ ^/system/files/ { # For Drupal >= 7
        try_files $uri /index.php?$query_string;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}

FastCGI was also getting connection refused if specified as fastcgi_pass unix:/var/run/php7.0-fpm.sock;.

The only downside I have now is that I can't download any modules/themes via the Extend section, but this is just a folder permissions issue.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.