iocaine/docs/content/deploying/nginx.md
Gergely Nagy 22166e0e7c
Some checks failed
lint / linting (push) Waiting to run
documentation / documentation (push) Has been cancelled
documentation / notification (push) Has been cancelled
docs: Further updates & fixes to the nginx docs
Thanks to @redshiftltd for test driving the nginx setup, and providing
very valuable feedback & the updated configurations.

Signed-off-by: Gergely Nagy <me@gergo.csillger.hu>
2025-01-29 19:24:33 +01:00

1.8 KiB

title description
Using nginx with iocaine Setting up nginx to front for iocaine

Getting started

In here, I assume that iocane has already been configured and deployed. Furthermore, lets assume that we have a site running at [::1]:8080, and we want to serve that with nginx. Normally, that would look something like this:

server {
  server_name blog.example.com;

  location / {
    proxy_set_header Host $host;
    proxy_pass http://[::1]:8080;
  }
}

Routing AI agents elsewhere

To serve something different for AI user agents, the idea is to create a mapping between user-agent and badness, such that AI agents will evaluate to a truthy value, while unmatched against will default to a false-y one. We can do this with a map outside of the server block:

map $http_user_agent $badagent {
  default   0;
  ~*gptbot  1;
  ~*chatgpt 1;
  ~*ccbot   1;
  ~*claude  1;
}

You can put this into a file common between all servers, like /etc/nginx/conf.d/iocaine.conf, because on many distributions, any *.conf file under /etc/nginx/conf.d will get automatically included. This way, you can share it between servers, without having to include it from multiple files manually.

Within the server block, we'll rewrite the URL if find a match on $badagent, and the proxy that location through to iocaine. The reason we need the rewrite is that nginx does not support proxy_pass within an if block. In the end, our server block will look like this:

server {
  server_name blog.example.com;
  if ($badagent) {
    rewrite ^ /ai$request_uri;
  }
  location /ai {
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:42069;
  }
  location / {
    proxy_set_header Host $host;
    proxy_pass http://[::1]:8080;
  }
}