Nginx Proxy Manager(NPM) 當 Revers Proxy Server(Docker)
- 安裝的主機 IP : 192.168.11.231
編輯與啟動
- 編輯 yml 檔案
vi docker-compose.yml
services: nginx-proxy-manager: image: jc21/nginx-proxy-manager:latest container_name: nginx-proxy-manager restart: always ports: - '80:80' - '81:81' - '443:443' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt goaccess: image: xavierh/goaccess-for-nginxproxymanager:latest container_name: goaccess restart: always ports: - '7880:7880' environment: - TZ=Asia/Taipei - SKIP_ARCHIVED_LOGS=False #optional - DEBUG=False #optional - BASIC_AUTH=False #optional - BASIC_AUTH_USERNAME=user #optional - BASIC_AUTH_PASSWORD=pass #optional - EXCLUDE_IPS=127.0.0.1 #optional - comma delimited - LOG_TYPE=NPM #optional - more information below - ENABLE_BROWSERS_LIST=True #optional - more information below - CUSTOM_BROWSERS=Kuma:Uptime,TestBrowser:Crawler #optional - comma delimited, more information below - HTML_REFRESH=5 #optional - Refresh the HTML report every X seconds. https://goaccess.io/man - KEEP_LAST=30 #optional - Keep the last specified number of days in storage. https://goaccess.io/man volumes: - ./data/logs:/opt/log watchtower: image: containrrr/watchtower container_name: watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - TZ=Asia/Taipei - WATCHTOWER_SCHEDULE=0 0 4 * * * - WATCHTOWER_CLEANUP=true labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped
- 啟動服務
docker compose up -d
進入網頁設定
- http://192.168.11.231:81 (預設帳號密碼 : [email protected] / changeme)
- 新增一個 Proxy Host :
- Hosts → Porxy Hosts → Add Proxy Host → Exp. www.ichiayi.com ichiayi.com
-
- 將產生的 API Token 設定到 dns_cloudflare_api_token
更版升級
- 只要執行以下命令就可以直接更版
docker compose pull && docker compose up -d
- 查看啟動過程 Logs
docker compose logs -f
問題處理
1. 使用 Cloudflare 當 CDN 時傳入實際用戶 IP 的設定
2. 解決無法下載Proxy Host 超過 1GB 大檔案的設定
- Proxy Host 是 NextCloud 要提供檔案下載時發現預設下載檔案大小限制為 1GB
- 另外 NextCloud/all-in-one 會開啟 TRACE and TRACK method, 會造成主機弱點, 也順便設定關閉
- 編輯 Proxy Host → Advanced → Custom Nginx Configuration 加入
client_body_buffer_size 512k; proxy_read_timeout 86400s; client_max_body_size 0; if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS)$) { return 405; }
3. 解決忘記登入資訊的做法
- 主要就是還原成預設登入帳號密碼的作法
- login: [email protected]
- pass: changeme
4. 統計分析紀錄的做法
- 可使用 goaccess-for-nginxproxymanager 當簡易分析方案
5. 安裝環境無 IPv6 的議題
- 無 IPv6 的環境啟動時 log 內會出現類似以下的錯誤訊息
: app-1 | ❯ Starting nginx ... app-1 | nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol) app-1 | ❯ Starting nginx ... app-1 | nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol) :
- 只要在 docker-compose.yml 內的環境變數加上 DISABLE_IPV6=true 即可 Exp.
version: '3' services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '81:81' - '443:443' environment: - DISABLE_IPV6=true volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
6. 升級到 v2.11 後 Custom locations 無法運作議題
- 目前 Workaround 作法
- 在 docker-compose.yml 目錄新增 _hsts_map.conf 檔案
touch _hsts_map.conf
- 修改 docker-compose.yml 內增加
vi docker-compose.yml
: - ./_hsts_map.conf:/app/templates/_hsts_map.conf
- 重新啟動 docker compose
docker compose up -d
7. 匯出設定資料到另外一台主機匯入的作法
- 在來源主機匯出
cd nginx-proxy-manager tar -cvf data.tar data/ tar -cvf letsencrypt.tar letsencrypt/
- 將 data.tar 與 letsencrypt.tar 複製到目標主機 Exp.
scp *.tar 172.16.1.99:/root/
- 在目標主機匯入
mv *.tar nginx-proxy-manager/ cd nginx-proxy-manager docker compose down mv data data.org mv letsencrypt letsencrypt.org tar -xvf data.tar tar -xvf letsencrypt.tar docker compose up -d docker compose logs -f