#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-адрес с конечной точкой.