Назад | Перейти на главную страницу

Конфигурация Nginx для Restful API за прокси

Я пытаюсь переместить прокси-сервер моего узла с порта 8080 к 80 и ударяя по стенам. Я хочу, чтобы мой RESTful API находился за обратным прокси-сервером nginx, прослушивающим порт 80 на месте /api/path вместо.

(Порт 8080 был недоступен для некоторых корпоративных пользователей за чрезмерно усердными брандмауэрами.)

Раньше я направлял запросы на https: //domain.tld: 8080 / к http: // локальный: 1337. Нет проблем через:

server {
    listen      8080;
    server_name  domain.tld;

    ssl on; #some other SSL config removed for clarity

    location / {
        proxy_redirect          off;
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}

Теперь я пытаюсь переместить его на место api/path/ и подальше от порта 8080 через:

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  domain.tld;
    root         /path/to/html/;

    ssl on; #some other SSL config removed for clarity

    location /api/path/ {
        proxy_redirect          off;
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}

Это приводит к:

$ curl -i -H "Content-Type: application/json" -H "Accept: application/json" -X POST -d '{}' https://domain.tld/api/path

TTP/1.1 404 Not Found
Date: Thu, 08 Sep 2016 01:29:35 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 25
Connection: keep-alive
X-Powered-By: Express
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000; includeSubDomains;

Cannot POST /api/path

Теперь я прочитал, что вы не можете выполнять POST на статические страницы, что означает, что вы делаете что-то вроде:

error_page  405          @405;

location = @405 {
    root         /path/to/html/;
}

Но поскольку я не могу найти достаточно информации об этом, он не работает. GET работает как обычно, но POST выдаст ошибку с Cannot POST api/path. Что я могу здесь сделать?

Ценю любую помощь.

Обновить

Мне нужно было включить proxy_redirect как указал @techraf, поэтому моя успешная конфигурация теперь выглядит так. Надеюсь, это кому-то поможет.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  domain.tld;
    root         /path/to/html/;

    ssl on; #some other SSL config removed for clarity

    location /api/path/ {
        proxy_redirect          http://localhost:1337/  /api/path/; #<-- change
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}

Если вы хотите указать /api/path/ в корень места назначения перенаправления вам необходимо использовать:

proxy_redirect http://localhost:1337 https://domain.tld/api/path/