У меня есть приложение Pyramid, которое в некоторых местах использует request.environ['REMOTE_ADDR']
.
Приложение обслуживается Python Paste на порту 6543, и сервер nginx, прослушивающий порт 80, пересылает запросы на сервер Paste.
Конфигурация nginx основана на кулинарной книге Pyramid:
server {
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:6543;
}
В приложении Pyramid переменная request.environ ['REMOTE_ADDR'] теперь всегда равна 127.0.0.1.
Я вижу несколько стратегий для решения этой проблемы, но я не знаю, есть ли рекомендуемый способ сделать это.
Вот что я рассматриваю:
добавить подписчика NewRequest, который при необходимости заменяет request.environ ['REMOTE_ADDR']:
if 'HTTP_X_REAL_IP' in event.request.environ:
event.request.environ['REMOTE_ADDR'] = event.request.environ['HTTP_X_REAL_IP']
используйте промежуточное программное обеспечение wsgi для изменения request.environ перед попаданием на слой Pyramid.
что-то еще
Какую стратегию вы используете для развертывания приложений Pyramid?
Что произойдет, если у меня будет два прокси nginx? (первый обслуживает локальную сеть, а второй - компьютер, напрямую подключенный к Интернету).