Configure Nginx as Reverse Proxy for Odoo 18: Complete Guide

Running Odoo 18 behind Nginx reverse proxy is a production best practice that provides better performance, security, and flexibility. This guide will walk you through setting up Nginx as a reverse proxy for your Odoo 18 installation on Ubuntu 24.04 LTS.

Why Use Nginx with Odoo?

Using Nginx as a reverse proxy for Odoo offers several advantages:

  • Better Performance: Nginx efficiently handles static files and caching
  • Security: Hide Odoo's direct port access from the internet
  • SSL Termination: Easier HTTPS configuration
  • Load Balancing: Distribute traffic across multiple Odoo instances
  • Additional Features: URL rewriting, compression, rate limiting
  • Professional Setup: Access Odoo via domain name without port numbers

Prerequisites

Before starting, ensure you have:

  • Odoo 18 installed and running (see our installation guide)
  • Ubuntu 24.04 LTS server
  • A domain name pointing to your server's IP
  • Root or sudo access
  • Odoo running on default port 8069

Step 1: Install Nginx

First, install Nginx on your Ubuntu 24.04 server:

sudo apt update
sudo apt install nginx -y

Verify Nginx is running:

sudo systemctl status nginx

Step 2: Configure Odoo for Proxy Mode

Before configuring Nginx, update your Odoo configuration to work properly behind a proxy.

Edit your Odoo configuration file:

sudo nano /etc/odoo18/odoo.conf

Add or modify these settings:

[options]
; ... existing configuration ...

; Proxy mode
proxy_mode = True

; Optional: Bind Odoo to localhost only (more secure)
xmlrpc_interface = 127.0.0.1
netrpc_interface = 127.0.0.1

Restart Odoo to apply changes:

sudo systemctl restart odoo18

Step 3: Create Nginx Configuration for Odoo

Create a new Nginx configuration file:

sudo nano /etc/nginx/sites-available/odoo18

Add the following configuration:

# Odoo server upstream
upstream odoo {
    server 127.0.0.1:8069;
}

upstream odoochat {
    server 127.0.0.1:8072;
}

# HTTP -> HTTPS redirect (will be used after SSL setup)
server {
    listen 80;
    server_name your-domain.com;
    
    # Redirect all HTTP traffic to HTTPS
    # Uncomment the following line after SSL is configured
    # return 301 https://$server_name$request_uri;
    
    # For now, proxy to Odoo
    include /etc/nginx/snippets/odoo-proxy.conf;
}

# Main server block (will be HTTPS after SSL setup)
# server {
#     listen 443 ssl http2;
#     server_name your-domain.com;
#     
#     # SSL configuration will go here
#     
#     include /etc/nginx/snippets/odoo-proxy.conf;
# }

Step 4: Create Reusable Proxy Configuration

Create a snippet file for Odoo proxy settings:

sudo nano /etc/nginx/snippets/odoo-proxy.conf

Add the following content:

# Proxy headers
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;

# Proxy settings
proxy_connect_timeout 720s;
proxy_send_timeout 720s;
proxy_read_timeout 720s;
proxy_buffering off;

# File upload size
client_max_body_size 50M;

# Enable gzip compression
gzip on;
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
gzip_vary on;

# Logging
access_log /var/log/nginx/odoo18-access.log;
error_log /var/log/nginx/odoo18-error.log;

# Redirect requests to Odoo backend
location / {
    proxy_pass http://odoo;
    proxy_redirect off;
}

# Handle longpolling requests
location /longpolling {
    proxy_pass http://odoochat;
}

# Cache static files
location ~* /web/static/ {
    proxy_cache_valid 200 90m;
    proxy_buffering on;
    expires 864000;
    proxy_pass http://odoo;
    
    # Cache headers
    add_header Cache-Control "public, immutable";
    add_header X-Static-Cache "HIT";
}

# Common static file extensions
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|doc|docx|xls|xlsx)$ {
    proxy_cache_valid 200 90m;
    proxy_buffering on;
    expires 30d;
    proxy_pass http://odoo;
    
    add_header Cache-Control "public";
}

# Security headers
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";

Step 5: Enable the Nginx Site

Create a symbolic link to enable the site:

sudo ln -s /etc/nginx/sites-available/odoo18 /etc/nginx/sites-enabled/

Remove the default Nginx site if it exists:

sudo rm /etc/nginx/sites-enabled/default

Step 6: Test and Reload Nginx

Test the Nginx configuration:

sudo nginx -t

If the test passes, reload Nginx:

sudo systemctl reload nginx

Step 7: Configure Firewall

Update UFW firewall rules:

# Allow Nginx Full (HTTP and HTTPS)
sudo ufw allow 'Nginx Full'

# Remove direct Odoo port access (optional but recommended)
sudo ufw delete allow 8069
sudo ufw delete allow 8072

# Reload firewall
sudo ufw reload

Step 8: Test Your Configuration

Access your Odoo instance through Nginx:

http://your-domain.com

You should see your Odoo login page without the port number.

Advanced Nginx Configuration Options

1. Enable Nginx Caching

For better performance, create a cache directory:

sudo mkdir -p /var/cache/nginx/odoo
sudo chown www-data:www-data /var/cache/nginx/odoo

Add cache configuration to your Nginx config:

# Add at the top of your configuration file
proxy_cache_path /var/cache/nginx/odoo levels=1:2 keys_zone=odoo_cache:10m max_size=1g inactive=60m use_temp_path=off;

# In your server block
location ~* /web/static/ {
    proxy_cache odoo_cache;
    proxy_cache_valid 200 90m;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    add_header X-Cache-Status $upstream_cache_status;
    proxy_pass http://odoo;
}

2. Rate Limiting

Protect against brute force attacks:

# Add at the top of your configuration
limit_req_zone $binary_remote_addr zone=odoo_limit:10m rate=10r/s;

# In your location blocks
location /web/login {
    limit_req zone=odoo_limit burst=5 nodelay;
    proxy_pass http://odoo;
}

3. Load Balancing Multiple Odoo Instances

If running multiple Odoo workers:

upstream odoo {
    least_conn;
    server 127.0.0.1:8069 weight=1;
    server 127.0.0.1:8070 weight=1;
    server 127.0.0.1:8071 weight=1;
}

4. WebSocket Support

For real-time features, ensure WebSocket support:

location /websocket {
    proxy_pass http://odoochat;
    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;
}

Monitoring and Logs

View Nginx Access Logs

sudo tail -f /var/log/nginx/odoo18-access.log

View Nginx Error Logs

sudo tail -f /var/log/nginx/odoo18-error.log

Monitor Nginx Status

Enable Nginx status page:

server {
    listen 127.0.0.1:8080;
    server_name localhost;
    
    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}

Troubleshooting Common Issues

Issue 1: 502 Bad Gateway

This usually means Odoo isn't running or Nginx can't connect:

# Check if Odoo is running
sudo systemctl status odoo18

# Check if Odoo is listening on the correct port
sudo netstat -tuln | grep 8069

# Check Nginx error logs
sudo tail -20 /var/log/nginx/odoo18-error.log

Issue 2: 504 Gateway Timeout

Increase timeout values in your proxy configuration:

proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;

Issue 3: Static Files Not Loading

Ensure the static file location matches your Odoo installation:

# Find where Odoo static files are located
sudo find /opt/odoo18 -name "static" -type d

Issue 4: Large File Upload Fails

Increase client body size in both Nginx and Odoo:

# In Nginx
client_max_body_size 100M;
# In odoo.conf
limit_request = 104857600

Performance Tuning

1. Enable HTTP/2

After SSL is configured, enable HTTP/2:

listen 443 ssl http2;

2. Optimize Worker Processes

In /etc/nginx/nginx.conf:

worker_processes auto;
worker_connections 2048;
use epoll;
multi_accept on;

3. Enable Compression

gzip on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_proxied any;
gzip_vary on;
gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/x-javascript
    application/xml
    application/xml+rss
    text/css
    text/javascript
    text/plain
    text/xml;

Security Recommendations

1. Hide Nginx Version

In /etc/nginx/nginx.conf:

server_tokens off;

2. Implement Security Headers

Add to your server block:

# Security headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: blob: https:; font-src 'self' data: https:;" always;

3. Block Unwanted User Agents

# Block bad bots
if ($http_user_agent ~* (crawler|spider|bot)) {
    return 403;
}

Next Steps

Now that Nginx is configured as a reverse proxy for Odoo:

  1. Implement SSL/TLS: Secure your connection with HTTPS (see our SSL guide)
  2. Set up Monitoring: Use tools like Prometheus or Zabbix
  3. Configure Backups: Implement automated backup solutions
  4. Optimize Performance: Fine-tune based on your usage patterns
  5. Set up Fail2ban: Protect against brute force attacks

Conclusion

You've successfully configured Nginx as a reverse proxy for Odoo 18! This setup provides a professional, secure, and performant way to serve your Odoo instance. The configuration handles static files efficiently, supports WebSocket connections for real-time features, and prepares your setup for SSL implementation.

Remember to:

  • Monitor your logs regularly
  • Keep both Nginx and Odoo updated
  • Test your configuration after any changes
  • Implement SSL as soon as possible

In our next guide, we'll cover implementing SSL certificates to secure your Odoo installation with HTTPS.

Last updated: July 2025 | Compatible with Odoo 18 and Nginx on Ubuntu 24.04 LTS

How to Install Odoo 18 on Ubuntu 24.04 LTS: Complete Guide