mirror of
https://github.com/open-webui/docs.git
synced 2026-03-27 13:28:37 +07:00
nginx
This commit is contained in:
@@ -176,8 +176,48 @@ Defines the number of worker threads available for handling requests.
|
|||||||
|
|
||||||
- **Env Var**: `THREAD_POOL_SIZE=2000`
|
- **Env Var**: `THREAD_POOL_SIZE=2000`
|
||||||
|
|
||||||
|
#### AIOHTTP Client Timeouts
|
||||||
|
Long LLM completions can exceed default HTTP client timeouts. Configure these to prevent requests being cut off mid-response:
|
||||||
|
|
||||||
|
- **Env Var**: `AIOHTTP_CLIENT_TIMEOUT=1800` (30 minutes for completions)
|
||||||
|
- **Env Var**: `AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST=15` (shorter for model listing)
|
||||||
|
- **Env Var**: `AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST=15`
|
||||||
|
|
||||||
|
#### Container Resource Limits
|
||||||
|
For Docker deployments, ensure adequate resource allocation:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 8G # Adjust based on usage
|
||||||
|
cpus: '4.0'
|
||||||
|
reservations:
|
||||||
|
memory: 4G
|
||||||
|
cpus: '2.0'
|
||||||
|
|
||||||
|
# Increase file descriptor limits
|
||||||
|
ulimits:
|
||||||
|
nofile:
|
||||||
|
soft: 65536
|
||||||
|
hard: 65536
|
||||||
|
```
|
||||||
|
|
||||||
|
**Diagnosis commands:**
|
||||||
|
```bash
|
||||||
|
# Check container resource usage
|
||||||
|
docker stats openwebui --no-stream
|
||||||
|
|
||||||
|
# Check connection states
|
||||||
|
docker exec openwebui netstat -an | grep -E "ESTABLISHED|TIME_WAIT|CLOSE_WAIT" | sort | uniq -c
|
||||||
|
|
||||||
|
# Check open file descriptors
|
||||||
|
docker exec openwebui ls -la /proc/1/fd | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
## ☁️ Cloud Infrastructure Latency
|
## ☁️ Cloud Infrastructure Latency
|
||||||
|
|
||||||
When deploying Open WebUI in cloud Kubernetes environments (AKS, EKS, GKE), you may notice significant performance degradation compared to local Kubernetes (Rancher Desktop, kind, Minikube) or bare-metal deployments—even with identical resource allocations. This is almost always caused by **latency** in the underlying infrastructure.
|
When deploying Open WebUI in cloud Kubernetes environments (AKS, EKS, GKE), you may notice significant performance degradation compared to local Kubernetes (Rancher Desktop, kind, Minikube) or bare-metal deployments—even with identical resource allocations. This is almost always caused by **latency** in the underlying infrastructure.
|
||||||
|
|||||||
@@ -89,6 +89,151 @@ import Windows from '../tab-nginx/Windows.md';
|
|||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
|
|
||||||
|
## Complete Optimized NGINX Configuration
|
||||||
|
|
||||||
|
This section provides a production-ready NGINX configuration optimized for Open WebUI streaming, WebSocket connections, and high-concurrency deployments.
|
||||||
|
|
||||||
|
### Upstream Configuration
|
||||||
|
|
||||||
|
Define an upstream with keepalive connections to reduce connection setup overhead:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
upstream openwebui {
|
||||||
|
server 127.0.0.1:3000;
|
||||||
|
keepalive 128; # Persistent connections
|
||||||
|
keepalive_timeout 1800s; # 30 minutes
|
||||||
|
keepalive_requests 10000;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Timeout Configuration
|
||||||
|
|
||||||
|
Long-running LLM completions require extended timeouts:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
location /api/ {
|
||||||
|
proxy_connect_timeout 1800; # 30 minutes
|
||||||
|
proxy_send_timeout 1800;
|
||||||
|
proxy_read_timeout 1800;
|
||||||
|
}
|
||||||
|
|
||||||
|
# WebSocket connections need even longer timeouts
|
||||||
|
location ~ ^/(ws/|socket\.io/) {
|
||||||
|
proxy_connect_timeout 86400; # 24 hours
|
||||||
|
proxy_send_timeout 86400;
|
||||||
|
proxy_read_timeout 86400;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Header and Body Size Limits
|
||||||
|
|
||||||
|
Prevent errors with large requests or OAuth tokens:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
# In http {} or server {} block
|
||||||
|
client_max_body_size 100M; # Large file uploads
|
||||||
|
proxy_buffer_size 128k; # Large headers (OAuth tokens)
|
||||||
|
proxy_buffers 4 256k;
|
||||||
|
proxy_busy_buffers_size 256k;
|
||||||
|
large_client_header_buffers 4 32k;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common Streaming Mistakes
|
||||||
|
|
||||||
|
| Setting | Impact on Streaming |
|
||||||
|
|---------|---------------------|
|
||||||
|
| `gzip on` with `application/json` | 🔴 Buffers for compression |
|
||||||
|
| `proxy_buffering on` | 🔴 Buffers entire response |
|
||||||
|
| `tcp_nopush on` | 🔴 Waits for full packets |
|
||||||
|
| `chunked_transfer_encoding on` | 🟡 Can break SSE |
|
||||||
|
| `proxy_cache` enabled on `/api/` | 🟡 Adds overhead |
|
||||||
|
|
||||||
|
### Full Example Configuration
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
upstream openwebui {
|
||||||
|
server 127.0.0.1:3000;
|
||||||
|
keepalive 128;
|
||||||
|
keepalive_timeout 1800s;
|
||||||
|
keepalive_requests 10000;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name your-domain.com;
|
||||||
|
|
||||||
|
# SSL configuration...
|
||||||
|
|
||||||
|
# Compression - EXCLUDE streaming content types
|
||||||
|
gzip on;
|
||||||
|
gzip_types text/plain text/css application/javascript image/svg+xml;
|
||||||
|
# DO NOT include: application/json, text/event-stream
|
||||||
|
|
||||||
|
# API endpoints - streaming optimized
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://openwebui;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
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;
|
||||||
|
|
||||||
|
# CRITICAL: Disable all buffering for streaming
|
||||||
|
gzip off;
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
proxy_cache off;
|
||||||
|
tcp_nodelay on;
|
||||||
|
add_header X-Accel-Buffering "no" always;
|
||||||
|
add_header Cache-Control "no-store" always;
|
||||||
|
|
||||||
|
# Extended timeouts for LLM completions
|
||||||
|
proxy_connect_timeout 1800;
|
||||||
|
proxy_send_timeout 1800;
|
||||||
|
proxy_read_timeout 1800;
|
||||||
|
}
|
||||||
|
|
||||||
|
# WebSocket endpoints
|
||||||
|
location ~ ^/(ws/|socket\.io/) {
|
||||||
|
proxy_pass http://openwebui;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
gzip off;
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_cache off;
|
||||||
|
|
||||||
|
# 24-hour timeout for persistent connections
|
||||||
|
proxy_connect_timeout 86400;
|
||||||
|
proxy_send_timeout 86400;
|
||||||
|
proxy_read_timeout 86400;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Static assets - CAN buffer and cache
|
||||||
|
location /static/ {
|
||||||
|
proxy_pass http://openwebui;
|
||||||
|
proxy_buffering on;
|
||||||
|
proxy_cache_valid 200 7d;
|
||||||
|
add_header Cache-Control "public, max-age=604800, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Default location
|
||||||
|
location / {
|
||||||
|
proxy_pass http://openwebui;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Caching Configuration
|
## Caching Configuration
|
||||||
|
|
||||||
Proper caching significantly improves Open WebUI performance by reducing backend load and speeding up page loads. This section provides guidance for advanced users who want to implement server-side and client-side caching.
|
Proper caching significantly improves Open WebUI performance by reducing backend load and speeding up page loads. This section provides guidance for advanced users who want to implement server-side and client-side caching.
|
||||||
|
|||||||
@@ -270,7 +270,12 @@ With the certificate saved in your `ssl` directory, you can now update the Nginx
|
|||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
proxy_read_timeout 10m;
|
|
||||||
|
# Extended timeout for long LLM completions (30 minutes)
|
||||||
|
proxy_read_timeout 1800;
|
||||||
|
proxy_send_timeout 1800;
|
||||||
|
proxy_connect_timeout 1800;
|
||||||
|
|
||||||
proxy_buffering off;
|
proxy_buffering off;
|
||||||
proxy_cache off;
|
proxy_cache off;
|
||||||
client_max_body_size 20M;
|
client_max_body_size 20M;
|
||||||
|
|||||||
@@ -94,6 +94,20 @@ Without this, Nginx re-chunks SSE streams, breaking markdown formatting (visible
|
|||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
:::tip Extended Timeouts for Long Completions
|
||||||
|
|
||||||
|
Long LLM completions (30+ minutes for complex tasks) may exceed the default 60-second timeout. Add these directives in the **Advanced** tab → **Custom Nginx Configuration**:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
proxy_read_timeout 1800;
|
||||||
|
proxy_send_timeout 1800;
|
||||||
|
proxy_connect_timeout 1800;
|
||||||
|
```
|
||||||
|
|
||||||
|
This sets a 30-minute timeout. Adjust as needed for your use case.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
:::tip Caching Best Practice
|
:::tip Caching Best Practice
|
||||||
|
|
||||||
While Nginx Proxy Manager handles most configuration automatically, be aware that:
|
While Nginx Proxy Manager handles most configuration automatically, be aware that:
|
||||||
|
|||||||
@@ -83,7 +83,11 @@ Using self-signed certificates is suitable for development or internal use where
|
|||||||
proxy_cache off;
|
proxy_cache off;
|
||||||
|
|
||||||
client_max_body_size 20M;
|
client_max_body_size 20M;
|
||||||
proxy_read_timeout 10m;
|
|
||||||
|
# Extended timeout for long LLM completions (30 minutes)
|
||||||
|
proxy_read_timeout 1800;
|
||||||
|
proxy_send_timeout 1800;
|
||||||
|
proxy_connect_timeout 1800;
|
||||||
|
|
||||||
add_header Cache-Control "public, max-age=300, must-revalidate";
|
add_header Cache-Control "public, max-age=300, must-revalidate";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,7 +156,11 @@ http {
|
|||||||
proxy_buffering off;
|
proxy_buffering off;
|
||||||
proxy_cache off;
|
proxy_cache off;
|
||||||
client_max_body_size 20M;
|
client_max_body_size 20M;
|
||||||
proxy_read_timeout 10m;
|
|
||||||
|
# Extended timeout for long LLM completions (30 minutes)
|
||||||
|
proxy_read_timeout 1800;
|
||||||
|
proxy_send_timeout 1800;
|
||||||
|
proxy_connect_timeout 1800;
|
||||||
|
|
||||||
add_header Cache-Control "public, max-age=300, must-revalidate";
|
add_header Cache-Control "public, max-age=300, must-revalidate";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user