Страницы

Поиск по вопросам

понедельник, 22 апреля 2019 г.

Написание прокси-сервера для чайника

В прошлом вопросе (Вопрос) я выяснил , что для запроса погоды мне нужен прокси сервер, который будет кэшировать данные с погодного сервера. Писать сервер придется мне самому, но до этого ни с чем подобным не сталкивался (серверной частью). Писать решил на python 3. Можете ли ткнуть в литературу или дать ссылки как можно реализовать такой кэширующий сервер, и правильно ли я вообще выбрал python?


Ответ

«По-науке» эта конструкция называется «Обратный прокси» (reverse proxy). У вас есть некоторый backend-сервер, который генерирует какие-то полезные данные, и есть frontend-сервер, который кеширует на себе редкоизменяемые данные. Такая схема чаще используется, для кеширования локальных ресурсов какого-нибудь сайта, чтобы не гонять данные лишний раз, через основной backend-сервер.
В вашем случае backend-сервером будет погодный сервер.
Если, логику формирования запросов клиенты возьмут на себя, то проще будет использовать некий уже готовый и отлаженный web-сервер. В принципе, тут подойдет любой (nginx, lighttpd, apache, Ваш собственный). Чаще всего для таких целей используют nginx. Он весьма шустр и достаточно прост в настройке.
Вот, например, настройки для nginx
http://reviewsignal.com/blog/2013/08/29/reverse-proxy-and-cache-server-with-nginx/
http://ashep.org/2011/nginx-obratnyj-proksi-server/#.V6ECut_XfmE
Официальная документация:
https://www.nginx.com/blog/nginx-caching-guide/
В итоге у вас получится что-то вроде:
events { worker_connections 8096; multi_accept on; use epoll; }
http {
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:60m max_size=1G;
server { listen 80; server_name your-proxy-server-name.com;
location / { proxy_pass http://any-weather-server.com; proxy_redirect off; proxy_set_header Host $host; proxy_cache STATIC; proxy_cache_valid 200 1d; proxy_cache_use_stale error timeout invalid_header updating \ http_500 http_502 http_503 http_504; } } }
Тут надо будет внимательно отнестись к заголовкам, которые ожидает сервер погоды от вас. Вероятно, вам придется немножко поколдовать с
proxy_ignore_headers proxy_hide_headers proxy_set_headers
Подобную проблему обсуждают тут:
https://stackoverflow.com/questions/9230812/nginx-as-cache-proxy-not-caching-anything
Заголовки, вам придется настраивать в любом случае, в том числе и если frontend-сервер будете писать сами.

Если писать самому, я думаю, было бы проще найти некоторое готовое решение, и его переиспользовать. Например, достаточно просто это сделать с помощью tornado. А в качестве кеша использовать наример memcached или redis
https://stackoverflow.com/questions/16524545/how-to-write-a-web-proxy-in-python

Комментариев нет:

Отправить комментарий