#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, чтобы узнать, работает ли он на вашем сервере.