Home > Mobile >  Nginx root directory with nested symlinks
Nginx root directory with nested symlinks

Time:11-13

Our website (laravel) project directory is like this:

/home/user/project/{app,route,public_html,storage,...} 

New releases are placed in:

/home/user/releases/v1

For some reason we have to link public_html directory for every release, so:

/home/user/releases/v1/public_html > /home/user/project/public_html

Nginx root diretory is:

/home/user/www/site/public_html  

Which:

/home/user/www/site > /home/user/releases/v1

Since NGINX will follow symlinks, final root directory would be:

/home/user/project/public_html

Is there a way to fix this situation?

CodePudding user response:

Since the root of your virtual host is /home/user/www/site/public_html and since /home/user/www/site/public_html is a symlink to /home/user/project/public_html and since /home/user/project/public_html is a symlink to your latest release - nginX location blocks will actually search inside /home/user/releases/v1/public_html.


Here is an example. Let's say we have a folder /my_releases. Everytime I publish/deploy a new release I will create a new subfolder inside /my_releases with the version of the release (/my_releases/v1, then /my_releases/v2 and so on). All assets of the release will be inside the corresponding subfolder - so I will have

/my_releases
  |
   ---- /v1
  |      |
  |       --- /css
  |      |      |
  |      |       --- /home.a120cd8.css
  |      |
  |       --- /img
  |      |      |
  |      |       --- /logo.7f40c3a.svg
  |      |
  |       --- /js
  |      |     |
  |      |      --- /main.ba4de98.js
  |      |
  |       --- /api
  |      |      |
  |      |       --- /index.php
  |      |      |
  |      |       --- /routes
  |      |              |
  |      |               --- /login.php
  |       --- /index.html
  |
   ---- /v2
  |      |
  |       --- /css
  |      |      |
  |      |       --- /home.7845c7.css
  |      |
  |       --- /img
  |      |      |
  |      |       --- /logo.23038ad.svg
  |      |
  |       --- /js
  |      |     |
  |      |      --- /main.acb33f1.js
  |      |
  |       --- /api
  |      |      |
  |      |       --- /index.php
  |      |      |
  |      |       --- /routes
  |      |              |
  |      |               --- /login.php
  |       --- /index.html

........ next releases until the end of the world

My nginX is configured in such a way, that my virtual host has

server {
  server_name my.personal.web.site;
  root /var/www/public_html;
  .....
}

Before starting nginX, I have run the following 2 commands:

ln -s -f -n /my_releases/current /my_releases/v1
ln -s -f -n /var/www/public_html /my_releases/current

Then I started nginX - service nginx start. It will now serve v1 of my web site/application.

Now, any time I deploy a new release, I run the following command (replace v2 with the relevant revision)

ln -s -f -n /my_releases/current /my_releases/v2

Don't forget to set the proper filesystem permissions and ownership.

  • Related