openresty с keycloak в docker, предоставляя URL-адрес хоста как обнаружение

#docker #nginx #networking #openresty

#docker #nginx #сеть #openresty

Вопрос:

У меня есть составной файл, содержащий две службы:

 version: '3.5'

services:
    my_nginx:
        environment:
            OIDC_DISCOVERY: 'http://[my-test-server-url]:8081/auth/realms/example/.well-known/openid-configuration'
        ...

    keycloak-container:
        ...
  

Они оба работают на тестовом сервере.
Когда я пытаюсь просмотреть приложение, my_nginx следует перенаправить keycloak-container на токен OIDC.
Однако NGINX сообщает, что URL-адрес хоста не может быть разрешен:

 accessing discovery url (http://[my-test-server-url]:8081/auth/realms/example/.well-known/openid-configuration) failed: [my-test-server-url] could not be resolved (3: Host not found)
  

Если я обращаюсь к контейнеру nginx, добавляю тестовый сервер в раздел /etc/hosts (который, опять же, nginx, по-видимому, не использует), указывающий на экземпляр keycloak, и curl [my-test-server]:8081, я получаю правильный ответ:

 [root@b68fd49a46fe /]# cat /etc/hosts

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.21.0.8      b68fd49a46fe
#ip is that of the keycloak
172.21.0.19     my-test-server

[root@b68fd49a46fe /]# curl http://my-test-server:8081/auth/.../
{"issuer":"http://my-test-server:8081/auth/realms/example","authorization_endpoint":"http://my-test-server:8081/auth/realms/example/protocol/openid-connect/auth","token_endpoint":"http://my-test-server:8081/auth/realms/example/protocol/openid-connect/token","introspection_endpoint":"http://my-test-server:8081/auth/realms/example/protocol/openid-connect/token/introspect","userinfo_endpoint":"http://my-test-server:8081/auth/realms/example/protocol/openid-connect/userinfo","end_session_endpoint":"http://my-test-server:8081/auth/realms/example/protocol/openid-connect/logout","jwks_uri":"http://my-test-server:8081/auth/realms/example/protocol/openid-connect/certs","check_session_iframe":"http://my-test-server:8081/auth/realms/example/protocol/openid-connect/login-status-iframe.html","grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],"response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],"subject_types_supported":["public","pairwise"],"id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"id_token_encryption_alg_values_supported":["RSA-OAEP","RSA1_5"],"id_token_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"request_object_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"response_modes_supported":["query","fragment","form_post"],"registration_endpoint":"http://my-test-server:8081/auth/realms/example/clients-registrations/openid-connect","token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"token_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email","acr"],"claim_types_supported":["normal"],"claims_parameter_supported":false,"scopes_supported":["openid","address","email","microprofile-jwt","offline_access","phone","profile","roles","web-origins"],"request_parameter_supported":true,"request_uri_parameter_supported":true,"code_challenge_methods_supported":["plain","S256"],"tls_client_certificate_bound_access_tokens":true}

  

Теперь есть ли какой-нибудь способ заставить это работать из конфигурации nginx? Я использую openresty с nginx ( FROM openresty/openresty:1.15.8.2-6-centos )
Я провел большую часть дня, пытаясь что-то изменить в файлах контейнеров hosts, но, по-видимому, они не используются в рамках nginx, поскольку он считывает из своего собственного conf распознаватель для использования. Я убедился, что для него установлено 127.0.0.11 значение, которое должно быть правильным.

Есть ли какой-нибудь способ, которым я могу создать proxy_pass или аналогичный, чтобы разрешить эту проблему?

Ответ №1:

Если у вас есть сервер с systemd, вы можете использовать поставляемый с ним сервер имен с разрешением systemd для разрешения имен ваших хостов из файла /etc/hosts.

Вам нужно только добавить это в свой nginx config http, сервер или блок местоположения:

распознаватель 127.0.0.53;

Используйте systemctl status systemd-resolved.service, чтобы узнать, работает ли он на вашем сервере.