Estou usando o proxy reverso Nginx para Apache2 usando o seguintetutorial.
Então tento instalar o geoip no Nginx usando istotutorial
O proxy reverso funciona perfeitamente há algum tempo, até que tentei instalar o banco de dados geoip para obter o código do país em PHP.
Eu tenho o seguinte no nginx configurado conforme instruído pelo tutorial.
location ~ \.php$ {
# location / {
#fastcgi_pass unix:/run/php/php7.0-fpm.sock;
#include snippets/fastcgi-php.conf;
proxy_pass http://1.2.3.4:8080$request_uri;
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 GEOIP_COUNTRY_CODE $geoip_country_code;
proxy_set_header GEOIP_COUNTRY_CODE3 $geoip_country_code3;
proxy_set_header GEOIP_COUNTRY_NAME $geoip_country_name;
proxy_set_header GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
proxy_set_header GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
proxy_set_header GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
proxy_set_header GEOIP_REGION $geoip_region;
proxy_set_header GEOIP_CITY $geoip_city;
proxy_set_header GEOIP_POSTAL_CODE $geoip_postal_code;
proxy_set_header GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
proxy_set_header GEOIP_LATITUDE $geoip_latitude;
proxy_set_header GEOIP_LONGITUDE $geoip_longitude;
include /etc/nginx/proxy_params;
}
Se eu usar proxy_pass para Apache2, as variáveis GEOIP serão ** todas não mostradas no phpinfo.
Se eu usar o nginx fastcgi_pass diretamente (desativando o proxy reverso para o Apache), posso definir as variáveis de ambiente e elas serão refletidas no phpinfo.
Parece que proxy_set_header pode não estar funcionando porque o Apache não parece estar lendo.
O que devo fazer para que o Apache possa obter todas as variáveis?
Responder1
Parece que este tutorial e vários outros sites que copiam os códigos deste tutorial geoip nginx estão errados/desatualizados.
ao definir o cabeçalho do proxy, parece que você não pode usar sublinhado (_) e usar muse (-). Então, depois de mudar de
proxy_set_header GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
para isso
proxy_set_header GEOIP-CITY-COUNTRY-CODE $geoip_city_country_code;
O Apache é capaz de obter as variáveis e também está aparecendo no meu phpinfo agora.
Meu bloco de localização completo para php se parece com isso agora.
location ~ \.php$ {
proxy_pass http://1.2.3.4:8080$request_uri;
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 GEOIP-COUNTRY-CODE $geoip_country_code;
proxy_set_header GEOIP-COUNTRY-CODE3 $geoip_country_code3;
proxy_set_header GEOIP-COUNTRY-NAME $geoip_country_name;
proxy_set_header GEOIP-CITY-COUNTRY-CODE $geoip_city_country_code;
proxy_set_header GEOIP-CITY-COUNTRY-CODE3 $geoip_city_country_code3;
proxy_set_header GEOIP-CITY-COUNTRY-NAME $geoip_city_country_name;
proxy_set_header GEOIP-REGION $geoip_region;
proxy_set_header GEOIP-CITY $geoip_city;
proxy_set_header GEOIP-POSTAL_CODE $geoip_postal_code;
proxy_set_header GEOIP-CITY-CONTINENT-CODE $geoip_city_continent_code;
proxy_set_header GEOIP-LATITUDE $geoip_latitude;
proxy_set_header GEOIP-LONGITUDE $geoip_longitude;
include /etc/nginx/proxy_params;
}
Com as configurações acima, eu seria capaz de obter as seguintes variáveis de servidor com seus valores preenchidos. Observe que alguns servidores adicionaram o prefixo HTTP por motivos de segurança. E de alguma forma... os traços são convertidos novamente em sublinhados.
$_SERVER['HTTP_GEOIP_LONGITUDE']
$_SERVER['HTTP_GEOIP_LATITUDE']
$_SERVER['HTTP_GEOIP_CITY']
$_SERVER['HTTP_GEOIP_REGION']
$_SERVER['HTTP_GEOIP_CITY_COUNTRY_CODE']
$_SERVER['HTTP_GEOIP_COUNTRY_NAME']
$_SERVER['HTTP_GEOIP_COUNTRY_CODE3']
$_SERVER['HTTP_GEOIP_COUNTRY_CODE']