Apache находится на 127.0.100.2, а Nginx на 127.0.100.3, при этом управление трафиком выполняет DNAT от первого ко второму (для источника 127.0.0.1) и SNAT от последнего к первому (для адресата 127.0.0.1):
tc qdisc add dev lo root handle 1:0 prio
tc filter add dev lo parent 1:0 protocol ip prio 1 u32 \
match ip src 127.0.0.1 match ip dst 127.0.100.2 \
action nat ingress 127.0.100.2 127.0.100.3
tc filter add dev lo parent 1:0 protocol ip prio 1 u32 \
match ip src 127.0.100.3 match ip dst 127.0.0.1 \
action nat egress 127.0.100.3 127.0.100.2
Попадания в кеш работают, промахи - нет, что я понимаю: При промахе кеша контент доставляется Apache †, но NAT предотвратит это. Какую конфигурацию использовать?
Файл конфигурации Nginx:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g
inactive=60m use_temp_path=off;
server {
listen 127.0.100.3;
location / {
proxy_cache my_cache;
proxy_pass http://127.0.100.2;
}
}
† Дополнительный вопрос: технически говоря, как Nginx обрабатывает промах в кеш-памяти? Wireshark не показывает ничего очевидного: вижу SYN; SYN, ACK; ACK; HTTP HEAD; ACK между 127.0.0.1 и 127.0.100.3, затем аналогичное квитирование TCP между 127.0.0.1 и 127.0.100.2 с последующим HTTP GET и доставкой полезной нагрузки. Предположительно, последний ACK между 127.0.0.1 и 127.0.100.3 делает что-то умное, но что?
Какую конфигурацию использовать?
Обычно это зависит от ваших обстоятельств. Но, очевидно, если вы не хотите, чтобы NAT переходил между Nginx и Apache, Nginx должен подключаться к Apache, используя другой адрес назначения. или src. адрес. Для е. g., вы можете назначить второй IP-адрес для прослушивания Apache и указать proxy_pass
там, или заставьте Nginx подключаться, используя другой исходящий IP. Это довольно грубо, но должно сойти.
Поскольку NAT tc не имеет состояния, другие параметры (например, обработка SYN / ACK TCP) довольно громоздки.
Я думаю, вы ожидаете, что соединение nginx с apache будет исходить от 127.0.100.3, потому что вы настроили nginx для прослушивания этого IP-адреса.
Адрес, привязанный к прослушивающим (входящим) сокетам, не применяется к исходящим соединениям. С вашей текущей конфигурацией соединение от nginx к apache должно происходить с 127.0.0.1, поскольку это основной IP-адрес, привязанный к интерфейсу обратной связи и, следовательно, по умолчанию для исходящих подключений с использованием этого интерфейса.
Вы можете использовать proxy_bind, чтобы переопределить это значение по умолчанию и привязать определенный исходный адрес для исходящих соединений nginx.Соответствующая документация на docs.nginx.com
Я считаю, что вы добьетесь ожидаемого поведения, добавив proxy_bind 127.0.100.3;
на ваш location / { ... }
конфигурация.
Кроме того, я бы посоветовал вам рассмотреть возможность использования 127.0.100.4 для вашего proxy_bind, чтобы упростить правила фильтрации.