NGINX
#nginx#geoip#log_format#access_log#proxy_set_header#bitrixvm

Nginx GeoIP: log_format и заголовки X-GeoIP для бекенда

Формат лога с полями country/city и прокидывание GeoIP в приложение через proxy_set_header X-GeoIP-*. Для связки nginx → httpd (Bitrix).

Как использовать

  1. В http {} добавить log_format main_geoip и в нужном server/location — access_log с этим форматом.
  2. В location с proxy_pass к Apache/PHP добавить proxy_set_header X-GeoIP-*.
  3. В PHP читать из $_SERVER['HTTP_X_GEOIP_COUNTRY'] и т.д.

Использование переменных GeoIP в логах и передача страны/города в бекенд заголовками. Модуль ngx_http_geoip_module должен быть загружен и пути к базам заданы в http {}. Список переменных: документация ngx_http_geoip_module.

Формат лога с GeoIP

В блоке http {} задайте формат и подключите его к access_log:

http {
    # ... geoip_country /etc/nginx/geoip/GeoIP.dat;
    # ... geoip_city    /etc/nginx/geoip/GeoLiteCity.dat;

    log_format main_geoip '$remote_addr - $remote_user [$time_local] '
                         '"$request" $status $body_bytes_sent '
                         '"$http_referer" "$http_user_agent" '
                         'country=$geoip_country_code country_name="$geoip_country_name" '
                         'city="$geoip_city" lat=$geoip_latitude lon=$geoip_longitude';

    server {
        listen 80;
        server_name example.com;

        access_log /var/log/nginx/access.log main_geoip;
        # ...
    }
}
  • Если в BitrixVM уже есть свой log_format, добавьте новый с другим именем (например, main_geoip) и используйте его только там, где нужно.

Заголовки для бекенда (nginx → Apache/PHP)

В location, где идёт proxy_pass на httpd или PHP-FPM, прокиньте переменные в заголовках:

location ~ \.php$ {
    proxy_pass http://127.0.0.1:8080;
    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_set_header X-GeoIP-Country      $geoip_country_code;
    proxy_set_header X-GeoIP-Country-Name  $geoip_country_name;
    proxy_set_header X-GeoIP-City         $geoip_city;
}
  • В PHP доступ: $_SERVER['HTTP_X_GEOIP_COUNTRY'], $_SERVER['HTTP_X_GEOIP_COUNTRY_NAME'], $_SERVER['HTTP_X_GEOIP_CITY'].

Подробнее: Как включить GeoIP в Nginx: переменные для логов и заголовков.