Skip to content

Instantly share code, notes, and snippets.

Star You must be signed in to star a gist
Save harshavardhana/f05b60fe6f96803743f38bea4b565bbf to your computer and use it in GitHub Desktop.
How to configure static website using Nginx with MinIO ?

How to configure static website using Nginx with MinIO ?

1. Install nginx

2. Install minio

3. Install mc client

4. Create a bucket:

$ mc mb myminio/static
Bucket created successfully ‘myminio/static’.

5. Make bucket public to host/access static content.

$ mc anonymous download myminio/static
Access permission for ‘myminio/static’ is set to ‘download’

6. Upload a sample static HTML site to minio bucket, in my case i used example: http://www.oswd.org/user/profile/id/12362/

$ mc cp -r terrafirma/ myminio/static
...ma/readme.txt:  39.37 KB / 39.37 KB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 100.00% 31.94 KB/s 1s

Note: this is how my bucket content appears to me currently.

$ mc ls myminio/static
[2017-03-22 18:20:52 IST] 4.7KiB default.css
[2017-03-22 18:20:54 IST] 5.4KiB index.html
[2017-03-22 18:20:54 IST]   612B readme.txt
[2017-03-22 18:24:03 IST]     0B images/

7. Configure Nginx as proxy to serve static pages from public bucket name static from Minio.

Remove default configuration and replace it with the below. Please change as per your local setup.

$ cat /etc/nginx/sites-enabled/default 
server {
 listen 80;
 server_name localhost;
 location / {
   rewrite ^/$ /static/index.html break;
   proxy_set_header Host $http_host;
   proxy_pass http://localhost:9000/static/;
 }
}

$ sudo service nginx reload

8. Open your browser and type http://localhost

@gatspy
Copy link

gatspy commented Mar 16, 2019

step 5, is very important...

@0bach0
Copy link

0bach0 commented Jun 11, 2019

Hi @harshavardhana,

The error page of minio will be served as default; do you know about how to specific a file to be a custom error page (like 404).

@harshavardhana
Copy link
Author

@bachnxhedspi - you may consult nginx docs for that

@Gordonei
Copy link

Gordonei commented Sep 2, 2019

Just a note on a subtly I encountered while getting this up and running - MIME type of the file in Minio matters.

By default, the minio client does the right thing (i.e. as described in these instructions), but if you're uploading via something like the Python client, it defaults to everything being application/octet-stream. If you have a web page you want to serve up, MIME type for that file will need to be text/html, CSS files will need to be text/css, etc.

@harshavardhana
Copy link
Author

If you use a tool like mc tries to set mime type for most common types appropriately..

@zulrang
Copy link

zulrang commented Dec 8, 2019

Step 5 needs to be mc policy set download myminio/static

@wenerme
Copy link

wenerme commented Dec 10, 2019

if end with / should use index.html, this is my multi site conf

location ~ /$ {
  proxy_pass https://myoss/sites/$http_host$request_uri/index.html;
  # paste below oss option here
}

  location / {
      proxy_hide_header     x-amz-id-2;
      proxy_hide_header     x-amz-meta-etag;
      proxy_hide_header     x-amz-request-id;
      proxy_hide_header     x-amz-meta-server-side-encryption;
      proxy_hide_header     x-amz-server-side-encryption;
      proxy_hide_header     Set-Cookie;
      proxy_ignore_headers  Set-Cookie;

      proxy_pass https://myoss/sites/$http_host$request_uri;
      proxy_redirect     off;
      break;
  }

@angelbarrera92
Copy link

@leojonathanoh
Copy link

Small typo on step 5.

@sxueck
Copy link

sxueck commented Jul 16, 2022

If you are like me and have an index.html under each directory, you can refer to my configuration

server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name             www.site.com;

    # SSL
    ssl_certificate         /etc/ssl/self/wildcard.site.crt;
    ssl_certificate_key     /etc/ssl/self/wildcard.site.pri.csr;
    ssl_trusted_certificate /etc/ssl/self/wildcard.site.chain.ca;

    location / {
        rewrite /$ ${request_uri}index.html last;
        proxy_pass http://127.0.0.1:9000/site/;
	proxy_redirect     off;
    }
    
    include conf.d/security.conf;
}

server {
    listen      80;
    listen      [::]:80;
    server_name www.site.com;

    location / {
        return 301 https://www.site.com$request_uri;
    }
}

@modbender
Copy link

It is
mc anonymous set download myminio/static

@vincib
Copy link

vincib commented Nov 25, 2022

Hi @harshavardhana,

The error page of minio will be served as default; do you know about how to specific a file to be a custom error page (like 404).

add this:

proxy_intercept_errors on;
error_page      400 401 402 403 404 500 501 502 503 504 /static/yourerrorpage.html;

you may also replace /static/errorpage.html by a @namedlocation and use a specific location to handle those.

@almereyda
Copy link

There is now also an officially supported Nginx example with S3 backend upstream available at:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment