Назад | Перейти на главную страницу

Настройка NAT с контролем трафика для Nginx / Apache на локальном хосте, пропуск кеша

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, чтобы упростить правила фильтрации.