簡體   English   中英

docker 運行 nginx 作為另一個網絡服務器的代理(在 pi 上)

[英]docker running nginx as proxy to another webserver (on pi)

我目前的小項目有點不知所措。 (雖然應該沒那么難)

我正在嘗試在我的 Pi 上使用 docker 運行多個網頁(用於測試目的),這些網頁都應該可以使用 PI 的 IP 訪問。

我目前運行一個 minimL LIGHTTPD :(基於樹脂/rpi-raspbian 圖像)

docker run -d -v <testconfig>:/etc/lighttpd -p <pi-ip>:8080:80 <image name>

(使用 pi 上的瀏覽​​器和網絡中的其他計算機可以訪問此服務器)

對於 nginx,我使用一個簡單的配置(從http://nginx.org/en/docs/beginners_guide.html開始)運行另一個容器,其中包含一個網頁和圖像來測試容器配置。 可以使用<pi-ip> :80 訪問此容器

然后我嘗試為這些位置添加一個代理:(我玩過所以現在有 3 個位置用於相同的重定向)

location /prox1/{
  proxy_pass http://<pi-ip>:8080
}
location /prox2/{
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_pass http://<pi-ip>:8080
}
location /prox3/{
  fastcgi_pass <pi-ip>:8080;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param QUERY_STRING $query_string
}

版本 1 和 2 給出了 404(我嘗試添加重寫,但是由於 /prox1/ 被剪切,我 'nginx 自行重定向)。 版本 3 產生超時。

現在我不確定我是否仍然需要在 nginx 端進行挖掘,或者我必須在容器之間的 docker 端添加一個連接。

PS:Pi 正在運行 ArchForArm(使用 Xfce 作為桌面),因為我在 raspberian 存儲庫中找不到 docker-compose。

-- 編輯 ---:我目前手動啟動所有內容。 (所以沒有撰寫文件)

LIGHTTPD 開始於:

docker run -d --name mylighttpd -v <testconfig>:/etc/lighttpd -p <pi-ip>:8080:80 <image name>

如果我理解正確,它現在正在偵聽本地網絡(在<pi-ip>范圍內)端口 8080,它代表測試網絡服務器的端口 80。(我添加了 ..name 所以它更容易停止它。)

nginx 是這樣啟動的:

docker run --name mynginx --rm -p <pi-ip>:80:80 -v <config>:/data <image name>

8080 已添加到 Docker 文件的公開中。

我目前認為我誤解了同一台機器上兩個客戶端的連接,應該添加一個虛擬網絡,我目前正試圖在那里找到一些碼頭。

PS:我沒有使用 repo 中已經存在的 nginx-zeroconf,因為它告訴我它無法讀取已安裝的 docker 版本。 (並且與 composer 一起使用它的唯一示例還需要另一個容器,這似乎不適用於我的架構。)

-- edit2 --:對於簡單的proxy_pass,問題可能是URL。 我在“www”文件夾中添加了一個更深的文件夾“prox1”,其中包含一個索引文件,當我請求該頁面時會顯示該文件夾。

似乎<pi-ip> :80/prox1/ 被重定向到<pi-ip> :8080/prox1/ 但如果我嘗試重寫它(在“location /prox1/”內),它似乎首先刪除了 prox1,並且然后決定它現在是原始位置的一部分。 <pi-ip> :80/

PS:我知道將系統放置在另一個連接中可能比“橋接”更好,並且只公開代理,但我正在嘗試逐步學習這些東西。

-- edit3 --:現在正在嘗試撰寫,但似乎我遇到了另一個我不明白的部分(為什么我想在不先撰寫的情況下使其工作)。

我嘗試遵循http://docs.master.dockerproject.org/compose/compose-file/#ipv4-address-ipv6-address

networks:
  backbone:
    driver: bridge
    ipam:
      driver: default
      config:
       - subnet: 172.16.238.0/16
         gateway: 172.16.238.1
services:
  nginx:
    image: <nginx-image>
    ports: 80:80
    volumes:
     - <config>:/data
    depends_on:
     - lighttpd
    networks:
      backbone:
        ipv4_address: 172.16.238.2
 lighttpd:
    image: <lighttpd-image>
    ports: 8080:80
    volumes:
     - <testconfig>:/etc/lighttpd
    networks:
      backbone:
        ipv4_address: 172.16.238.3

現在我必須找出為什么我得到“僅當連接到具有用戶配置的子網的網絡時才支持用戶特定的 IP 地址”,我假設主網絡塊創建了一個名為“骨干網”的網絡。

-- edit4 --:似乎ip塊必須與我見過的所有碼頭不同,正確的形式是:

...
    networks:
      backbone:
        ipv4_address: 172.16.0.2/16
...

現在我必須弄清楚如何刪除 URL 的一部分,我很高興去。

核心問題似乎是缺少 nginx 參數proxy_redirect ,我發現漫無邊際的碼頭,當前的 nginx.conf 是:(/data/www 包含一個 index.html 與 /data/images 中的某些圖像的相對鏈接)

worker_processes auto;
events {
  worker_connections 1024;
}
http {
  server {
    listen 80;
    location / {
      root /data/www;
    }
    location /images/ {
      root /data;
    }
    location /prox0/{
      proxy_pass http://lighttpd:80;
      proxy_redirect default;
      proxy_buffering off;
    }
  }
}

在本地 Ip 上手動啟動似乎可行,但 docker-compose 更容易:(如果不使用 compose,請將lighttpd:80替換為用於啟動服務器的 ip 和端口。)

networks:
  backbone:
    driver: bridge
    ipam:
      driver: default
      config:
       - subnet: 172.16.238.0/16
         gateway: 172.16.238.1
services:
  nginx:
    image: <nginx-image>
    ports: 80:80
    volumes:
     - <config>:/data
    depends_on:
     - lighttpd
    networks:
      backbone:
        ipv4_address: 172.16.0.2
 lighttpd:
    image: <lighttpd-image>
    ports: 8080:80
    volumes:
     - <testconfig>:/etc/lighttpd
    networks:
      backbone:
        ipv4_address: 172.16.0.3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM