Я пытался следовать 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 не работает, несмотря на то, что присутствует локально.
Итак, у меня есть вопрос:
Вот несколько дополнительных шагов, которые я предпринял для настройки серверов.
Я переименовал файл конфигурации по умолчанию из / 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.
Я надеюсь, что это достаточно ясно, любые указатели будут великолепны!
Спасибо за ваше время.
Вместо этого я использовал стек LEMP при сборке капли и обнаружил некоторую недостающую информацию из документов Digital Ocean, а именно:
Добавьте обе эти строки в файл /etc/nginx/nginx.conf:
Затем в конце файла / 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;
}
Других решений пока нет …