Nginx не выполняет маршрутизацию в соответствии с моими пользовательскими правилами

Проблема: Nginx не направляет трафик на основе правила, которое я определил в отдельном файле конфигурации, а просто отображает ответ 404 по умолчанию.

Контекст: у меня есть небольшое промежуточное ПО, написанное на Go, которое обеспечивает простой ответ на запросы GET. Приложение развернуто на порту 8080:

$ curl localhost:8080
ok

Я хочу написать конфигурацию Nginx, которая позволит мне направлять вызовы с /api на localhost:8080, что позволит мне сделать следующее:

$ curl localhost/api
ok

Для этого я написал следующий конфиг:

/etc/nginx/sites-available/custom-nginx-rules

server {
    listen 80;

    location /api {
        proxy_pass http://localhost:8080;
    }
}

Я также создал программную ссылку в /etc/nginx/sites-enabled/ для указанного выше файла.

$ ls -l /etc/nginx/sites-enabled
total 0
lrwxrwxrwx 1 root root 34 Jan 19 16:42 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root 32 Feb 20 14:56 custom-nginx-rules -> /etc/nginx/sites-available/custom-nginx-rules

В остальном установка — ванильный Nginx, ничего не меняется. Несмотря на эту простую настройку, я получаю 404 при следующем вызове:

$ curl localhost/api
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.10.3</center>
</body>
</html>

Другая информация: в моей системе установлены следующие пакеты nginx (работающие на raspberry pi)

$ dpkg -l | grep nginx

ii  libnginx-mod-http-auth-pam      1.10.3-1+deb9u1              armhf        PAM authentication module for Nginx
ii  libnginx-mod-http-dav-ext       1.10.3-1+deb9u1              armhf        WebDAV missing commands support for Nginx
ii  libnginx-mod-http-echo          1.10.3-1+deb9u1              armhf        Bring echo and more shell style goodies to Nginx 
ii  libnginx-mod-http-geoip         1.10.3-1+deb9u1              armhf        GeoIP HTTP module for Nginx
ii  libnginx-mod-http-image-filter  1.10.3-1+deb9u1              armhf        HTTP image filter module for Nginx
ii  libnginx-mod-http-subs-filter   1.10.3-1+deb9u1              armhf        Substitution filter module for Nginx
ii  libnginx-mod-http-upstream-fair 1.10.3-1+deb9u1              armhf        Nginx Upstream Fair Proxy Load Balancer
ii  libnginx-mod-http-xslt-filter   1.10.3-1+deb9u1              armhf        XSLT Transformation module for Nginx
ii  libnginx-mod-mail               1.10.3-1+deb9u1              armhf        Mail module for Nginx
ii  libnginx-mod-stream             1.10.3-1+deb9u1              armhf        Stream module for Nginx
ii  nginx                           1.10.3-1+deb9u1              all          small, powerful, scalable web/proxy server
ii  nginx-common                    1.10.3-1+deb9u1              all          small, powerful, scalable web/proxy server - common files
ii  nginx-full                      1.10.3-1+deb9u1              armhf        nginx web/proxy server (standard version)

Я также требую, чтобы эта настройка не зависела от каких-либо имен хостов или серверов. Он должен выполнять маршрутизацию независимо от хоста.


person Gabriel Ruiu    schedule 20.02.2018    source источник
comment
вы должны запустить nginx -T и посмотреть, действительно ли загружается ваша конфигурация. Также проверьте журнал ошибок nginx, который может помочь вам узнать, является ли источником или самим nginx возврат 404.   -  person Joshua DeWald    schedule 20.02.2018
comment
nginx -T подтверждает, что мои пользовательские правила загружаются, а журнал ошибок пуст   -  person Gabriel Ruiu    schedule 21.02.2018


Ответы (1)


Не видя вашей полной конфигурации, может показаться, что блок nginx server по умолчанию принимает запрос, а не ваш. Вы можете попытаться исправить это, изменив строку прослушивания на:

listen 80 default_server;

Вы также можете подтвердить, что это так, добавив server_name и скручивание, используя это:

server_name api.example.com;

Затем: curl -H "Host: api.example.com" http://localhost/api

Если это работает, проблема определенно заключается в обработке default_server.

Из документов NGINX по выбору сервера:

В этой конфигурации nginx проверяет только поле заголовка запроса «Host», чтобы определить, на какой сервер должен быть направлен запрос. Если его значение не совпадает ни с одним именем сервера или запрос вообще не содержит этого поля заголовка, то nginx направит запрос на сервер по умолчанию для этого порта. В приведенной выше конфигурации сервер по умолчанию — первый, что является стандартным поведением nginx по умолчанию. Также можно явно указать, какой сервер должен быть по умолчанию, с помощью параметра default_server в директиве listen:

person Joshua DeWald    schedule 21.02.2018