2014-10-09 81 views
0

我有一個使用FastCGI的Web應用程序。這個應用程序被部署爲不同的「網站」。我有一個應用程序的一般nginx配置,然後,我爲每個站點包含upstrams和位置文件。每個站點都需要一些.js和.css文件。現在,我通過通用配置文件的root來設置它們。我現在的要求是,我希望能夠爲不同的網站使用不同的.css和.js。因此,查找文件應首先從網站/位置級別開始,如果找不到,則在常規root中搜索。Nignx嘗試在不同位置的不同目錄中的文件

一般的nginx的conf文件是:

# Change this directory depending on the server 
    include /etc/nginx/conf.d/app/upstreams/*.conf; 


    server 
     { 
     server_name 24.39.17.76; 

     root /var/www/app/files/; 

     listen  443; 
     ssl     on; 
     ssl_certificate /etc/nginx/conf.d/app/ssl/new/app.pem; 
     ssl_certificate_key /etc/nginx/conf.d/app/ssl/new/app.com.key; 

     location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|svg|woff|ttf)$ { 

      access_log off; # this is because otherwise, with jail2ban the user may be banned 
      # add_header Access-Control-Allow-Origin "*"; 
      expires max; 
      add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
      add_header Pragma public; 

     } 

     # Change this directory depending on the server 
     include /etc/nginx/conf.d/app/locations/*.conf; 

     } 

記下我包括所有位置的線CONF和上行流文件。

然後一個特定的網站,擁有上游文件,如:

upstream siteX 
    { 
    server localhost:9021; 
    server localhost:9022; 
    server localhost:9023; 
    } 

和位置文件,像這樣的:

location ~ ^/siteX/reps { 

     access_log /var/log/nginx/app/siteX_reps_access.log; 
     error_log /var/log/nginx/app/siteX_reps_error info; 
      if ($arg_service = "true") { 
        rewrite ^/(.*)$ /service/$1 last; 
      } 
     rewrite ^/siteX/(.*)$ /$1 break; 
     try_files $uri @fastcgiSiteX; 

    } 


    location @fastcgiSiteX { 

     include fastcgi_params; 
     fastcgi_param REQUEST_URI $uri?$args; 
     fastcgi_pass fastcgiSiteX; 
     fastcgi_next_upstream error invalid_header http_500; 

    } 

我的網頁,其中包括CSS和JS的HTML是像這個:

<script type="text/javascript" src="/JQDevelopmentLibrary/jQuery.js"></script> 
<link rel="stylesheet" type="text/css" href="/TBSDevelopmentLibrary/css/bootstrap.css"/> 

但我可以很容易地添加一個前綴,如果這有助於任何可能的解決方案,如:

<script type="text/javascript" src="/siteX/webfiles/JQDevelopmentLibrary/jQuery.js"></script> 
<link rel="stylesheet" type="text/css" href="/siteX/webfiles/TBSDevelopmentLibrary/css/bootstrap.css"/> 

SO ...一般文件位於/ var/www/app/files /下。但是,我希望對siteX來說,文件首先在另一個路徑中搜索,比如說/ var/www/siteX/files,並且只有在找不到的時候才搜索到。

一個解決方法我試過,但沒有工作是定義該try_files表達:

try_files /siteX/webfiles$uri $uri @fastcgiSiteX; 

然後,我把所有的文件夾和文件在$ DOCUMENT_ROOT/SITEX/webfiles,就是/var/www/app/files/siteX/webfiles/。我認爲這個解決方案應該可行,但事實並非如此。

任何想法?

在此先感謝,

回答

0

它的一種黑客,但它可以做到。

location ~ ^/siteX/reps { 

     access_log /var/log/nginx/app/siteX_reps_access.log; 
     error_log /var/log/nginx/app/siteX_reps_error info; 
      if ($arg_service = "true") { 
        rewrite ^/(.*)$ /service/$1 last; 
      } 
     rewrite ^/siteX/(.*)$ /$1 break; 
     try_files $uri @hack; 

    } 

    location @hack { 
    root /var/www/siteX/files; 
    try_files $uri $uri/ @fastcgiSiteX; 
    } 

    location @fastcgiSiteX { 

     include fastcgi_params; 
     fastcgi_param REQUEST_URI $uri?$args; 
     fastcgi_pass fastcgiSiteX; 
     fastcgi_next_upstream error invalid_header http_500; 

    } 
+0

嗨。我正在嘗試這個解決方案,但我有一個問題。 'try_files $ uri @hack;'將嘗試$ uri上的文件,這將在我的案例中找到。然後它會回落到@hack。我需要其他方法,首先用'/ var/www/siteX/files'做一個try_files,如果找不到,則回退到'/ var/www/app/files /'。任何想法如何適應您的解決方案?謝謝 – 2014-10-10 15:54:19