November 03, 2012 12:16AM
Hello, I'm hosting a group of Wordpress blogs with about 200k visits and millions of hits per day. MySql + PHP live in a server (beefy VPS) and I placed a reverse proxy in front of it to cache most of the requests.

Now I want to offload all the static files to a third server, taking advantage of a feature of common Wordpress cache plugins, that rewrites static file URLs for origin-pull CDN services. This way, an original URL is rewritten as and this server requests the file form the original server, caches it and then serves it directly, for the duration of the 1st server's Expires header/directive.

I thought it would be easy to use the proxy_* features, but I'm hitting a wall and I can't find an applicable tutorial/article anywhere. Would somebody have any advice on how to do this? This is the basic behavior I'm after:
- Client requests static file
- looks for the file in its cache
- If the cache has it, check original or revalidate according with original headers (this is internal, I know).
- If the cache doesn't have it, request it from, cache it and serve it.
- Preferably, allow for this to be done for many sites/domains, acting as a CDN server for many sites.

This is my conf:
The cache zones in otherwise default nginx.conf and before including conf.d/*.conf (I'm on CentOS 6.3 with nginx 1.0.15 from EPEL)

proxy_cache_path /var/www/cache/images levels=1:2
max_size=10g inactive=3d;

proxy_cache_path /var/www/cache/scripts levels=1:2
max_size=10g inactive=3d;

proxy_cache_path /var/www/cache/pages levels=1:2
max_size=10g inactive=3d;

And this is the individual server config on conf.d/server1.conf

upstream {
server 333.333.333.333;

server {
listen 80;
access_log off;
# Set proxy headers for the passthrough
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# Let the Set-Cookie and Cache-Control headers through.
proxy_pass_header Set-Cookie;
proxy_pass_header Cache-Control;
proxy_pass_header Expires;

# Fallback to stale cache on certain errors.
# 503 is deliberately missing, if we're down for maintenance
# we want the page to display.
proxy_cache_use_stale error

# Set the proxy cache key
set $cache_key $scheme$host$uri$is_args$args;

location / {
proxy_pass http://backend_$host;
proxy_cache pages;
proxy_cache_key $cache_key;
proxy_cache_valid 15m; # 200, 301 and 302 will be cached.
# 2 rules to dedicate the no caching rule for logged in users.
# proxy_cache_bypass $wordpress_auth; # Do not cache the response.
# proxy_no_cache $wordpress_auth; # Do not serve response from cache.
add_header X-Cache $upstream_cache_status;

location ~* \.(png|jpg|jpeg|gif|ico|swf|flv|mov|mpg|mp3)$ {
expires max;
log_not_found off;
proxy_pass http://backend_$host;
proxy_cache images;
proxy_cache_key $cache_key;

location ~* \.(css|js|html|htm)$ {
expires 7d;
log_not_found off;
proxy_pass http://backend_$host;
proxy_cache scripts;
proxy_cache_key $cache_key;

With this configuration, whenever I call a static file such as I end up being redirected to I've tried many things, like setting the Host header to various values or adding $uri to the end of the proxy_pass directives, to no avail. One thing to notice is that the 333.333.333.333 server only responds to, not

Do I need a root directive in server1.conf?

I'm running in circles, any help will be much appreciated.

Thanks in advance,
Cachito Espinoza
Subject Author Posted

Trying to configure an origin pull CDN-like reverse proxy

cachito November 03, 2012 12:16AM

Re: Trying to configure an origin pull CDN-like reverse proxy

Francis Daly November 03, 2012 05:46AM

Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 76
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 254 on July 05, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready