Я пытаюсь настроить минимальную конфигурацию nginx для API, но не могу заставить работать SSL/HTTPS.
Короче говоря: /healthcheck
конечная точка работает так, как задумано, но не более того.
У меня есть API-приложение, работающее в контейнере Docker на экземпляре GCE вместе с nginx.
Internet
+
|
|
v
+--------------+----------------+
| GCP |
| |
| +--------------------+ |
| |Google Load Balancer| |
| +---------+----------+ |
| | |
| | |
| | |
| v |
| +----------+------------+ |
| | Google Compute Engine | |
| | | |
| | +-------------------+ | |
| | | Server instance | | |
| | | | | |
| | | +------+ +-----+ | | |
| | | |Docker| |nginx| | | |
| | | | | +-----+ | | |
| | | | API | | | |
| | | +------+ | | |
| | +-------------------+ | |
| +-----------------------+ |
| --------------------------- |
+-------------------------------+
Весь HTTP-трафик проходит через балансировщик нагрузки и попадает в nginx. Если конечная точка — , то /healthcheck
она идет напрямую в API (который возвращает 200 OK
), в то время как все остальное должно быть направлено обратно через балансировщик нагрузки как HTTPS.
Весь HTTPS-трафик должен поступать напрямую в API.
У меня server
в конфигурации два блока.
Первый блок:
server {
listen 80;
server_name my-domain.com;
location /healthcheck {
proxy_pass http://API_IP:8080/healthcheck;
}
location / {
return 301 https://$server_name$request_uri;
}
}
Второй блок:
server {
listen 443 ssl;
server_name my-domain.com;
location / {
proxy_pass http://API_IP:8080$request_uri;
}
}
СКлиент REST для лечения бессонницы:
Когда я нажимаю /healthcheck
либо как HTTP, либо как HTTPS, это работает, но /users
или /reviews
только выдает сообщение об ошибке Error: Couldn't resolve host name
. Никакого кода состояния, только это сообщение об ошибке.
Любая помощь будет высоко оценена.
Обновлять
Вывод изwget -S my-domain.com/users
(Фактический домен и IP изменены)
$ wget -S my-domain.com/users
--2018-08-30 14:09:08-- http://my-domain.com/users
Resolving my-domain.com (my-domain.com)... *IP REDACTED*
Connecting to my-domain.com (my-domain.com)|*IP REDACTED*|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 301 Moved Permanently
Server: nginx/1.10.3 (Ubuntu)
Date: Thu, 30 Aug 2018 12:09:09 GMT
Content-Type: text/html
Content-Length: 194
Location: https://my-domain.com/users
Via: 1.1 google
Location: https://my-domain.com/users [following]
--2018-08-30 14:09:09-- https://my-domain.com/users
Resolving my-domain.com (my-domain.com)... failed: Name or service not known.
wget: unable to resolve host address ‘dev.api.godlypatruljen.no’
решение1
Верно.
Я получил совет от коллеги, который направил меня на верный путь. Это может быть не самое красивое решение, но оно работает.
Я заменил оба старых server
блока наодинновый:
server {
listen 80;
listen [::]:80;
server_name my-domain.com;
set $redirect_to_https 0;
if ($http_x_forwarded_proto != 'https') {
set $redirect_to_https 1;
}
if ($request_uri = '/healthcheck') {
set $redirect_to_https 0;
}
if ($redirect_to_https = 1) {
return 301 https://$host$request_uri;
}
location / {
proxy_pass http://$api_ip:$api_port;
}
}
У меня также есть несколько дополнительных location
s и if
s (в дополнение к тому, что показано здесь) из-за некоторых пограничных случаев, которые мне нужно обработать (статичные расположения на сервере, но не внутри контейнера и т. д.), но этот пример должен достаточно хорошо проиллюстрировать решение.