====== Nginx Proxy Manager(NPM) 當 Revers Proxy Server(Docker) ====== * 環境 : [[tech/alpine_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 (預設帳號密碼 : admin@example.com / changeme) * 登入後會要求更改與設定 Administrator 的帳號密碼 \\ {{:tech:2022-09-03_19_28_43.png?600|}} \\ {{:tech:2022-09-03_19_29_15.png?600|}} * 新增一個 Proxy Host : * Hosts -> Porxy Hosts -> Add Proxy Host -> Exp. www.ichiayi.com ichiayi.com * Detail -> Exp. 內部實際主機的 IP 是 https://192.168.11.233 \\ {{:tech:2022-09-03_21_08_01.png?1024|}} * Custom locations -> Add location -> Exp. 將之前的 /wiki 導到現在的沒有 /wiki 的網址 \\ {{:tech:2022-09-03_21_09_35.png?1024|}} * SSL -> Exp. 設定由 Let's Encrypt 簽發 SSL 憑證, 並透過 Cloudflare DNS 進行驗證 \\ {{:tech:2022-09-03_21_11_56.png?1024|}} * 需要至 Cloudflare 的管理介面產生一個可以修改 Domain Name 權限的 API Token \\ {{:tech:2022-09-03_21_15_35.png?600|}} \\ {{:tech:2022-09-03_21_14_35.png?600|}} * 將產生的 API Token 設定到 dns_cloudflare_api_token * 要勾選同意 Let's Encrypt 服務條款, 點下 Save 如果沒問題大概 10 秒左右就可以產生SSL憑證 \\ {{:tech:2022-09-03_21_19_54-2.png?1024|}} ===== 更版升級 ===== * 只要執行以下命令就可以直接更版 docker compose pull && docker compose up -d * 查看啟動過程 Logs docker compose logs -f ===== 問題處理 ===== ==== 1. 使用 Cloudflare 當 CDN 時傳入實際用戶 IP 的設定 ==== * 參考 - https://github.com/NginxProxyManager/nginx-proxy-manager/issues/811 * 編輯 Proxy Host -> Advanced -> Custom Nginx Configuration 加入 real_ip_header CF-Connecting-IP; 即可 \\ {{:tech:2022-09-03_22_42_06.png|}} ==== 2. 解決無法下載Proxy Host 超過 1GB 大檔案的設定 ==== * Proxy Host 是 NextCloud 要提供檔案下載時發現預設下載檔案大小限制為 1GB * 參考 - https://rodrigolmti.medium.com/nextcloud-with-portainer-nginx-proxy-manager-63df45d62a0b * 另外 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. 解決忘記登入資訊的做法 ==== * 參考 - https://github.com/NginxProxyManager/nginx-proxy-manager/discussions/1634 * 主要就是還原成預設登入帳號密碼的作法 * login: admin@example.com * pass: changeme ==== 4. 統計分析紀錄的做法 ==== * 可使用 [[https://github.com/xavier-hernandez/goaccess-for-nginxproxymanager|goaccess-for-nginxproxymanager]] 當簡易分析方案 * 安裝方式可參考 [[tech/goaccess-for-nginxproxymanager]] ==== 5. 安裝環境無 IPv6 的議題 ==== * 參考 - https://nginxproxymanager.com/advanced-config/#docker-file-secrets * 無 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 無法運作議題 ==== * 參考 - https://github.com/NginxProxyManager/nginx-proxy-manager/issues/3474 * 目前 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 ===== 參考網址 ===== * https://nginxproxymanager.com/guide/#features {{tag>nginx proxy}}