user984621
user984621

Reputation: 48443

nginx - php scripts (PHP7) are still being downloaded, not executed

I have installed nginx and PHP7 on a Ubuntu 16 server.

PHP7 is installed here:

which php
/usr/bin/php

and here's my nginx config file:

upstream unicorn {
  server unix:/home/deployer/apps/myapp/shared/sockets/unicorn.myapp.sock;
}

server {
    listen 443 ssl;
    server_name myapp.com;

    ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    return 301 https://www.myapp.com$request_uri;
}

server {
  #listen 80 default deferred;

  listen 443 ssl; # managed by Certbot
  server_name www.myapp.com;
  root /home/deployer/apps/myapp/current/public;

  location ^~ /blog {
    alias /home/deployer/blog;
    index index.php;
    try_files $uri $uri/ /blog/index.php?$args;
    #rewrite ^/blog/(.*)+$ /blog/index.php?$1;
  }

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  location ~ ^/(robots.txt|sitemap.xml.gz)/ {
    root /home/deployer/apps/myapp/current/public;
  }

  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header   X-Forwarded-Proto https; # added because of infinite looping
    proxy_redirect off;
    proxy_pass http://unicorn;
    proxy_read_timeout 120; # added for test purposes
  }

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;

ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/ssl/certs/dhparam.pem;

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    # Redirect non-https traffic to https
    # if ($scheme != "https") {
    #     return 301 https://$host$request_uri;
    # } # managed by Certbot
}

I've tried so many different approaches to config the PHP correctly, but still cannot find the right way. The PHP scripts are still being downloaded instead of being executed.

I also tried to clear cache, but it didn't help.

What am I missing yet in the config?

Upvotes: 1

Views: 56

Answers (1)

Richard Smith
Richard Smith

Reputation: 49672

Your current location ~ \.php$ has the wrong root and will not see any URIs that begin with /blog anyway. As you have two roots and as you are using the ^~ modifier on the prefix location, you need to use a nested location block for PHP. For example:

location ^~ /blog {
    root /home/deployer;
    index index.php;
    try_files $uri $uri/ /blog/index.php?$args;

    location ~ \.php$ {
        ...
    }
}

The alias directive is unnecessary and inefficient is the value of the location is the same as the end of the alias value. Use a root directive instead - as advised in the manual here.

Upvotes: 1

Related Questions