Директор по глобальному трафику — нужна капелька DO с Ubuntu, LAMP и Nginx требуется помощь

Я пытался следовать Digital Ocean следующим примером:
https://www.digitalocean.com/community/tutorials/how-to-use-nginx-as-a-global-traffic-director-on-debian-or-ubuntu

Установив дроплет с Ubuntu и там уже LAMP стек.

Несмотря на то, что я настроил поверх стека LAMP Nginx, чтобы попытаться использовать базу данных GeoIP, когда я запускаю файл test.php, в котором содержится следующий код:

 <?php
if (getenv(HTTP_X_FORWARDED_FOR)) {
$sname = getenv(SERVER_NAME);
$sipaddress = getenv(SERVER_ADDR);
$pipaddress = getenv(HTTP_X_FORWARDED_FOR);
$ipaddress = getenv(REMOTE_ADDR);
echo "$sname server has address : $sipaddress";
echo "<br />\n";
echo "Your Proxy IP address is : ".$pipaddress. " (via $ipaddress) " ;
} else {
$servername = getenv(SERVER_NAME);
$serveripaddress = getenv(SERVER_ADDR);
$ipaddress = getenv(REMOTE_ADDR);
echo "$servername server has address : $serveripaddress";
echo "<br />\n";
echo "Your IP address is : $ipaddress";
}
$country = getenv(GEOIP_COUNTRY_NAME);
$country_code = getenv(GEOIP_COUNTRY_CODE);
echo "<br/>Your country : $country ( $country_code ) ";
?>

Я получаю следующий ответ в прямом эфире:

www.mydomain.com server has address : 12.34.56.78
Your IP address is : 87.65.43.21
Your country : ( )

Как видите, IP-адрес правильный, что показывает, что PHP работает нормально, но, к сожалению, ни одна из переменных GEOIP не работает, несмотря на то, что присутствует локально.

Итак, у меня есть вопрос:

  • Где я облажался?
  • Почему данные GeoIP не проходят через Nginx?

Вот несколько дополнительных шагов, которые я предпринял для настройки серверов.

Я переименовал файл конфигурации по умолчанию из / etc / nginx / sites-available для моего доменного имени и убедился, что создал новую ссылку на него в / etc / nginx / sites-enabled.

Тогда мой файл конфигурации выглядит следующим образом:

map $geoip_city_continent_code $closest_server {
default eu.mydomain.com;
US      US.mydomain.com;
AS      as.mydomain.com;
}

server {

server_name mydomain.com
www.mydomain.com
eu.mydomain.com
us.mydomain.com
as.mydomain.com;

if ($closest_server != $host) {
rewrite ^ $scheme://$closest_server$request_uri break;
}

listen 80 eu.mydomain.com;
listen [::]:80 eu.mydomain.com ipv6only=on;

root /var/www/html;
index index.html index.htm;

# Make site accessible from http://localhost/
server_name localhost;

Конечная цель состоит в том, чтобы иметь 3 сервера (США, Европа, Азия), чтобы один из них был центральным в ЕС и перенаправить на ближайший сервер, используя: us.mydomain.com или eu.mydomain.com или as.mydomain.com.

Я надеюсь, что это достаточно ясно, любые указатели будут великолепны!

Спасибо за ваше время.

0

Решение

Вместо этого я использовал стек LEMP при сборке капли и обнаружил некоторую недостающую информацию из документов Digital Ocean, а именно:

Добавьте обе эти строки в файл /etc/nginx/nginx.conf:

  • geoipcountry /usr/share/GeoIP/GeoIP.dat;
  • geoipcity /usr/share/GeoIP/GeoLiteCity.dat;

Затем в конце файла / etc / nginx / fastcgiparams добавьте:

fastcgiparam REDIRECTSTATUS 200;
fastcgiparam GEOIPADDR $remoteaddr;
fastcgiparam GEOIPCOUNTRYCODE $geoipcountrycode;
fastcgiparam GEOIPCOUNTRYNAME $geoipcountryname;
fastcgiparam GEOIPREGION $geoipregion;
fastcgiparam GEOIPREGIONNAME $geoipregionname;
fastcgiparam GEOIPCITY $geoipcity;
fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code; #EDIT
fastcgiparam GEOIPAREACODE $geoipareacode;
fastcgiparam GEOIPLATITUDE $geoiplatitude;
fastcgiparam GEOIPLONGITUDE $geoiplongitude;
fastcgiparam GEOIPPOSTALCODE $geoippostal_code;

Затем в / etc / nginx / sites-available / default различие между серверами в файлах по умолчанию также обрабатывается на уровне карты $ geoipcountrycode $ closest_server {следующим образом:

Редактирует !!

Американский сервер:

map $geoip_city_continent_code $closest_server {
default www.yourdomain.com;

AF      eu.yourdomain.com;  #Africa
AS      as.yourdomain.com;  #Asia
EU      eu.yourdomain.com;  #Europe
# NA      www.yourdomain.com;  #North America
OC      as.yourdomain.com;  #Oceania
# SA      www.yourdomain.com;  #South America
}

Европа сервер:

map $geoip_city_continent_code $closest_server {
default eu.yourdomain.com;

# AF      eu.yourdomain.com;  #Africa
AS      as.yourdomain.com;  #Asia
# EU      eu.yourdomain.com;  #Europe
NA      www.yourdomain.com;  #North America
OC      as.yourdomain.com;  #Oceania
SA      www.yourdomain.com;  #South America
}

Азия Сервер:

map $geoip_city_continent_code $closest_server {
default as.yourdomain.com;

AF      eu.yourdomain.com;  #Africa
# AS      as.yourdomain.com;  #Asia
EU      eu.yourdomain.com;  #Europe
NA      www.yourdomain.com;  #North America
# OC      as.yourdomain.com;  #Oceania
SA      www.yourdomain.com;  #South America
}

И это должно сделать это …

Вы также можете проверить свои настройки, добавив файл test.php, который имеет следующий код в теле:

<?php
if (getenv(HTTPXFORWARDEDFOR)) {
$pipaddress = getenv(HTTPXFORWARDEDFOR);
$ipaddress = getenv(REMOTEADDR);
echo "Your Proxy IP address is : ".$pipaddress. " (via $ipaddress) " ;
} else {
$ipaddress = getenv(REMOTEADDR);
echo "Your IP address is : $ipaddress";
}
$country = getenv(GEOIPCOUNTRYNAME);
$countrycode = getenv(GEOIPCOUNTRYCODE);
$geoip_city_continent_code = getenv(GEOIP_CITY_CONTINENT_CODE);
echo "<br/>Your country : $country ( $countrycode ) ";
echo "<br/>Your continent : $geoip_city_continent_code ";
?>

Который должен вернуть что-то вроде этого:

Your IP address is : 12.34.56.78
Your country : United States ( US )
Your continent : NA

Если вы находитесь в США и перенаправили вас на сайт www.yourdomain.com и т. Д.

РЕДАКТИРОВАТЬ 2 — Для многосайтовой обработки

Это структурировано для обслуживания различных серверов с кодом страны для субдомена, в данном случае us.domain.com для сервера us …

map $geoip_city_continent_code $closest_server {
AF      eu.domain.com;  #Africa
AS      as.domain.com;  #Asia
EU      eu.domain.com;  #Europe
NA      us.domain.com;  #North America
OC      as.domain.com;  #Oceania
SA      us.domain.com;  #South America
}

# retoute http://domain.com and http://www.domain.com to http://us.domain.com
server {

listen 80 default_server; # only for one of the local domains other wise the others should only be: listen 80;
listen [::]:80 default_server ipv6only=on; # only for one of the local domains other wise the others should only be: listen [::]:80;

server_name domain.com
www.domain.com;

return 301 http://us.domain.com$request_uri;
}

# handles
server {
listen 80;
listen [::]:80;

root /var/www/domain.com/html;
index index.php index.html index.htm;

# Make site accessible from http://localhost/
server_name  us.domain.com;

# firs part of dual condition check.
# checks in the incoming host (us.domain.com) is not equal to $closest_server depending on contry code
if ($closest_server != $host) {
set $test  A;
}

#second part of dual condition checks that the incoming host us.domain.com is the same as the server_name so that there is no messing around with other domain names
if ($host ~* $server_name) {
set $test  "${test}B";
}

# checks that the above 2 conditions are met and if so redirect to other global server with appropriate subdomain eu.domain.com or whatever you set up
if ($test = AB) {
rewrite ^ $scheme://$closest_server$request_uri break;
}

# otherwise you are at the closest server and so serve the data
location / {
try_files $uri $uri/ =404;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]