# Install Grafana Behind reverse proxy

If the installation is done on a Host server then the following steps should be performed to setup grafana behind a reverse proxy.

### Installation steps

1. To let Grafana know how to render and redirect the links correctly, in the Grafana configuration file, change `server.domain` to the domain name that will be used,

```bash
[server]
domain = example.com
```

2\. Restart grafana to see the changes

3\. To serve grafana behind the sub path, such as [`http://example.com/grafana`](http://example.com/grafana)

Include the sub path at the end of the `root_url.`

Set `serve_from_sub_path` to `true.`

```
[server]
domain = example.com
root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/
serve_from_sub_path = true
```

4\. Next step is to configure NGINX.

### Configure NGINX

NGINX is a high performance load balancer, web server, and reverse proxy.

* In the NGINX configuration file inside `http` section, add the following:

```
// this is required for proxy Grafana Live WebSocket connections.
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

upstream grafana {
  server localhost:3000;
}

server {
  listen 80;
  root /usr/share/nginx/html;
  index index.html index.htm;

  location / {
    proxy_set_header Host $http_host;
    proxy_pass http://grafana;
  }

  # Proxy Grafana Live WebSocket connections.
  location /api/live/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Host $http_host;
    proxy_pass http://grafana;
  }
}
```

* Reload the NGINX configuration
* Navigate to port 80 on the machine NGINX is running on and the Grafana login page will appear.

{% hint style="info" %}
For Grafana Live which uses WebSocket connections, raise a Nginx [worker\_connections](https://nginx.org/en/docs/ngx_core_module.html#worker_connections) option which is 512 by default – which limits the number of possible concurrent connections with Grafana Live.
{% endhint %}

{% hint style="danger" %}
Also, be aware that the above configuration will work only when the **`proxy_pass`** value for **`location /`** is a literal string. If you are using a variable here, [read this GitHub issue](https://github.com/grafana/grafana/issues/18299) and there will be a need to add [an appropriate NGINX rewrite rule](https://www.nginx.com/blog/creating-nginx-rewrite-rules/).
{% endhint %}

To configure NGINX to serve Grafana under a *sub path*, update the `location` block:

```
// this is required to proxy Grafana Live WebSocket connections.
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

upstream grafana {
  server localhost:3000;
}

server {
  listen 80;
  root /usr/share/nginx/www;
  index index.html index.htm;

  location /grafana/ {
    rewrite  ^/grafana/(.*)  /$1 break;
    proxy_set_header Host $http_host; 
    proxy_pass http://grafana;
  }

  # Proxy Grafana Live WebSocket connections.
  location /grafana/api/live/ {
    rewrite  ^/grafana/(.*)  /$1 break;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Host $http_host;
    proxy_pass http://grafana;
  }
}
```

### Configure HAProxy

To configure HAProxy to serve Grafana under a *sub path*:

```
frontend http-in
  bind *:80
  use_backend grafana_backend if { path /grafana } or { path_beg /grafana/ }

backend grafana_backend
  # Requires haproxy >= 1.6
  http-request set-path %[path,regsub(^/grafana/?,/)]

  # Works for haproxy < 1.6
  # reqrep ^([^\ ]*\ /)grafana[/]?(.*) \1\2

  server grafana localhost:3000
```

### Configure IIS <a href="#configure-iis" id="configure-iis"></a>

{% hint style="warning" %}
IIS requires that the URL Rewrite module is installed.
{% endhint %}

To configure IIS to serve Grafana under a *sub path*, create an Inbound Rule for the parent website in IIS Manager with the following settings:

* pattern: `grafana(/)?(.*)`
* check the `Ignore case` checkbox
* rewrite URL set to `http://localhost:3000/{R:2}`
* check the `Append query string` checkbox
* check the `Stop processing of subsequent rules` checkbox

This is the rewrite rule that is generated in the `web.config`:

```
  <rewrite>
      <rules>
          <rule name="Grafana" enabled="true" stopProcessing="true">
              <match url="grafana(/)?(.*)" />
              <action type="Rewrite" url="http://localhost:3000/{R:2}" logRewrittenUrl="false" />
          </rule>
      </rules>
  </rewrite>
```

Check the [tutorial on IIS URL Rewrites](https://grafana.com/tutorials/iis/) for more in-depth instructions.

### Configure Traefik

[Traefik](https://traefik.io/traefik/) Cloud Native Reverse Proxy / Load Balancer / Edge Router

Using the docker provider the following labels will configure the router and service for a domain or subdomain routing.

```
  labels:
      traefik.http.routers.grafana.rule: Host(`grafana.example.com`)
      traefik.http.services.grafana.loadbalancer.server.port: 3000
```

To deploy a **`subpath`**

```yaml
  labels:
      traefik.http.routers.grafana.rule: Host(`example.com`) && PathPrefix(`/grafana`)
      traefik.http.services.grafana.loadbalancer.server.port: 3000
```

Examples using the file provider,

```
http:
  routers:
    grafana:
      rule: Host(`grafana.example.com`)
      service: grafana
  services:
    grafana:
      loadBalancer:
        servers:
          - url: http://192.168.30.10:3000
```

```
http:
  routers:
    grafana:
      rule: Host(`example.com`) && PathPrefix(`/grafana`)
      service: grafana
  services:
    grafana:
      loadBalancer:
        servers:
          - url: http://192.168.30.10:3000
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://devs.peerplays.com/supporting-and-reference-docs/grafana/install-grafana-behind-reverse-proxy.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
