Я хотел бы использовать одно и то же определение восходящего потока с несколькими портами:
upstream production {
server 10.240.0.26;
server 10.240.0.27;
}
server {
listen 80;
server_name some.host;
location / {
proxy_pass http://production:1234;
}
}
server {
listen 80;
server_name other.host;
location / {
proxy_pass http://production:4321;
}
}
Используя эту конфигурацию nginx -t
бросает: upstream "production" may not have port 1234
и возвращается с кодом выхода 1.
Когда я пытаюсь определить proxy_pass
URL (или его части) как переменную, например:
set $upstream_url "http://production:1234"
set $upstream_host production;
set $upstream_port 1234;
proxy_pass $upstream_url;
# or
proxy_pass http://production:$upstream_port;
# or
proxy_pass http://$upstream:$upstream_port;
Nginx пытается разрешить имя моего восходящего потока через преобразователь:
*16 no resolver defined to resolve production, client: ...., server: some.host, request: "GET / HTTP/1.1", host: "some.host"
Для меня proxy_pass doc звучит так, как будто именно этого не должно происходить;
Имя сервера, его порт и переданный URI также можно указать с помощью переменных:
proxy_pass http: // $ host $ uri; или даже так:
proxy_pass $ request; В этом случае имя сервера ищется среди описанных групп серверов и, если оно не найдено, определяется с помощью распознавателя.
Протестировано с версиями nginx:
Я что-то упускаю? Есть ли способ обойти это?
Вы должны определить порт в каждом server
вход в upstream
. Если вы этого не сделаете, nginx установит для него значение 80
. Так server 10.240.0.26;
на самом деле означает server 10.240.0.26:80;
.
Однако вы можете определить несколько восходящих блоков:
upstream production_1234 {
server 10.240.0.26:1234;
server 10.240.0.27:1234;
}
upstream production_4321 {
server 10.240.0.26:4321;
server 10.240.0.27:4321;
}
server {
listen 80;
server_name some.host;
location / {
proxy_pass http://production_1234;
}
}
server {
listen 80;
server_name other.host;
location / {
proxy_pass http://production_4321;
}
}
Другой вариант - настроить локальный DNS для разрешения имени хоста production
на несколько IP-адресов, и в этом случае nginx будет использовать их все.
http://nginx.org/r/proxy_pass: Если имя домена разрешается в несколько адресов, все они будут использоваться циклически.
server {
listen 80;
server_name some.host;
location / {
proxy_pass http://production:1234;
}
}
Когда вы используете восходящие потоки, порты определяются в восходящих блоках:
upstream production {
server 10.240.0.26:8080;
server 10.240.0.27:8081;
}
Другими словами, nginx разрешает proxy_pass
аргумент либо вышестоящей группе, либо host:port
пара. Когда вы используете переменную в качестве аргумента, она разрешает только host:port
пара.