# Nginx reverse proxy example with defined location directive
In this example, the reverse proxy is defined only under the `/plantuml` context path.
All other context paths (locations) are not affected and are freely available.
This allows the server to be used for more than "just" PlantUML.
References:
- [Nginx documentation](https://nginx.org/en/docs/)
- [Nginx beginner's guide](https://nginx.org/en/docs/beginners_guide.html)
## Quick start
Be sure to have [`docker-compose.yml`](./docker-compose.yml) and [`nginx.conf`](./nginx.conf) inside your current working directory.
```bash
# start nginx and plantuml server
docker-compose up -d
# stop nginx and plantuml server
docker-compose down
```
Check with `docker ps` if both container are up and running:
```
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
217e753a0dcf plantuml/plantuml-server:jetty "/entrypoint.sh" 4 seconds ago Up 3 seconds 8080/tcp plantuml-server
9b1290c100f5 nginx:alpine "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx
```
Open [http://localhost/plantuml](http://localhost/plantuml) inside your browser.
YEAH! You are now using PlantUML behind a simple Nginx reverse proxy.
## Nginx configuration
```nginx
...
# PlantUML
location /plantuml/ {
proxy_pass http://plantuml-server:8080/plantuml/;
}
...
```
- `location /plantuml/` to reverse only the context path `/plantuml`
- `proxy_pass http://plantuml-server:8080/plantuml/` to set reverse proxy path to plantuml server.
Use the docker container name `plantuml-server` instead of ip addresses.
Also, use the same context path (`BASE_URL`) as PlantUML, which is configurable as an environment variable in the docker-compose file.
NOTE: `BASE_URL`, `location` and therefore the `proxy_pass` should have the some context path!
If that is not possible it may be possible to solve the problem by using NGINX `sub_filter`:
```nginx
# PlantUML
location /plantuml/ {
sub_filter '' '';
sub_filter_types text/html;
proxy_pass http://plantuml-server:8080/;
}
```
NOTE: Since [PR#256](https://github.com/plantuml/plantuml-server/pull/256) it is possible to use deep base URLs.
So with e.g. `BASE_URL=foo/bar` the following is possible:
```nginx
# PlantUML
location /foo/bar/ {
proxy_pass http://plantuml-server:8080/foo/bar/;
}
```
## Nginx and PlantUML server
```yaml
version: "3"
services:
plantuml-server:
image: plantuml/plantuml-server:jetty
container_name: plantuml-server
environment:
- TZ=Europe/Berlin
- BASE_URL=plantuml
nginx:
image: nginx:alpine
container_name: nginx
ports:
- "80:80"
environment:
- TZ=Europe/Berlin
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
```
- Set `container_name` to use them instead of e.g. ip addresses
- Set the environment `TZ` the ensure the same timezone.
For example to server timezone (`cat /etc/timezone`)?
- plantuml-server
* plantuml-server already exposes port `8080` to it's own local network (but not outside).
Since plantuml-server and nginx are sharing a network, nginx can reach plantuml-server without further settings.
* Set the environment `BASE_URL` to the preferred context path
- nginx
* open/link port `80` to the outside
* `./nginx.conf:/etc/nginx/nginx.conf:ro` to use your own Nginx configuration (readonly)
## Useful commands
```bash
# see whats going on inside your docker containers
docker logs --tail 50 --follow --timestamps nginx
docker logs --tail 50 --follow --timestamps plantuml-server
```