mirror of
https://github.com/open-webui/docs.git
synced 2026-03-26 13:18:42 +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`
|
||||
|
||||
#### 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
|
||||
|
||||
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>
|
||||
|
||||
|
||||
## 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
|
||||
|
||||
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-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
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_cache off;
|
||||
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
|
||||
|
||||
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;
|
||||
|
||||
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";
|
||||
}
|
||||
|
||||
@@ -156,7 +156,11 @@ http {
|
||||
proxy_buffering off;
|
||||
proxy_cache off;
|
||||
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";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user