Skip to content

Instantly share code, notes, and snippets.

@dduvnjak
Last active November 12, 2020 10:21
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dduvnjak/6195546 to your computer and use it in GitHub Desktop.
Save dduvnjak/6195546 to your computer and use it in GitHub Desktop.

file directory layout:

|- index.html
|- manifest.appcache
|- static/
|  |- 00786df954089f14eaca25061f454957.svg
|  `- bb796e8931c52593d86ec07a0246e1e6.css
|_ polyfiller/
   `- shims/
      |- combos/
      |- styles/
      |- swf/
      `- es5.js

static/ and polyfiller/ are deeply nested folders of assets

nginx requirements for serving this structure:

  • index.html and manifest.appcache MUST NEVER be cached. maybe setting a header like Cache-Control: public, no-cache,no-store
  • all files must be served with relevant MIME types set. I think nginx will handle this by default
  • gzip encode response for all above resources when requested
  • every file under static/ should have a cache expiration a year in the future
  • every file under polyfiller/ should have a cache expiration of 3 days
  • any requests to non-existent files will return index.html with an HTTP 200 (e.g., requesting http://mysite.com/foo should return the contents of index.html with a 200.)
  • any GET requests that begin with /2009/ should be routed to another domain with the same path (e.g., a request to /2009/12/13/mypage.html redirects to http://sample.foo.com/2009/12/13/mypage.html)

here is a base nginx file I was starting to work on. This isn't very good, and doesn't meet many of the above criteria. Feel free to work off this or start fresh.

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    
    gzip  on;

    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        root html;

        location /static/ {
            autoindex on;
            expires 365;
        }

        location /polyfiller/ {
            expires 7;
            autoindex on;
        }

        location / {
            index  index.html index.htm;
        }

        location /appcache.manifest {
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
# this is the Ubuntu location
include /etc/nginx/mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_min_length 0;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript text/x-js text/cache-manifest;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
root /usr/share/nginx/www;
location /static/ {
autoindex on;
expires 365d;
}
location /polyfiller/ {
expires 7d;
autoindex on;
}
location / {
index index.html index.htm;
}
location /index.html {
add_header Cache-Control public;
add_header Cache-Control no-store;
add_header Cache-Control no-cache;
}
location /manifest.appcache {
add_header Cache-Control public;
add_header Cache-Control no-store;
add_header Cache-Control no-cache;
}
error_page 404 = @notfound;
location @notfound {
try_files /index.html =200;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ /2009/?(.*)$ {
rewrite ^ http://sample.foo.com$request_uri? permanent;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment