天天看點

運作在docker裡的nginx添加虛拟目錄并設定預設頁面

其實是很簡單的設定,但由于不懂docker,走了許多彎路。

一、虛拟目錄設定規則無效

我想将一些靜态資源部署到測試伺服器上,友善開發和示範。測試伺服器是阿裡雲虛拟機,linux,上面裝有有一個nginx,可以完成這個小凱絲。結果自認為對nginx已經有了一定了解,這種簡單任務手到擒來,不料搞到雞毛鴨血。配置好虛拟目錄的映射後,系統死活不認,無法通路,自動跳到登入頁面。摘錄配置如下:

server {
  listen      80;
  server_name 192.168.0.248;

  location / {
      root /home/admin_ui/dist;
      index /mscodereact/index.html;
      try_files $uri $uri/ /mscodereact/index.html;
  }

  location /favicon.ico {
      root /home/admin_ui/dist;
      try_files $uri/ /mscodereact/favicon.ico;
  }

  #這就是我想添加的虛拟目錄
  #請注意其路徑與 “/”指向的路徑并不相同
  location /javapubzy/ {
    index index.html;
    alias /home/beian/javapubzy/;
      try_files $uri $uri/ /javapubzy/index.html;
  }
}      

在網上查找來,查找去,通路這個http://192.168.0.248/javapubzy,都是跳到了登入頁面。究其原因,是因為系統路徑指向無效,于是做了預設處理,采用了第一條設定規則:

/ {
      root /home/admin_ui/dist;
      index /mscodereact/index.html;
      try_files $uri $uri/ /mscodereact/index.html;
  }      

其中,​

​try_files $uri $uri/ /mscodereact/index.html;​

​​,意思是,系統先看有沒有​

​$uri​

​​這個檔案,沒有則看有沒有​

​$uri​

​​這個檔案夾(即​

​$uri/​

​​,後面的斜杠代表檔案夾)。如果沒有,則跳到​

​/mscodereact/index.html​

​,這是一個應用的首頁,需要登入。

二、規則無效的原因是路徑無法通路

/”指向的路徑并不相同
  location /javapubzy/ {
    index index.html;
    alias /home/beian/javapubzy/;
      try_files $uri $uri/ /javapubzy/index.html;
  }      

經過反複測試,發現将檔案夾移到根目錄"/"所在的位置,即可正常通路,放到别的地方就不行。想起之前同僚的提示,醒悟過來。我猜測,這個nginx是裝在docker裡的,安裝的時候,隻映射了一個特定的檔案夾,隻有将内容放在其中,才有可能識别。

改為

location /javapubzy/ {
    index index.html;
    alias /home/admin_ui/dist/javapubzy/;
    try_files $uri $uri/ /javapubzy/index.html;
}      

其實這一步純屬多餘。将檔案夾javapubzy放置到指定的根目錄後,無須做任何設定,即可通路。即使設定了,也不生效。如:

location /j/ {
    index index.html;
    alias /home/admin_ui/dist/javapubzy/;
    try_files $uri $uri/ /j/index.html;
}      

在這裡,想用j來代替javapubzy,反而無法通路,純屬畫蛇添足。

由于我目前在docker裡如何安裝nginx并不了解,是以無法扯更多,可參考如下文章:

​​​docker中nginx的預設路徑位置和映射目錄啟動​​

三、虛拟目錄設定規則解釋

/ {
        root /home/admin_ui/dist;
        index /mscodereact/index.html;
        try_files $uri $uri/ /mscodereact/index.html;
    }

    location /favicon.ico {
        root /home/admin_ui/dist;
        try_files $uri/ /mscodereact/favicon.ico;
    }

    location /javapubzy/ {
        index index.html;
        alias /home/admin_ui/dist/javapubzy/;
        try_files $uri $uri/ /javapubzy/index.html;
    }      

這3個規則放在一起,結合起來看利于比較。可以發現映射路徑有 root 和 alias 兩種方式。

1、root與alias的差別

1)root指向虛拟目錄所在的父檔案夾,而alias直接指向虛拟目錄所在檔案夾

2)同一個虛拟路徑,如果既設定了root方式,又設定了alias方式,則以alias方式為準

2、預設頁面

index index.html;      

不要用下面這個,這個是列出目錄下的檔案,不安全。

autoindex on;      

3、try_files

try_files $uri $uri/ /javapubzy/index.html;      

系統先看有沒有​

​$uri​

​​這個檔案,沒有則看有沒有​

​$uri​

​​這個檔案夾(即​

​$uri/​

​​,後面的斜杠代表檔案夾)。如果沒有,則跳到​

​/javapubzy/index.html​

​。

四、其他一些幹擾問題

繼續閱讀