
У меня на сервере Ubuntu установлен Nginx, а на blog.example.com
.
На WordPress я создал страницу для галереи, доступ к которой можно получить из blog.example.com/gallery
.
Теперь, когда кто-то обращается к , gallery.example.com
он должен показывать содержимое blog.example.com/gallery
. Как мне добиться этого в Nginx?
Вот что я попробовал на конфигурации сервера nginx blog.example.com.config
:
location /gallery {
proxy_pass http://gallery.example.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
решение1
Правильная конфигурация
Ваш прокси-сервер настроен неправильно! Это прокси-сервер из пути к поддомену; скорее всего, к тому же имени хоста, на котором находится путь. Если он с server_name gallery.example.com
, то в настоящее время он проксирует из http://gallery.example.com/gallery
в http://gallery.example.com/
.
Чтобы сделать его прокси-сервером с http://gallery.example.com
на http://blog.example.com/gallery
:
server {
server_name gallery.example.com;
location / {
proxy_pass http://blog.example.com/gallery;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Атаки типа «отказ в обслуживании» с текущей конфигурацией прокси-сервера
Полная неправильная конфигурация:
server {
server_name gallery.example.com;
location /gallery {
proxy_pass http://gallery.example.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Тот факт, что эта неправильная конфигурация находится на том же поддомене, на который она проксируется, делает ее интересной, поскольку кто-то может фактически злоупотребить такой настройкой для отказа в обслуживании, получив доступ к URL-адресу, который вызовет столько внутренних прокси-подключений, сколько /gallery
частей URL-адреса следуют друг за другом.
http://gallery.example.com/gallery/gallery/gallery/gallery/gallery/.../gallery
=> . . .
=> http://gallery.example.com/gallery/gallery/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery
=> http://gallery.example.com/gallery
=> http://gallery.example.com/
Вызов большого количества таких запросов вызывает высокую нагрузку на сервер, которая может продолжаться долгое время после прекращения атаки, поскольку Nginx все еще пытается обслуживать все эти вложенные прокси-соединения. Nginx также может начать показывать 502 Bad Gateway
& 500 Internal Server Error
для законных пользователей.
Даже регистрация всех этих запросов может стать проблемой:[alert] 1620#1620: *2748894 write() to "/var/log/nginx/access.log" was incomplete: 3421 of 4566 while logging request
Если бы это был https://
сервер, все эти TLS-рукопожатия привели бы к еще большей нагрузке.
Сколько прокси-подключений может быть вызвано одним HTTP-запросом?
Thelarge_client_header_buffers
контролирует максимальную длину строки запроса, по умолчанию 4 8k
8096 символов ASCII. Хотяhttp2_max_field_size
устарел, быстрый тест curl
показывает, что по умолчанию Nginx может обслуживать URL длиной до 11157 символов по HTTP/2. Какой бы ни был предел, ваш прокси-сервер разрешит от 1011 до 1394 повторений /gallery
в URL, прежде чем выдаст 414 Request-URI Too Large
ошибку.
Пределworker_connections
скорее всего, ударит первым, если не увеличится от значения по умолчанию 512
. Это приведет к появлению 500 Internal Server Error
и строк журнала ошибок, содержащих:
512 worker_connections are not enough while connecting to upstream