Como extrair arquivos estáticos de um dos dois locais no nginx

2

Eu tenho um pequeno aplicativo da web que envia arquivos para o servidor para depois ser exibido na web. Atualmente meu servidor HD está quase cheio e eu gostaria de adicionar um segundo. Atualmente, o aplicativo e todos os arquivos existentes estão em drive1 e eu adicionarei drive2 . É possível usar algo como try_files para verificar vários locais para ver se o arquivo existe?

Por exemplo, se alguém solicitar que mysite.com/images/2349879.jpg nginx procure /drive2/images/2349879.jpg primeiro, se ela não existir, verificará a opção drive1/images/2349879.jpg e, se não estiver, será exibido um 404?

Este é o meu nginx.conf atual

server {
    listen 80 default_server;
    listen 443 ssl;
    server_name www.MYSITE.com _;

    ssl_certificate     /srv/apps/MYSITE-ssl/certs/MYSITE.com.pem;
    ssl_certificate_key /srv/apps/MYSITE-ssl/private/MYSITE.com.key;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers RC4:HIGH:!aNULL:!MD5:!kEDH;
    ssl_prefer_server_ciphers on;

    set $https off;
    if ( $scheme = 'https' ) { set $https on; }

    add_header Strict-Transport-Security "max-age=315360000; includeSubdomains";

    keepalive_timeout   70;

    return 301 $scheme://MYSITE.com$request_uri;
}

server {
    listen      80;
    listen  443 ssl;
    server_name  MYSITE.com;

    ssl_certificate     /srv/apps/MYSITE-ssl/certs/MYSITE.com.pem;
    ssl_certificate_key /srv/apps/MYSITE-ssl/private/MYSITE.com.key;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers RC4:HIGH:!aNULL:!MD5:!kEDH;
    ssl_prefer_server_ciphers on;

    set $https off;
    if ( $scheme = 'https' ) { set $https on; }

    add_header Strict-Transport-Security "max-age=315360000; includeSubdomains";

    keepalive_timeout   70;

    root /var/www/MYSITE.com;

    charset utf-8;

    access_log  /srv/apps/logs/MYSITE.access.log  main;

    location /images {
        internal;
    }

    location /images/ {
        internal;
    }

    location ~ ^/images/(.*)$ {
        alias /srv/apps/MYSITE/i/$1;
        include /srv/apps/MYSITE.hosts;
        expires max;
        add_header Pragma "public";
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        log_not_found off;
    }

    location ~* \.(?:png|jpe?g|gif|ico|bmp|xml)$ {
        include /srv/apps/MYSITE.hosts;
        expires max;
        add_header Pragma "public";
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        log_not_found off;
    }

    location /i/ {
        internal;
        try_files $uri /srv/imagestorage$uri /srv/apps/MYSITE/i$uri;
    }

    location /i {
        internal;
        try_files $uri /srv/imagestorage$uri /srv/apps/MYSITE/i$uri;
    }

    location / {
        index index.php
        try_files $uri $uri/ /index.php?$args;
    }

    error_page  404             /info.php?act=404;
    error_page  500             /info.php?act=500;

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

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

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    location ~* \.php$ {
        try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS $https;
        fastcgi_pass php;
    }

    location ~* \.(?:js|css)$ {
        expires max;
        log_not_found off;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one

    location ~ /\. {
        deny  all;
    }

}

Existem algumas coisas estranhas acontecendo aqui, então tentarei explicar: os arquivos estão localizados em /srv/apps/MYSITE/i e a URL mysite.com/i/file.jpg retornará um arquivo desse local. Uma solicitação para mysite.com/images/file.jpg retornará o mesmo arquivo.

O código que tentei é try_files $uri /srv/imagestorage$uri /srv/apps/MYSITE/i$uri; em dois locais acima, mas parece que não está funcionando (ainda consigo ver arquivos em /i , mas não verifica a nova unidade ( /srv/imagestorage ) em Talvez eu esteja adicionando try_files no local errado?

    
por Josh Mountain 15.09.2014 / 22:56

1 resposta

4

Você pode simplesmente fazer isso:

server {

[...]

    root /;

    location /images {
        try_files /drive1$uri /drive2$uri;
    }

}

Em seguida, http(s)://mysite.com/images/1.png será exibido usando o caminho do sistema de arquivos local /drive1/images/1.png ou /drive2/images/1.png se o arquivo estiver ausente no primeiro caminho ou retornar um 404.

Obviamente, isso é um exemplo, você nunca deve configurar seu caminho do sistema de arquivos raiz em qualquer configuração do servidor web.

    
por 16.09.2014 / 20:46

Tags