Перепишите ваши спагетти со странными условиями в нормальные независимые блоки, у которых уникальные имена обслуживаемых доменов. Опционально - разнесите и порты тоже.
Редиректит то, куда вы обращаетесь в прокси-пассе, а не указанный конфиг. Уберите подобное поведение оттуда (а также абсолютные ссылки, которые тоже палят ваш "секретный домен", например) - и всё будет, как вам хочется.
То, что происходит в браузере, не должно ходить без шифрования на странные порты. У вас же есть в конфиге нормально настроенное проксирование /service, сделайте такое же для /api.
limit_req ограничивает (не скорость доступа, кстати, а частоту запросов - скоростью рулит limit_rate) ровно там, где вы его добавите. Добавите в отдельном локейшене с нужными урлами - будет ограничивать не весь сайт, а только определённые урлы.
Сделайте два серверных блока - один с listen %externalip%, второй с %localip%. Тогда можно будет настроить разную обработку для запросов извне и изнутри локальной сети. То же самое, конечно же, можно сделать и другими методами - if`ом, map`ом адресов клиента и т. д.
Как мне настроить мой nginx так, чтобы при запросе этого пути сервер не отправлял его на обработку в gunicorn-flask, а самостоятельно исполнял php и вернул нужный ответ?
Просто добавить локейшен с этим урлом и соответствующей обработкой.
Незачем дублировать директивы и придумывать какие-то алиасы.
server {
root /home/web/domainname/public;
try_files $uri $uri/ /index.html;
location /user { если захотите как-то по-разному обрабатывать эти пути }
location /admin { }
location / { тут какой-нибудь редирект или что ещё захотите }
}