Nginx Cache on Ubuntu
Environment
- OS: Ubuntu 22.04.3
 - Nginx: 1.18.0
 
Configuration
I think it is better to keep nginx.conf as much original as possible, and to make a dedicated configuration file for cache.
sudo vi /etc/nginx/conf.d/cache.conf
And the content of cache.conf shall be:
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=mycache:10m inactive=60m use_temp_path=off;
Usually we save a site configuration under /etc/nginx/sites-available and make a symbolic file under /etc/nginx/sites-enabled. Open your site configuration with:
sudo vi /etc/nginx/sites-available/yoursite
The content of that configuration file shall be:
server {
	location / {
		…
		proxy_cache mycache;
	}
	# Any extension you want to cache
	location ~* \.(css|jpg|jpeg|js|json|otf|png|svg|webp)$ {
		add_header Cache-Control "public, max-age=2592000";
	}
}
The value of proxy_cache must match the keys_zone value defined in nginx.conf.
In the configuration just above, the max-age is 2592000 seconds, that is 30 days. You can also add Cache-Control header in other way:
location ~* \.(css|jpg|jpeg|js|json|otf|png|svg|webp)$ {
		expires 30d; # e.x. 1d, 1M, 1y
		add_header Cache-Control "public, no-transform";
	}
Cache Directory
Create a directory for cache you defined in nginx.conf for proxy_cache_path and modify ownership:
sudo mkdir /var/lib/nginx/cache 
sudo chown -R www-data:root /var/lib/nginx/cache
sudo chmod -R 700 /var/lib/nginx/cache
The owner user of /var/lib/nginx/cache must match user value in nginx.conf.
When we check the ownership of /var/lib/nginx, it shall be something as follows:
drwx------  2 www-data root 4096 Feb  5 19:03 body
drwx------  2 www-data root 4096 Feb  6 16:25 cache
drwx------  2 www-data root 4096 Jul 27  2021 fastcgi
drwx------ 12 www-data root 4096 Mar  8  2022 proxy
drwx------  2 www-data root 4096 Jul 27  2021 scgi
drwx------  2 www-data root 4096 Jul 27  2021 uwsgi
Test Config
Run Nginx test command:
sudo nginx -t
If the configuration is OK, the output will be:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Restart Nginx
Restart Nginx so that the modification is effective:
sudo service nginx restart
Ensure if you can access to your web application.