Внешний HTTPS-сервер NGINX отклоняет запросы к локальному внутреннему серверу http express

У меня есть приложение, разделенное на два сервера: один - это приложение React, работающее на порту 8080, а другое - сервер Express, работающий на порту 3001. На машине, на которой запущено это приложение, также должно быть запущено несколько других приложений, поэтому я настроить обратный прокси-сервер https с помощью Nginx:

** Я отключил некоторые параметры прокси для тестирования, но позвольте я знаю, должны ли они быть включены.

server {
server_name example.com ;
location / {
 proxy_pass http://example.com:8080;
#  proxy_set_header Host $host;
#  proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
#  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;
}
listen 443 ssl; # managed by Certbot
   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
   include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

Это работает как задумано; Я могу получить доступ к сайту, и он защищен, однако запросы к моему внутреннему серверу, работающему на http: // localhost: 3001, блокируются, поскольку он пытается загрузить смешанный активный контент. Итак, я настроился на клиента, чтобы делать запросы к https: // localhost: 3001, а затем сгенерировал самозаверяющий сертификат для сервера Express и настроил его на использование https, и здесь я наткнулся на стену. Поскольку этот сертификат является самоподписанным, ему нельзя будет доверять, если это явно не сделано кем-то, что является необоснованным для аудитории пользователей. Из поиска кажется, что вы не можете использовать certbot для localhost (понятно), поэтому я не совсем уверен, куда идти дальше. Мое предположение относительно поля proxy_pass заключалось в том, что запросы к бэкэнду будут поступать с http, но из сообщений об ошибках в браузере это не похоже. Действительно ли необходимо, чтобы два сервера, работающие на одном компьютере, использовали https для связи?

Этот вопрос: Прокси-запросы HTTPS к серверу HTTP с NGINX почти соответствует тому, что я пытаюсь сделать, за исключением того, что я использую Nginx только для обслуживания клиента; запросы к бэкэнду обрабатываются через комбинацию клиент / сервер Apollo, поэтому Nginx игнорирует эти запросы. Есть ли что-то очевидное, что мне здесь не хватает, или есть другие варианты конфигурации, которые стоит попробовать?

0
задан 28 October 2020 в 23:18
1 ответ

Итак, мне удалось решить мою проблему, подумав об ответе Теро Килканена. Express позволяет вам установить имя хоста в app.listen(PORT, HOST), поэтому я установил HOST на example.com. В моем бэкэнде используется graphql, поэтому теперь мой бэкенд-адрес: example.com:3001/graphql. Ранее подключение моего клиента к серверной части было определено как localhost:3001/graphql, поэтому я изменил его для подключения к example.com/graphql, а затем в своей конфигурации Nginx создал новое местоположение для сервера exmaple.com:

 location /graphql {
  proxy_pass http://130.245.12.107:3001/graphql;                                                                       $  proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
  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;
 }

и теперь мои запросы к бэкенду имеют https.

0
ответ дан 29 October 2020 в 00:38

Теги

Похожие вопросы