跳到主要内容

反向代理

使用者可以部署自訂的反向代理來轉發請求至 Immich。通過這種方式,反向代理可以處理 TLS 終止、負載平衡或其他高級功能。在 Immich 和使用者之間的所有反向代理必須轉發所有標頭並將 HostX-Real-IPX-Forwarded-ProtoX-Forwarded-For 標頭設置為其適當的值。此外,您的反向代理應允許足夠大的上傳尺寸。遵循這些做法可以確保所有自訂的反向代理完全兼容 Immich。

注释

修復頁面可能需要很長時間加載。為了避免伺服器超時或錯誤,我們建議在您的代理伺服器上指定至少 10 分鐘的超時值。

注意

Immich 不支持在子路徑上提供服務,例如 location /immich {。必須在(子)域的根路徑上進行服務提供。

Nginx 示例配置

下面是一個 Nginx 的示例配置。請確保將 public_url 設置為您的實例的前端 URL,並將 backend_url 設置為 Immich 伺服器的路徑。

server {
server_name <public_url>;

# 允許大文件上傳
client_max_body_size 50000M;

# 設置標頭
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# 啟用 Websockets: http://nginx.org/en/docs/http/websocket.html
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;

# 設置超時
proxy_read_timeout 600s;
proxy_send_timeout 600s;
send_timeout 600s;

location / {
proxy_pass http://<backend_url>:2283;
}
}

與 Let's Encrypt 的兼容性

如果您的 Nginx 配置包括 Let's Encrypt 的相關段落,很可能包含如下片段:

location ~ /.well-known {
...
}

這個特定的 location 指令可能會意外阻止移動客戶端訪問 /.well-known/immich 路徑,這對於發現功能至關重要。通常在此情況下的錯誤訊息是:"您的應用重大版本與伺服器不兼容"。為了解決此問題,您應為該路徑引入一個專門的位置塊,確保請求正確地代理至 Immich 伺服器:

location = /.well-known/immich {
proxy_pass http://<backend_url>:2283;
}

這樣做可以在保持 Let's Encrypt 功能的同時,允許移動客戶端不受阻礙地訪問必要的 Immich 路徑。

Caddy 示例配置

作為 Nginx 的替代方案,您也可以使用 Caddy 作為反向代理(具有自動 HTTPS 配置)。下面是一個示例配置。

immich.example.org {
reverse_proxy http://<snip>:2283
}

Apache 示例配置

下面是一個 Apache2 站點配置的示例配置。

<VirtualHost *:80>
ServerName <snip>
ProxyRequests Off
# 設置超時秒數
ProxyPass / http://127.0.0.1:2283/ timeout=600 upgrade=websocket
ProxyPassReverse / http://127.0.0.1:2283/
ProxyPreserveHost On
</VirtualHost>

Traefik Proxy 示例配置

下面的示例適用於 Traefik 第 3 版。

最重要的是要增加 Immich 使用的進入點的 respondingTimeouts 值。在此示例中,websecure 進入點對應端口 443。默認情況下設置為 60 秒,這會導致影片在上傳 1 分鐘後停止(錯誤代碼 499)。使用此配置它將在 10 分鐘後失敗,這通常已足夠。如果需要,可進一步增加。

traefik.yaml

[...]
entryPoints:
websecure:
address: :443
# 此部分需要新增
transport:
respondingTimeouts:
readTimeout: 600s
idleTimeout: 600s
writeTimeout: 600s

第二部分位於包含 Immich 的 docker-compose.yml 文件中。像示例中一樣,新增 Traefik 特定標籤。

docker-compose.yml

services:
immich-server:
[...]
labels:
traefik.enable: true
#增加用於此處進入點的 readTimeouts
traefik.http.routers.immich.entrypoints: websecure
traefik.http.routers.immich.rule: Host(`immich.your-domain.com`)
traefik.http.services.immich.loadbalancer.server.port: 2283

請記住,Traefik 需要與 Immich 所在的網路進行通信,通常通過將 Traefik 網路添加到 immich-server