NGINX - API-интерфейс обратного прокси-сервера на разных портах
У меня есть следующие API (ы):
- localhost: 300/api/customers/
- локальный: 400/API/клиентов/: идентификатор/биллинг
- локальный: 500/API/заказы
Я хотел бы использовать NGINX, чтобы они все работали в следующем месте:
локальный: 443/API/
Это кажется очень сложным, потому что клиенты охватывают два сервера.
Здесь моя неудачная попытка, начинающаяся с заказов
server {
listen 443;
server_name localhost;
location /api/orders {
proxy_pass https://localhost:500/api/orders;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 443;
server_name localhost;
location /api/customers/$id/billing {
proxy_pass https://localhost:400/api/customers/$id/billing;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 443;
server_name localhost;
location /api/customers {
proxy_pass https://localhost:300/api/customers;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Что-нибудь выпрыгивает до исправления? Спасибо!
Ответы
Ответ 1
Три службы проксируются одним и тем же сервером (что касается nginx
), поэтому должны быть структурированы как три блока location
в одном блоке server
. Подробности смотрите в этом документе.
Если вы просто передаете исходный URI без изменений, вам не нужно указывать URI в операторе proxy_pass
.
server {
{
listen 443;
server_name localhost;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
location /api/orders {
proxy_pass https://localhost:500;
}
location /api/customers {
proxy_pass https://localhost:400;
}
location = /api/customers {
proxy_pass https://localhost:300;
}
}
Если операторы proxy_set_header
идентичны, их можно указать один раз в родительском блоке.
Тип требуемой инструкции location
зависит от диапазона URI, обрабатываемых службой localhost:300/api/customers/
. Если это один URI, синтаксис =
будет работать. Если это какой-либо URI, который не соответствует /api/customers/:id/billing
, то вам нужно будет использовать блок местоположения регулярного выражения. Подробности смотрите в этом документе.
Я не уверен, что это будет работать, если вы не прекратите SSL здесь. То есть настроить обратный прокси-сервер в качестве защищенного сервера.
Ответ 2
Принятый ответ не работал для меня; У меня было три сервера, работающих в качестве службы Kubernetes, сопоставленных с разными IP-адресами кластера (доступными только с узлов Kubernetes). Поэтому я использовал IP хост-компьютера - 10.ttt.ttt.104
и следующую конфигурацию, чтобы получить доступ к этим службам из моей рабочей сети.
Я не эксперт по nginx ни в одном length-, но это сработало - так что используйте его в качестве основы, может быть,
events {
worker_connections 4096; ## Default: 1024
}
http{
server {
listen 80;
listen [::]:80;
server_name 10.ttt.ttt.104;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
proxy_pass http://10.103.152.188:80/;
}
}
server {
listen 9090;
listen [::]:9090;
server_name 10.ttt.ttt.104;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
proxy_pass http://10.107.115.44:9091/;
}
}
server {
listen 8080;
listen [::]:8080;
server_name 10.ttt.ttt.104;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
proxy_pass http://10.105.249.237:80/;
}
}
}