# varnish vcl generator

[![Build Status](https://travis-ci.org/vicanso/varnish-generator.svg?branch=master)](https://travis-ci.org/vicanso/varnish-generator)
[![Coverage Status](https://img.shields.io/coveralls/vicanso/varnish-generator/master.svg?style=flat)](https://coveralls.io/r/vicanso/varnish-generator?branch=master)
[![npm](http://img.shields.io/npm/v/varnish-generator.svg?style=flat-square)](https://www.npmjs.org/package/varnish-generator)
[![Github Releases](https://img.shields.io/npm/dm/varnish-generator.svg?style=flat-square)](https://github.com/vicanso/varnish-generator)

Have a try [http://aslant.site/varnish-generator/](http://aslant.site/varnish-generator/)!

## Installation

```bash
$ npm install varnish-generator -g
```

## RUN

```bash
varnish-generator -c ./examples/config.json -t ./examples/default.vcl
```

### varnishConfig

- `name` The varnish instance's name

- `varnish` The varnish version, support `'4'` and `'5'`, default is `'5'`

- `stale` The seconds of stale, default is 3

- `version` The vcl version , default is `new Date().toISOString()`

- `timeout` The timeout setting for all directors

  - `connect` The connect timeout, default is `2`

  - `firstByte` The firstByte timeout, default is `5`

  - `betweenBytes` The betweenBytes timeout, default is `2`
- `urlPassList` The url match(RegExp) the setting will be pass

- `hisForPassTTL` The hit for pass ttl

- `hash` The hash setting

- `directors` Director list, Array

  - `name` The director's name

  - `prefix` The prefix of the url for the director, optional

  - `host` The host for the director, optional

  - `type` The algorithm of load balance, it can be 'fallback', 'hash', 'random', 'round_robin'. The default is 'round_robin'

  - `timeout` The director timeout setting, if not set , it will be use the global timeout setting
    - `connect` The connect timeout

    - `firstByte` The firstByte timeout

    - `betweenBytes` The betweenBytes timeout

  - `backends` The backend list, Array

    - `ip` The ip of backend

    - `port` The port of backend

    - `weight` The weight of backend, it's used for `random` and `hash`

```json
{
  "name": "varnish-test",
  "stale": 2,
  "varnish": "4",
  "timeout": {
    "connect": 1,
    "firstByte": 2,
    "betweenBytes": 2
  },
  "urlPassList": [
    "cache-control=no-cache"
  ],
  "hisForPassTTL": 300,
  "hash": [
    "req.url",
    [
      "req.http.host",
      "server.ip"
    ]
  ],
  "directors": [
    {
      "name": "timtam",
      "prefix": "/timtam",
      "type": "fallback",
      "timeout": {
        "connect": 1,
        "firstByte": 1,
        "betweenBytes": 1
      },
      "backends": [
        {
          "ip": "127.0.0.1",
          "port": 3000
        },
        {
          "ip": "127.0.0.1",
          "port": 3010
        }
      ]
    },
    {
      "name": "dcharts",
      "prefix": "/dcharts",
      "host": "dcharts.com",
      "type": "hash",
      "hashKey": "req.http.cookie",
      "backends": [
        {
          "ip": "127.0.0.1",
          "port": 3020,
          "weight": 5
        },
        {
          "ip": "127.0.0.1",
          "port": 3030,
          "weight": 3
        }
      ]
    },
    {
      "name": "vicanso",
      "host": "vicanso.com",
      "type": "random",
      "backends": [
        {
          "ip": "127.0.0.1",
          "port": 3040,
          "weight": 10
        },
        {
          "ip": "127.0.0.1",
          "port": 3050,
          "weight": 5
        }
      ]
    },
    {
      "name": "aslant",
      "backends": [
        {
          "ip": "127.0.0.1",
          "port": 8000
        }
      ]
    }
  ]
}

```

## How to use varnish better?

Please read my [suggestion](https://github.com/vicanso/articles/blob/master/varnish-suggestion.md) about using varnish.

## How the cache of varnish is created?

![](./assets/cache_req_fsm.png)

## How to run

varnishd -f ./default.vcl -p default_ttl=0 -p default_grace=1800 -p default_keep=10 -a :8001 -F

## Using docker

```
docker pull vicanso/varnish

docker run -v $HOME/default.vcl:/etc/varnish/default.vcl -p 8001:80 -d --restart=always vicanso/varnish
```

## License

MIT
