Nginx
1. Setup gzip and SSL certificate
Gzip will reduce the size of the data transmitted to and from the server, which will speed up your site
SSL certificate, encrypts data, the volume of encrypted data is also less, but the main plus is security
2. Setup longpolling port
Also you need to configure a separate port for long polling.
As practice shows, port separation also increases performance.
3. Enable cache static files
Caching nginx static files will noticeably speed up their delivery, since they will be taken directly from nginx. But be careful if you have image editing functions or other things that need to be changed along location.
Odoo
1. Enable workers not null
For start multiprocces mode, need set worker more then 1
2.Proxy mode
Also dont forgott set True proxy
Other speedup advice
1. Update Werkzeug version server (0.16.1 )
2. Buy NVME SSD
3. Server network connection to 1Gb/s
4. Use CDN
5. Keep Odoo updates
6. Lots of RAM
7.Configure and optimize the PostgreSQL service properly
8.Periodically start cron autovacum
9. Also check minify bundle assets (25%)
10. Also optimise images to webp link odoo webp
#user nobody;
worker_processes 4;
#pid logs/nginx.pid;
events {
worker_connections 2048;
}
http {
# позволяет использовать sendfile(). Это функци ОС, она копирует данные с диска сразу в кэш ОС
# и так как копирование происходит в ядре ОС, sendfile()
# более эффетивен чем read(), а затем write() (подробнее о sendfile()).
sendfile on;
# позволяет отправлять все заголовки одним пакетом, а не один за другим.
tcp_nopush on;
# Настройки кеша
proxy_cache_path /temp/cache # путь
levels=1:2 # количество уровней
keys_zone=stale_cache:10m # название:размер зоны, 1Мб ~ 8000 ключей (1 ключ - 1 запрос)
max_size=1g # размер данных кеша, при превышении удаляются наиболее старые
inactive=480m # время хранения запроса на диске с момента последнего обращения, независимо от Cache-Control
use_temp_path=off; # off - используем proxy_cache_path; on - используем proxy_temp_path, указанный в location
server_names_hash_bucket_size 64;
upstream odoosrv {
#server 127.0.0.1:8073 weight=1 fail_timeout=0;
server 127.0.0.1:8069 weight=1 fail_timeout=0;
}
upstream odoolong {
#server 127.0.0.1:8074 weight=1 fail_timeout=0;
server 127.0.0.1:8072 weight=1 fail_timeout=0;
}
#access_log logs/access.log main;
# устанавливает таймаут для заголовка и тела запроса соответственно. Установим их на таком же низком уровне.
client_body_timeout 12;
client_header_timeout 12;
# keepalive_timeout назначает таймаут для keep-alive соединения.
# Сервер будет закрывать соединения по истечению этого времени.
# Мы становим его малым, так как каждое соединение держит открытым файл.
keepalive_timeout 15;
# закрывает соединения для не отвечающих клиентов. Это позволит высвободить всю память, связанную с клиентом.
reset_timedout_connection on;
# устанавливает таймаут ответа клиенту. Этот таймаут не применяется ко всей передаче,
# а только между двумя последовательными операциями чтения.
# Если клиент не читал никаких данных для в это рвемя, то Nginx разрывает связь
send_timeout 10;
# common gzip
gzip on;
# gzip_static on;
gzip_disable "msie6";
gzip_vary on;
# позволяет или запрещает сжатие ответа на основе запроса/ответа. Мы установим его как any, чтобы сжимать и все запросы.
gzip_proxied any;
gzip_comp_level 6;
# минимальная версия HTTP-протокола запроса
#zgzip_http_version 1.1;
gzip_min_length 256;
gzip_types "*";
server {
listen 80;
server_name eurodoo.com www.eurodoo.com;
rewrite ^(.*) https://$host$1 permanent;
}
server {
listen 443 ssl default_server;
server_name eurodoo.com www.eurodoo.com;
client_max_body_size 1300M;
proxy_read_timeout 180s;
proxy_connect_timeout 180s;
proxy_send_timeout 180s;
proxy_cookie_path / "/; HTTPOnly; Secure";
large_client_header_buffers 4 64k;
ssl_certificate fullchain.pem;
ssl_certificate_key privkey.pem;
ssl_trusted_certificate chain.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
proxy_hide_header X-Frame-Options;
add_header Content-Security-Policy "default-src 'self';";
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
proxy_buffers 16 64k;
proxy_buffer_size 128k;
# Forward If-None-Match (which contains the ETag), so Odoo can decide
# to return a 304 instead of the content. Nginx would have returned a 304
# anyway, but we spare some traffic between odoo and nginx.
proxy_set_header If-None-Match $http_if_none_match;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header 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;
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
add_header X-Frame-Options "ALLOW-FROM https://eurodoo.com";
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header X-Frame-Options "ALLOW-FROM https://eurodoo.com";
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header X-Frame-Options "ALLOW-FROM https://eurodoo.com";
}
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
# proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
proxy_pass http://odoosrv;
proxy_redirect off;
}
location ~* ^/([^/]+/static/|web/(css|js)/|website/image/) {
proxy_cache stale_cache;
proxy_cache_valid 200 100m;
proxy_cache_valid any 1m;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating;
proxy_cache_background_update on;
proxy_cache_lock on;
proxy_buffering on;
proxy_cache_bypass $http_cache_control;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header X-Cache-Status $upstream_cache_status;
expires 30d;
proxy_pass http://odoosrv;
}
}
}
[options]
addons_path = YOUR_ADDONS_PATH
admin_passwd = YOUR_HASH_PASSWORD
bin_path = C:\Program Files\Odoo 14.0.20201101\thirdparty
csv_internal_sep = ,
data_dir = C:\Users\chlen\AppData\Local\OpenERP S.A\Odoo14
db_host = localhost
db_maxconn = 64
db_name = False
db_password = YOUR_DATABASE_PATH
db_port = 5432
db_sslmode = prefer
db_template = template0
db_user = DB_USER
dbfilter = ^DB_NAME*$
demo = {}
email_from = False
geoip_database = C:\usr\share\GeoIP\GeoLite2-City.mmdb
http_enable = True
http_interface =
http_port = 8069
import_partial =
limit_memory_hard = None
limit_memory_soft = None
limit_request = None
limit_time_cpu = None
limit_time_real = None
limit_time_real_cron = None
list_db = True
#log_db = False
#log_db_level = warning
#log_handler = :INFO
#log_level = info
#logfile = C:\Program Files\Odoo 14.0.20201101\server\odoo.log
longpolling_port = 8072
max_cron_threads = 2
osv_memory_age_limit = False
osv_memory_count_limit = False
pg_path = C:\Program Files\Odoo 14.0.20201101\PostgreSQL\bin
pidfile =
proxy_mode = True
reportgz = False
screencasts =
screenshots = C:\Users\chlen\AppData\Local\Temp\odoo_tests
server_wide_modules = base,web
smtp_password = False
smtp_port = 25
smtp_server = localhost
smtp_ssl = False
smtp_user = False
syslog = False
test_enable = False
test_file =
test_tags = None
transient_age_limit = 1.0
translate_modules = ['all']
unaccent = False
upgrade_path =
without_demo = False
workers = 4
shared_buffers = 3072MB #20% RAM effective_cache_size = 8192MB #50% RAM