Skip to content

Instantly share code, notes, and snippets.

@tsolar
Last active October 9, 2024 01:24
Show Gist options
  • Save tsolar/8d45ed05bcff8eb75404 to your computer and use it in GitHub Desktop.
Save tsolar/8d45ed05bcff8eb75404 to your computer and use it in GitHub Desktop.
Laravel in subdirectory nginx example
server {
client_body_in_file_only clean;
client_body_buffer_size 32K;
client_max_body_size 300M;
sendfile on;
send_timeout 300s;
# Port that the web server will listen on.
#listen 80;
# Host that will serve this project.
server_name tsolar.com;
# Useful logs for debug.
access_log /var/log/nginx/tsolar.com-access.log;
error_log /var/log/nginx/tsolar.com-error.log;
rewrite_log on;
# The location of our projects public directory.
root /home/tom/public_html/demos/;
# Point index to the Laravel front controller.
index index.php;
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires max;
}
location / {
# URLs to attempt, including pretty ones.
try_files $uri $uri/ /index.php?q=$uri&$args;
}
# Remove trailing slash to please routing system.
if (!-d $request_filename) {
rewrite ^/(.+)/$ /$1 permanent;
}
# version 1
location ^~ /demo1 {
alias /home/tom/public_html/demos/demo1/public;
try_files $uri $uri/ @demo1;
location ~* \.php {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(.*)$;
include /etc/nginx/fastcgi_params;
}
}
location @demo1 {
rewrite ^/demo1/(.*)$ /demo1/index.php/$1 last; # THIS IS THE IMPORTANT LINE
}
# end version 1
# version 2
# this is with `ln -s /home/tom/public_html/demos/demo1/public <document root>/demo1`
location ~ /demo1 {
try_files /demo1/$uri /demo1/$uri/ /demo1/index.php?q=$uri&$args;
}
# end version 2
# PHP FPM configuration.
location ~* \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# We don't need .ht files with nginx.
location ~ /\.ht {
deny all;
}
# Set header expirations on per-project basis
location ~* \.(?:ico|css|js|jpe?g|JPG|png|svg|woff)$ {
expires 365d;
}
}
@dhanyn10singapay
Copy link

I have done that by using below configuration and its working. The above mentioned gist was displaying 404 "Not Found".

  # sub_directory
  location ^~ /sub_directory {  
      alias /var/www/choppies/sub_directory/public;  
      try_files $uri $uri/ @sub_directory;  

      location ~ \.php {  
          include snippets/fastcgi-php.conf;
          fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
          fastcgi_param SCRIPT_FILENAME /var/www/choppies/sub_directory/public/index.php;
      }  
  }  

  location @sub_directory {
      rewrite /sub_directory/(.*)$ /sub_directory/index.php?/$1 last;  
  }
  # end sub_directory

worked for me, thanks @SuryaElite

@phrfpeixoto
Copy link

As of Aug'24, this worked for me:

server {
    listen       443;
    server_name  www.example.com example.com;

    charset utf-8;

    root /var/www/www.example.com;
    access_log /var/log/nginx/ssl-access.log;
    error_log /var/log/nginx/ssl-error.log;
    rewrite_log on;

    # development settings
    client_max_body_size 50M;
    fastcgi_buffers 8 1600k;
    fastcgi_buffer_size 3200k;
    fastcgi_connect_timeout 300s;
    fastcgi_send_timeout 300s;
    fastcgi_read_timeout 300s;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
    include snippets/ssl-params.conf;

    location ~ /.well-known {
        allow all;
    }

    location ^~ /laravel {
        alias /application/laravel/public;
        access_log /var/log/nginx/laravel-access.log;
        error_log /var/log/nginx/laravel-error.log error;

        try_files $uri $uri/ @laravel;

        location ~ \.php$ {
            fastcgi_split_path_info ^\/laravel\/((?U).+\.php)(.*)$;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param HTTP_PROXY "";
            fastcgi_param SCRIPT_FILENAME /app/public/$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME /laravel/$fastcgi_script_name;
        }
    }

    location @laravel {
        rewrite /laravel/(.*)$ /laravel/index.php last; # Remove ?/$1 since fastcgi_params adds query string
    }

    ... other stuff for my website ...
}

I had to adapt the examples posted by other users because the FPM daemon is running within a docker container, but nginx is not
And nginx does need access to the files to serve them, hence:

  • The need to use an alias where the app files are present.
  • The need to set the container path (/app) on the SCRIPT_FILENAME fastcgi_param

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment