Служба поддержки клиентов 24/7

(050)470-29-17

Nginx: демонстрация различного интерфейса в зависимости от ip адреса пользователя

Имеем сервер с установленным в качестве фронтенда (Nginx) и бэкенда (Apache). Каким образом удостовереться, что nginx согластно установленным настройкам всегда отображает бэкэнд http://readwrite для определенного адреса (например IP 4.3.2.1), а всем остальным клиентам  http://readonly?

Nginx поддерживает использование "условий" в конфигурации. Вы можете сделать перенапраление и/или другие конфигурации для определенного клиента (IP адреса). Для этого Вам необходимо использовать переменную $remote_addr, с помощью которой можно получить информацию о клиентсоком ip адресе.

Такая функция может быть полезна например, если вы хотите предоставить возможность закачки файлов только с адресов вашего офиса и только чтение всем остальным клиентам с любыми ip адресами.

nginx proxy server

Для начала добавим настройки в /etc/php.ini на серверах {A,B,C}:

# Disallow uploading altogether this makes moving or injecting bad scripts/code onto your web server more difficult

file_uploads = Off
# Disallow treatment of file requests as fopen calls
allow_url_fopen = Off
allow_url_include = Off

Проверим, включена возможность загрузки на сервере, для этого в php.ini должна быть похжие настройки:

file_uploads = On
upload_max_filesize=2M
post_max_size=4M

После изменения файла конфигурации необходимо перезапустить апатч на серверах {A,B,C}.

Настраиваем nginx

Для начала добавляем следующее в конфиг:

if ( $remote_addr ~* ip-address-here ) {
proxy_pass http://YOUR-BACKEND-HERE;
}

Далее устанавливаем значение proxy_pass

## Default backend is readonly ##
proxy_pass http://readonly;

Проверяем ip адрес клиента

## If IP is 3.3.2.1 send backend to readwrite ##
if ( $remote_addr ~* 4.3.2.1 ) {
proxy_pass http://readwrite;
}

В итоге получаем приблизительно такую конфигурацию /etc/nginx.conf

## readonly backend ##
upstream readonly {
server 10.10.10.10:8011;
server 10.10.10.11:8011;
server 10.10.10.12:8011;
ip_hash;
}
## readwrite backend ##
upstream readwrite {
server 10.10.10.13:8011;

}

## config ##
location / {
proxy_set_header Accept-Encoding "";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-By $server_addr:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
## default backend
proxy_pass http://readonly;
## send traffic to readwrite backend if ip is 4.3.2.1 ##
if ( $remote_addr ~* 4.3.2.1 ) {
proxy_pass http://readwrite;
}
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
## rest of config ##

Сохраняем конфигурационный файл и перезапускаем nginx.

# /etc/init.d/nginx reload

Если у вас есть проблемы с nginx наши удаленный администратор может Вам помочь.

Подписаться

Ваша почта