2016-06-13 146 views
1

有3種成分,這個問題:閃亮服務器反向nginx的代理不會跟隨301重定向

  1. 泊塢容器:我有一個部署在EC2實例泊塢窗容器。更具體地講,我有rocker/shiny形象,我一直在使用運行:

    sudo docker run -d -v /home/ubuntu/projects/shiny_example:/srv/shiny-server -p 3838:3838 rocker/shiny 
    
  2. 閃亮服務器:標準閃亮的服務器配置文件是不變,併成立了以服務端口的/srv/shiny-server夾中的一切3838,我的本地~/projects/shiny_example的內容映射到容器的/srv/shiny-server/

    在我的本地~/projects/shiny_example,我已經克隆隨機閃亮的應用程序:

    git clone https://github.com/rstudio/shiny_example 
    
  3. nginx的:我已經建立了nginx作爲反向代理和here在整體上/etc/nginx/nginx.conf的內容。


的問題是,這種設置,當我試圖找回http://<ip-address>/shiny/shiny_example,我得到一個404的主線索,我有,什麼可能是錯誤的是,當我做:

wget http://localhost:3838/shiny_example 

從我的EC2實例在命令行中,我得到:

--2016-06-13 11:05:08-- http://localhost:3838/shiny_example 解決localhost(localhost)... 127.0.0.1

連接到本地主機(本地主機)| 127.0.0.1 |:3838 ...已連接。

HTTP請求發送的,在等待響應... 301永久移動

位置:/ shiny_example/[以下]

--2016-06-13 11:05:08-- http://localhost:3838/shiny_example/

將現有連接重用到localhost:3838。

HTTP請求發送的,在等待響應... 200 OK

長度:3136(3.1K)的text/html]

保存到: 'shiny_example.3'

100%[ ================================================== ================================================== ============================] 3,136 - .- K/s在0.04s

2016-06-13 11: 05:09(79.6 KB/s) - 'shiny_example。3'保存[3136/3136]

其中重點是我的

我認爲我的nginx配置沒有考慮到請求Docker映射端口時出現301重定向的情況。我認爲該解決方案涉及proxy_next_upstream,但我希望在嘗試在我的上下文中進行設置時提供一些幫助。

我也認爲這個問題可以忽略Docker上下文,但是理解如何在從Docker容器中的Shiny服務器請求資源時阻止301重定向,以及此行爲是否爲預期。

+0

您是否正在與'http:// /shiny/shiny_example'或'http:// :3838/shiny/shiny_example /'進行外部連接?這將有助於您展示失敗的wget命令。請注意,重定向只是爲您的url添加了一個尾部斜線,這不是Docker在做301. – BMitch

+0

@BMitch nginx正在偵聽80並反向代理'localhost:3838'。另外請注意,'wget'不是失敗,而是正在處理301。 – tchakravarty

+0

@BMitch所以,爲了明確起見,我正在通過外部連接'http:// /shiny/shiny_example /'。問題中包含'wget'的輸出。 – tchakravarty

回答

0

沒有什麼問題。基本上,在/etc/nginx/nginx.conf線路之一是include /etc/nginx/sites-enabled/*,這是拉動啓用了網站的默認文件,裏面有下面幾行:

server { 
     listen 80 default_server; 
     listen [::]:80 default_server ipv6only=on; 

     root /usr/share/nginx/html; 
     index index.html index.htm; 

     # Make site accessible from http://localhost/ 
     server_name localhost; 

     location/{ 
       # First attempt to serve request as file, then 
       # as directory, then fall back to displaying a 404. 
       try_files $uri $uri/ =404; 
       # Uncomment to enable naxsi on this location 
       # include /etc/nginx/naxsi.rules 
     } 

這是覆蓋我聽指令的端口80和用於位置/。註釋掉/etc/nginx/nginx.conf文件中已啓用站點的默認conf文件的include指令解決了所有問題。

1

沒有更多的產出,我不能肯定,但懷疑你的錯誤是在你的proxy_redirect行:

location /shiny/ { 
     rewrite ^/shiny/(.*)$ /$1 break; 
     proxy_pass http://localhost:3838; 
     proxy_redirect http://localhost:3838/ $scheme://$host/shiny_example; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
     proxy_read_timeout 20d; 
    } 

嘗試改變,爲:

location /shiny/ { 
     rewrite ^/shiny/(.*)$ /$1 break; 
     proxy_pass http://localhost:3838; 
     proxy_redirect http://localhost:3838/ $scheme://$host/shiny/; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
     proxy_read_timeout 20d; 
    } 

其原因是當301頭從「http://localhost:3838」回來添加尾部斜槓,它會被重寫爲「http://localhost/shiny_example」,它不存在於您的nginx配置中,並且還可能會從路徑中刪除斜槓。這意味着從「http://localhost:3838/shiny_example」到「http://localhost:3838/shiny_example/」的301將被重寫爲「http://localhost/shiny_exampleshiny_example/」,此時您將得到404。

+0

感謝您的回答BMitch。我明白你的理由。然而,我認爲'http_redirect'這一行的寫法是這樣的,因爲服務器實現了websocket,'scheme'(即'ws:')對於處理很重要。 [這裏](https://support.rstudio.com/hc/en-us/articles/213733868-Running-Shiny-Server-with-a-Proxy)是一個參考。 – tchakravarty

+0

另外,你可以列出你想要我嘗試的東西,包括輸出?從你的評論中我不清楚。 – tchakravarty

+0

我正在查找的輸出是來自http:// localhost/shiny/shiny_example的失敗的wget行。你說過你看到一個你認爲與301相關的404,但是沒有提供任何輸出,日誌或其他細節。我已經更新了包含$ scheme重定向的答案,從提供的URL中我沒有看到$ host/shiny_example,只有$ host/shiny / – BMitch