NGINX Неправильная пересылка запросов в местоположение по умолчанию - PullRequest
0 голосов
/ 07 января 2020

У меня есть веб-приложение React, которое я пытаюсь развернуть на экземпляре AWS EC2, и я использую NGINX. Я пытаюсь настроить его так, чтобы все http-запросы перенаправлялись на https. В данный момент он, похоже, перенаправляет все http-запросы на https, но NGINX перенаправляет запрос по умолчанию / usr / share / nginx / html / вместо веб-приложения, которое я запускаю на localhost. Я прочитал десятки статей и пытался понять это в течение нескольких дней. Указатели будут высоко оценены. Заранее спасибо.

Вот моя NGINX конфигурация сервера в / etc / nginx / sites-available / default:

server {

  listen 80;

  if ($http_x_forwarded_proto = "http") {
    return 301 https://$host$request_uri;
  }
}

server {

  listen 443 ssl http2 default_server;
  listen 443 ssl http2 default_server;

  ssl on;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_session_cache shared:SSL:50m;
  ssl_session_timeout 1h;

  location / {
    proxy_pass http://127.0.0.1:3839;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
  }
}

Кроме того, приложение работает и доступно в порту указано в моем блоке местоположения. Я могу добраться до него на машине с curl 127.0.0.1:3839 без проблем. В /var/log/nginx/error.log я вижу, что nginx пытается обслуживать запросы из каталога / usr / share / nginx / html /, как я и выяснил, в этом проблема. Я просто понятия не имею, почему он отправляет запросы туда, а не на порт на localhost, который я указал в своем блоке местоположения. Если я go на root URL для моего приложения, я получаю страницу "Добро пожаловать в NGINX". Если я go на любой подпуть под моим root URL-адресом, например example.com/login, то я получаю 404, и error.log показывает, что он не может найти ресурс / usr / share / nginx / html / login, например , Спасибо:)

Обновление:

Внутри серверного блока listen 80 я добавил

location / { 
  proxy_pass http://127.0.0.1:3839; 
} 

, и теперь кажется, что он работает правильно, но я понятия не имею, почему Мне нужно было бы определить блок местоположения в определении сервера listen 80, если запросы в этом блоке просто перенаправляются, чтобы быть перехваченными другим определением сервера, прослушивающим 443. Любая идея, почему это работает сейчас?

1 Ответ

0 голосов
/ 11 января 2020

Я выяснил причину, по которой сработал блок местоположения в определении http-сервера. В AWS у меня случайно балансировщик нагрузки переадресовывал все запросы на порт 80 в экземпляре EC2. Поэтому, хотя мое определение http-сервера было перенаправлено на https-версию сайта, эти запросы https по-прежнему обрабатывались тем же определением http-сервера, и, поскольку ранее у него вообще не было блока местоположения, это вызывало его. терпеть неудачу. В конце я удалил блок местоположения из определения сервера http, а затем правильно обновил свой балансировщик нагрузки для пересылки запросов https на порт 443 в экземпляре EC2, и теперь все работает, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...