Отправка ответа JSON от конечной точки с использованием поддомена с Nginx

#nginx #proxy #digital-ocean #nginx-reverse-proxy

Вопрос:

В настоящее время у меня есть развернутое приложение. https://dostoevsky.rest /

Он хорошо работает с Nginx и Docker.

Однако я хочу получить ответ JSON при попадании в конечную точку https://dostoevsky.rest/api/rand с поддоменом.

Итак, я хочу, чтобы поддомен api.dostoevsky.rest дал ответ https://dostoevsky.rest/api/rand отдал бы.

Я думал, что смогу настроить Nginx с помощью proxy_pass, поэтому я сделал следующее:

 server {
    server_name api.dostoevsky.rest www.api.dostoevsky.rest;

    location / {
        default_type application/json;
        proxy_pass http://<IP>:80/api/rand/;
    }
}
 

Однако, когда я выполняю curl api.dostoevsky.rest, я получаю это сообщение о тайм-ауте:

 <html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx/1.21.3</center>
</body>
</html>
 

Журналы Nginx:

 *1 upstream timed out (110: Operation timed out) while connecting to upstream, client:
 

Я предполагаю, что ресурс не найден?

Если я сделаю curl https://dostoevsky.rest/api/rand это работает нормально. Итак, я думаю, что я совершаю ошибку с прокси или как настроен сервер. Любая помощь будет оценена. Извините, если это вопрос низкого качества; Я новичок в использовании Nginx.

Развернут на дроплете DigitalOcean.

Кстати, я также настроил DNS для IP-адреса, чтобы он указывал на api.dostoevsky.rest.

Ниже приведен мой полный файл nginx.conf:

 server {
        listen 80;
        listen [::]:80;
        server_name dostoevsky.rest www.dostoevsky.rest;

        location ~ /.well-known/acme-challenge {
          allow all;
          root /var/www/html;
        }

        location / {
                rewrite ^ https://$host$request_uri? permanent;
        }
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name dostoevsky.rest www.dostoevsky.rest;

        server_tokens off;

        ssl_certificate /etc/letsencrypt/live/dostoevsky.rest/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/dostoevsky.rest/privkey.pem;

        ssl_buffer_size 8k;

        ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;

        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
        ssl_prefer_server_ciphers on;

        ssl_ciphers ECDH AESGCM:ECDH AES256:ECDH AES128:DH 3DES:!ADH:!AECDH:!MD5;

        ssl_ecdh_curve secp384r1;
        ssl_session_tickets off;

        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8;

        location / {
                try_files $uri @nodejs;
        }

        location @nodejs {
                proxy_pass http://nodejs:8080;
                add_header X-Frame-Options "SAMEORIGIN" always;
                add_header X-XSS-Protection "1; mode=block" always;
                add_header X-Content-Type-Options "nosniff" always;
                add_header Referrer-Policy "no-referrer-when-downgrade" always;
                add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
                # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
                # enable strict transport security only if you understand the implications
        }

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
}

server {
    server_name api.dostoevsky.rest www.api.dostoevsky.rest;

    location / {
        default_type application/json;
        proxy_pass http://<IP>:80/api/rand/;
    }
}
 

Комментарии:

1. Что такое http://<IP>:80 ? Разве он не должен быть таким же, как ваш основной server блок, то есть: http://nodejs:8080 ?

2. Привет, @RichardSmith, еще раз спасибо за комментарий. Я отозвал IP-адрес, но в фактическом файле у меня был IP-адрес с конечной точкой.