-
-
Save aveexy/4b2b22b2198636b0a91c7c142ec11b37 to your computer and use it in GitHub Desktop.
| pid /run/nginx/nginx.pid; | |
| error_log stderr; | |
| daemon off; | |
| events { | |
| } | |
| http { | |
| proxy_cache_path /var/cache/nginx/immich_revprox keys_zone=immich_revprox:10m levels=1:2 use_temp_path=off inactive=1d max_size=1g; | |
| server { | |
| listen 0.0.0.0:443 ssl ; | |
| listen [::0]:443 ssl ; | |
| server_name example.com ; | |
| http2 on; | |
| location /immich { | |
| proxy_pass http://192.168.1.100:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| proxy_set_header Accept-Encoding "gzip"; | |
| gunzip on; | |
| proxy_pass_request_headers on; | |
| proxy_buffering on; | |
| proxy_cache immich_revprox; | |
| proxy_cache_valid 200 206 1d; | |
| sub_filter_once off; | |
| sub_filter_types text/html; | |
| sub_filter ' href="/' ' href="/immich/'; | |
| sub_filter ' src="/' ' src="/immich/'; | |
| sub_filter ' action="/' ' action="/immich/'; | |
| sub_filter 'import("/_app' 'import("/immich/_app'; | |
| sub_filter 'base: ""' 'base: "/immich"'; | |
| location /immich/_app/immutable/chunks { | |
| sub_filter_types *; | |
| sub_filter '"/api/socket.io"' '"/immich/api/socket.io"'; | |
| proxy_pass http://10.8.1.1:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| } | |
| location ~ /immich/_app/immutable/chunks/(index|app)\\. { | |
| sub_filter_types *; | |
| sub_filter '"/' '"/immich/'; | |
| proxy_pass http://10.8.1.1:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| } | |
| location ~ /immich/_app/immutable/chunks/constants { | |
| sub_filter_types *; | |
| sub_filter '="/' '="/immich/'; | |
| proxy_pass http://10.8.1.1:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| } | |
| location ~ /immich/_app/immutable/chunks/asset-utils { | |
| sub_filter_types *; | |
| sub_filter 'basePath:"/api"' 'basePath:"/immich/api"'; | |
| proxy_pass http://10.8.1.1:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| } | |
| location ~ /immich/_app/immutable/chunks/fetch-client\\. { | |
| sub_filter_types *; | |
| sub_filter 'baseUrl:"/api' 'baseUrl:"/immich/api'; | |
| proxy_pass http://10.8.1.1:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| } | |
| location ~ /immich/_app/immutable/chunks/api\\. { | |
| proxy_pass http://10.8.1.1:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| sub_filter_types *; | |
| sub_filter '="/api"' '="/immich/api"'; | |
| sub_filter 'basePath:"/api"' 'basePath:"/immich/api"'; | |
| } | |
| location ~ /immich/api/socket.io { | |
| proxy_pass http://10.8.1.1:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| proxy_cache off; | |
| proxy_set_header Accept-Encoding $http_accept_encoding; | |
| proxy_set_header Connection "upgrade"; | |
| proxy_set_header Upgrade websocket; | |
| } | |
| location ~ /immich/api { | |
| proxy_pass http://10.8.1.1:2283; | |
| rewrite /immich/(.*) /$1 break; | |
| proxy_cache off; | |
| sub_filter_types *; | |
| sub_filter '"redirectUri":"/' '"redirectUri":"/immich/'; | |
| } | |
| } | |
| proxy_pass_request_headers on; | |
| proxy_http_version 1.1; | |
| proxy_set_header Upgrade $http_upgrade; | |
| proxy_set_header Connection $connection_upgrade; | |
| slice 10m; | |
| proxy_cache_key $uri$is_args$args$slice_range; | |
| proxy_cache_lock on; | |
| proxy_cache_lock_timeout 0s; | |
| proxy_cache_lock_age 200s; | |
| proxy_cache_min_uses 1; | |
| proxy_set_header Range $slice_range; | |
| 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; | |
| proxy_set_header X-Forwarded-Host $host; | |
| proxy_set_header X-Forwarded-Server $host; | |
| proxy_cache_use_stale error timeout invalid_header updating | |
| http_500 http_502 http_503 http_504; | |
| proxy_redirect off; | |
| } | |
| } |
thank you, great!!
there is my config, proxy pass to 127.0.0.1:2283, and modified something code because the error, I just delete some code nginx -t show to me, but I don't understand them. the config work perfectly now.
@aveexy thank you again, and your nginx skill is so excellent, how do you learn it?
location /immich {
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
proxy_set_header Accept-Encoding "gzip";
gunzip on;
proxy_pass_request_headers on;
proxy_buffering on;
proxy_cache_valid 200 206 1d;
sub_filter_once off;
sub_filter ' href="/' ' href="/immich/';
sub_filter ' src="/' ' src="/immich/';
sub_filter ' action="/' ' action="/immich/';
sub_filter 'import("/_app' 'import("/immich/_app';
sub_filter 'base: ""' 'base: "/immich"';
location /immich/_app/immutable/chunks {
sub_filter_types *;
sub_filter '"/api/socket.io"' '"/immich/api/socket.io"';
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
}
location ~ /immich/_app/immutable/chunks/(index|app)\\. {
sub_filter_types *;
sub_filter '"/' '"/immich/';
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
}
location ~ /immich/_app/immutable/chunks/constants {
sub_filter_types *;
sub_filter '="/' '="/immich/';
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
}
location ~ /immich/_app/immutable/chunks/asset-utils {
sub_filter_types *;
sub_filter 'basePath:"/api"' 'basePath:"/immich/api"';
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
}
location ~ /immich/_app/immutable/chunks/fetch-client\\. {
sub_filter_types *;
sub_filter 'baseUrl:"/api' 'baseUrl:"/immich/api';
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
}
location ~ /immich/_app/immutable/chunks/api\\. {
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
sub_filter_types *;
sub_filter '="/api"' '="/immich/api"';
sub_filter 'basePath:"/api"' 'basePath:"/immich/api"';
}
location ~ /immich/api/socket.io {
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
proxy_cache off;
proxy_set_header Accept-Encoding $http_accept_encoding;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade websocket;
}
location ~ /immich/api {
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
proxy_cache off;
sub_filter_types *;
sub_filter '"redirectUri":"/' '"redirectUri":"/immich/';
}
}
Hello,
Thank you very much for the configuration file; it has been extremely helpful!
However, after updating Immich to version v1.124.0 this morning, I encountered a significant issue. The update caused everything to break, and I received the following error:
Error: Error: 404
at Object.ht [as ok] (https://mydomain.com/immich/_app/immutable/chunks/fetch-client.DqMPutSq.js:1:7918)
at async Promise.all (index 0)
at async n (https://mydomain.com/immich/_app/immutable/chunks/server-config.store.DzAD3Dok.js:1:530)
at async o (https://mydomain.com/immich/_app/immutable/chunks/server.B9uUtD4f.js:1:224)
at async ra (https://mydomain.com/immich/_app/immutable/nodes/0.CItVphcP.js:1:2484)
at async Wt (https://mydomain.com/immich/_app/immutable/chunks/entry.CGh5KwEn.js:1:17711)
After some troubleshooting, I managed to create a configuration file that works for me. Additionally, I included support for large file uploads with the following directive:
client_max_body_size 50000M;
Here is my immich.conf
location /api/ {
return 301 /immich$request_uri;
}
location /immich {
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
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;
proxy_set_header Accept-Encoding "gzip";
gunzip on;
proxy_pass_request_headers on;
proxy_buffering on;
proxy_cache_valid 200 206 1d;
sub_filter_once off;
sub_filter ' href="/' ' href="/immich/';
sub_filter ' src="/' ' src="/immich/';
sub_filter ' action="/' ' action="/immich/';
sub_filter 'import("/_app' 'import("/immich/_app';
sub_filter 'base: ""' 'base: "/immich"';
sub_filter '"/api/' '"/immich/api/';
# Handle the root path assets
location /immich/ {
proxy_pass http://127.0.0.1:2283/;
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;
}
# Handle JavaScript files
location ~ \.js$ {
sub_filter_types application/javascript;
sub_filter '"/api/' '"/immich/api/';
sub_filter_once off;
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
}
location ~ /immich/_app/immutable/chunks/fetch-client\\. {
sub_filter_types application/javascript;
sub_filter 'baseUrl:"/api' 'baseUrl:"/immich/api';
sub_filter '"/api/' '"/immich/api/';
sub_filter_once off;
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
}
# Handle WebSocket connections
location ~ /immich/api/socket.io {
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
proxy_cache off;
proxy_buffering off;
proxy_set_header Accept-Encoding $http_accept_encoding;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade websocket;
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;
}
# Handle API requests
location ~ /immich/api {
proxy_pass http://127.0.0.1:2283;
rewrite /immich/(.*) /$1 break;
proxy_cache off;
proxy_buffering off;
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;
sub_filter_types *;
sub_filter '"redirectUri":"/' '"redirectUri":"/immich/';
}
}
I still have an issue on the administration panel where all links in the menu are rewritten with a second /immich, resulting in the following error:
Not found: /immich/immich/admin/library-management - 404
undefined
I can't figure out why this is happening. If anyone has any ideas, I would greatly appreciate your help !
Have a nice day !
Hello,
I created a nginx ingress based on above config. I'm on 1.143.1. All seems to work :-)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: HTTP
nginx.ingress.kubernetes.io/client-max-body-size: 8192m
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header Accept-Encoding "";
sub_filter_once off;
sub_filter_types *;
sub_filter ' href="/' ' href="/immich/';
sub_filter ' src="/' ' src="/immich/';
sub_filter ' action="/' ' action="/immich/';
sub_filter 'import("/_app' 'import("/immich/_app';
sub_filter '"/api/' '"/immich/api/';
# the following breaks websocket
#sub_filter '="/' '="/immich/';
# therefore:
sub_filter '="/admin' '="/immich/admin';
sub_filter '="/albums' '="/immich/albums';
sub_filter '="/libraries' '="/immich/libraries';
sub_filter '="/archive' '="/immich/archive';
sub_filter '="/favorites' '="/immich/favorites';
sub_filter '="/people' '="/immich/people';
sub_filter '="/places' '="/immich/places';
sub_filter '="/photos' '="/immich/photos';
sub_filter '="/explore' '="/immich/explore';
sub_filter '="/share' '="/immich/share';
sub_filter '="/sharing' '="/immich/sharing';
sub_filter '="/shared-links' '="/immich/shared-links';
sub_filter '="/search' '="/immich/search';
sub_filter '="/map' '="/immich/map';
sub_filter '="/user-settings' '="/immich/user-settings';
sub_filter '="/memory' '="/immich/memory';
sub_filter '="/trash' '="/immich/trash';
sub_filter '="/partners' '="/immich/partners';
sub_filter '="/buy' '="/immich/buy';
sub_filter '="/auth' '="/immich/auth';
sub_filter '="/utilities' '="/immich/utilities';
sub_filter '="/folders' '="/immich/folders';
sub_filter '="/tags' '="/immich/tags';
sub_filter '="/locked' '="/immich/locked';
sub_filter 'basePath:"/api"' 'basePath:"/immich/api"';
sub_filter 'base: ""' 'base: "/immich"';
sub_filter 'baseUrl:"/api' 'baseUrl:"/immich/api';
sub_filter '"redirectUri":"/' '"redirectUri":"/immich/';
sub_filter 'service-worker.js' 'immich/service-worker.js';
sub_filter 'light_skeleton.png' 'immich/light_skeleton.png';
sub_filter "startsWith(`/_app/immutable`)" "startsWith(`/iimmich/_app/immutable`)";
sub_filter '"_app/immutable' '"immich/_app/immutable';
sub_filter '"/_app/immutable' '"/immich/_app/immutable';
sub_filter 'url(/_app/immutable' 'url(/immich/_app/immutable';
sub_filter '"href","/albums/"' '"href","/immich/albums/"'; # error?
nginx.ingress.kubernetes.io/proxy-body-size: 8192m
nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-max-temp-file-size: "0"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/websocket-services: prod-immich-server
creationTimestamp: "2025-09-07T15:42:58Z"
generation: 1
labels:
kustomize.toolkit.fluxcd.io/name: apps
kustomize.toolkit.fluxcd.io/namespace: flux-system
name: prod-immich-ingress
namespace: immich
resourceVersion: "165080218"
uid: 9381b7f3-cdcd-4f8a-8153-7ad539f2e3ba
spec:
ingressClassName: public
rules:
- http:
paths:
- backend:
service:
name: prod-immich-server
port:
number: 2283
path: /immich(/|$)(.*)
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 127.0.0.1
Does anyone have a config for Apache?
Edit: Never mind, switched to using a subdomain.