Как известно, когда сайт использует https, нельзя загружать содержимое с других сайтов, поэтому очень часто в проектах нужно загружать какие-то данные используя прокси. В lighttpd 1.4 есть некоторые ограничения, которые необходимо героически преодолевать. Например: необходимо, чтобы при запросе https://www.mapsite.com/tiles/13/6666/9999.png
отдавались данные http://tile.osm.org/13/6666/9999.png
.
Выполняется два преобразования:
-
/tiles/13/6666/9999.png
=>/13/6666/9999.png
-
/13/6666/9999.png
=>http://tile.osm.org/
В nginx ...
... это делается очень очень просто.
Описываем прокси backend и хранилище:
proxy_cache_path /var/www/cache levels=1:2 keys_zone=openstreetmap-backend-cache:8m max_size=500000m inactive=1000d;
upstream openstreetmap_backend {
server a.tile.osm.org;
server b.tile.osm.org;
server c.tile.osm.org;
}
Внутри секции сервер:
server {
listen...
location /tiles/ {
rewrite ^/tiles/(.+)$ /$1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X_FORWARDED_PROTO http;
proxy_set_header Host $http_host;
proxy_cache openstreetmap-backend-cache;
proxy_cache_valid 200 302 30d;
proxy_cache_valid 404 1m;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://openstreetmap_backend;
break;
}
}
...
}
В lighttpd v1.4 ...
... по-джедайски.
server.modules += ("mod_proxy")
$HTTP["host"] =~ "^(.+\.)?(mapsite\.com)" {
accesslog.filename = "/web/<project_name>/logs/access.log"
$HTTP["host"] == "mapsite.com"{
url.redirect = ( "/(.*)" => "https://www.mapsite.com/$1" )
url.redirect-code = 301
}
$SERVER["socket"] == ":81" {
url.rewrite-once = ( "^/tiles/(.*)$" => "/$1" )
proxy.balance = "round-robin"
proxy.server = ( "" => (
"a.tile.osm.org" => (
"host" => "130.193.62.73"
),
"b.tile.osm.org" => (
"host" => "130.193.62.73"
),
"c.tile.osm.org" => (
"host" => "130.193.62.73"
),
)
)
}
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/certificates/<project_name>.pem"
$HTTP["host"] == "mapsite.com"{
url.redirect = ( "/(.*)" => "https://www.mapsite.com/$1" )
url.redirect-code = 301
}
$HTTP["host"] == "www.mapsite.com" {
url.rewrite-once = (
"^/favicon.ico$" => "/images/favicon.ico",
"^/tiles/(.*)$" => "/tiles/$1"
)
$HTTP["url"] =~ "^/tiles/" {
proxy.server = ( "" => ( "" => (
"host" => "127.0.0.1",
"port" => 81
)
)
)
}
}
}
}
Здесь мы поднимаем еще один сокет на 81 порту. Это делается потому, что для исходного запроса мы уже сделали один url rewrite-once на 443 порту и поэтому приходится выкручиваться таким образом.
Важно! При проксировании на несколько серверов в параметре host
нельзя использовать доменное имя, это вызывет ошибку, lighttpd не умеет резолвить доменные имена.
В lighttpd v1.5 и выше
Все настраивается согласно официальной документации
proxy-core.rewrite-request : rewrite request headers or request uri
$HTTP["url"] =~ "^/path1" {
proxy-co...
proxy-core.rewrite-request = (
"_uri" => ( "^/path1/?(.*)" => "/$1" ),
"Host" => ( ".*" => "server2.com" ),
)
}