107 lines
3.3 KiB
Markdown
107 lines
3.3 KiB
Markdown
# nginx caching reverse proxy config
|
|
|
|
This is a good-enough example configuration for a caching reverse proxy for HLS
|
|
live streams.
|
|
|
|
## See it in action
|
|
|
|
```bash
|
|
# Download and compile a local version of nginx
|
|
$ ./build.sh
|
|
|
|
# Run the example configuration
|
|
$ ./run.sh
|
|
```
|
|
|
|
Once running, check out [http://localhost:8080](http://localhost:8080). By The
|
|
example config proxies to `restream.dev`, so you should see a blank player page.
|
|
Feel free to check out the `restream.conf` file and tune it to your liking.
|
|
|
|
The build script doesn't litter your system with random junk. When you're done
|
|
you can just wipe the `./nginx` folder.
|
|
|
|
## Reverse proxying from existing nginx
|
|
|
|
If you don't wanna bother merging the config, you can just use your existing
|
|
nginx to reverse-proxy to this one. It'd look something like this:
|
|
|
|
```
|
|
your server
|
|
----------------------------------
|
|
| |
|
|
viewer --|--> main nginx --> this nginx --|--> upstream
|
|
| w/ SSL |
|
|
----------------------------------
|
|
```
|
|
|
|
You can just do something like this:
|
|
|
|
```
|
|
location / {
|
|
proxy_pass http://127.0.0.1:8080/;
|
|
}
|
|
```
|
|
|
|
## Merging with your existing nginx
|
|
|
|
If you want to merge it with an existing nginx config, you can copy these
|
|
directives to the `http` block:
|
|
|
|
- `resolver` and `resolver_timeout` (if you plan on using a domain name for the
|
|
upstream)
|
|
- `proxy_cache_path`
|
|
- `upstream`
|
|
|
|
And then you can copy the `server` block in too. If you want to merge it with an
|
|
existing `server`, you can just copy all the `proxy_` directives. Note that
|
|
it'll add caching to the whole `server` by default, so if you don't want that,
|
|
you can change `proxy_cache` to `off`, and then in the `location` blocks where
|
|
you do the reverse proxy, set `proxy_cache` back to `restream_cache`.
|
|
|
|
Feel free to tweak the parameters to fit your needs, but generally the values in
|
|
`restream.conf` should just work alright for caching live streams.
|
|
|
|
## Setting this up on a remote server
|
|
|
|
The convenience script `remote_setup.sh` can be used to ssh into a fresh remote
|
|
server, install nginx there, configure the upstream and set up SSL. This should
|
|
work on a fresh Ubuntu 20.04 server.
|
|
|
|
Run the script:
|
|
|
|
```
|
|
./remote_setup.sh \
|
|
--domain relay1.stream.example.org \
|
|
--upstream-server https://restream.dev:443 \
|
|
--acme-email your.email@example.org \
|
|
--target-server root@relay1.stream.example.org
|
|
```
|
|
|
|
**Important note**: you _must_ specify the protocol (`https://`) and the port
|
|
(`:443`) for the `--upstream-server` flag.
|
|
|
|
Once the script is done, your server should be accessible from
|
|
`https://relay1.stream.example.org` and proxying all requests to
|
|
`https://restream.dev`.
|
|
|
|
Example 2: setting up a relay for SPWN:
|
|
|
|
```
|
|
./remote_setup.sh \
|
|
--domain relay1.stream.example.org \
|
|
--upstream-server 'https://vod.spwn.jp:443' \
|
|
--upstream-base '/spwn-archives/xxxxx/xxxx' \
|
|
--acme-email acme@example.org \
|
|
--target-server root@relay1.stream.example.org \
|
|
--pass-header User-Agent '[user agent string]' \
|
|
--pass-header Cookie '[redacted]' \
|
|
--pass-header Referrer 'https://spwn.jp/'
|
|
```
|
|
|
|
**Notes**
|
|
|
|
- `--upstream-server`: Include the `https://` in front and the `:443` port
|
|
number, and _do not_ include a trailing `/`.
|
|
- `--upstream-base`: The rest of the URL before the `index.m3u8` file. Start
|
|
with a `/` but do not add a `/` at the end.
|