Заголовок авторизации в Nginx для проксирования на бэкенд с базовой авторизацией (с помощью htpasswd).
Если проксируемый ресурс защищен с помощью htpasswd, то при проксировании через nginx вы будете получать 403 ошибку HTTP (Необходимо авторизоваться).
"user:password" # стандартная форма записи авторизационной комбинации curl http://foo:bar@example.ru
Попытка проксировать при помощи ссылки вида curl приводит к ошибке формата ссылки в Nginx.
Решение этой проблемы - использование заголовка авторизации HTTP. RFC определяет этот заголовок как строку:
user:password
переведенную в 64-ричную систему счисления (транспортное кодирование). IP калькулятор позволяет это сделать.
После преобразования эта строка будет иметь вид:
dXNlcjpwYXNzd29yZA==
Важно! Base64 - это не шифрование.
Нужно помнить о безопасности. Пользоваться этой возможностью не безопасно, так как в первом случае связка передается в открытом виде в заголовке GET запроса, во втором случае тоже в открытом виде в заголовке Authorization. В этом случае лучше использовать SSL соединение.
Итак, настроим Nginx
Мы хотим проксировать ресурс 6.6.6.6. Во-первых необходимо настроить на сервере location:
location / {
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_pass http://6.6.6.6:80;
}
В нашем случае этот ресурс защищен htpasswd комбинацией логин: "king" пароль: "isnaked". Тогда получаем стандартную запись:
king:isnaked
В Base64 это выглядит так:
a2luZzppc25ha2Vk
Второе - необходимо добавить заголовок в location, передаваемый проксируемому серверу. Это можно сделать с помощью директивы proxy_set_header.
proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";
Полностью location будет выглядеть так:
location / {
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_pass http://6.6.6.6:80;
proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";
}
Правильно рестаруем nginx и все готово.
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo service nginx restart
Проксируем изображение с web камеры без пароля
Ниже приведена типичная конфигурация для проксирования статического изображения с IP камеры
Для HIKVISION DS-2CD2412F-IW логин: admin пароль: 12345
location /img/{
# можно выбрать основной или дополнительный профиль 1,2
proxy_pass "http://192.0.0.64/Streaming/channels/1/picture?snapShotImageType=JPEG";
proxy_set_header Authorization "Basic YWRtaW46MTIzNDU=";
}
Для DLINK DCS-2103 логин: admin пароль: admin
location /img/{
# можно выбрать отдельный профиль 1...4
proxy_pass "http://192.168.0.20/dms?nowprofileid=1";
proxy_set_header Authorization "Basic YWRtaW46YWRtaW4=";
}
Для DLINK DCS-3010 (DCS-2010) логин: admin пароль: admin
location /img/{
# можно выбрать отдельный профиль 1...4
proxy_pass "http://192.168.0.20/GetImage.cgi?CH=1";
proxy_set_header Authorization "Basic YWRtaW46YWRtaW4=";
}
Для AXIS M1011-W логин: admin пароль: admin
location /img/{
proxy_pass "http://192.168.0.20/axis-cgi/jpg/image.cgi";
proxy_set_header Authorization "Basic YWRtaW46YWRtaW4=";
}
Для JpgStreamer логин: admin пароль: admin
location /img/{
proxy_pass "http://192.168.0.20/?action=snapshot";
proxy_set_header Authorization "Basic YWRtaW46YWRtaW4=";
}
Добавим кэширование изображение с web камеры при проксировании
Чтобы постоянно не обращаться к камере, для ускорения загрузки, можно кэшировать изображение. Это делается не просто, а очень просто. Для кэширования изображения при проксировании с камеры, нужно воспользоваться директивой proxy_cache в location и определить proxy_cache_path в секции http:
http {
...
proxy_cache_path /var/www/cache/local levels=1:2 keys_zone=camera_image_local_cache:1m inactive=30m max_size=512M;
proxy_temp_path /var/www/cache/local/tmp;
...
server {
...
location /img/{
# на примере hikvision
proxy_pass "http://192.0.0.64/Streaming/channels/1/picture?snapShotImageType=JPEG";
proxy_set_header Authorization "Basic YWRtaW46MTIzNDU=";
proxy_cache camera_image_local_cache;
proxy_cache_valid 200 302 404 1m;
# Обычно в заголовках камеры запрет кэширования
proxy_ignore_headers Cache-Control;
}
...
}
}
Удачи!