Hướng dẫn này giải thích cách sử dụng mô-đun GeoIP với nginx trên Ubuntu 16.04 để tìm hiểu khách truy cập của bạn đến từ đâu. Mô-đun GeoIP thiết lập nhiều biến như $geoip_country_name, $geoip_country_code, $geoip_city, v.v. mà bạn có thể sử dụng trong các tập lệnh PHP hoặc trực tiếp trong cấu hình nginx của mình, ví dụ để phục vụ nội dung bằng các ngôn ngữ khác nhau dựa trên quốc gia của người dùng.
Hướng dẫn này cũng tương thích với các thiết lập nginx ISPConfig.
Lưu ý dành cho người dùng Ubuntu:
Vì chúng ta phải chạy tất cả các bước trong hướng dẫn này với quyền root, nên chúng ta có thể thêm chuỗi sudo vào trước tất cả các lệnh trong hướng dẫn này hoặc chúng ta trở thành root ngay bây giờ bằng cách nhập
... và thêm các chỉ thị geoip_country và geoip_city vào vùng chứa http {}:
Chỉ thị geoip_country cung cấp các biến sau:
(Đảm bảo bạn có dòng include /etc/nginx/fastcgi_params; trong vùng chứa location ~ \.php$ {} trong cấu hình vhost của bạn, nếu không, cấu hình trên sẽ vô dụng đối với vhost của bạn.)
Nếu bạn sử dụng nginx làm proxy ngược và muốn truyền các biến GeoIP đến phần phụ trợ, bạn nên tạo/chỉnh sửa tệp /etc/nginx/proxy.conf...
... và thêm các dòng sau vào đó:
(Hãy đảm bảo bạn sử dụng dòng include /etc/nginx/proxy.conf; trong cấu hình proxy nginx của bạn vì nếu không, phần phụ trợ không thể sử dụng các biến GeoIP.)
Bây giờ hãy tải lại nginx...
... để các thay đổi có hiệu lực.
Khởi động lại PHP-FPM như sau:
Chúng ta có thể truy cập các biến GeoIP như sau:
Hoặc như thế này:
Gọi tệp đó trong trình duyệt (http://www.example.com/geoiptest.php) và bạn sẽ thấy GeoIP hoạt động (hãy đảm bảo rằng bạn đang gọi tệp từ địa chỉ IP công cộng, không phải địa chỉ IP cục bộ):
Bạn cũng có thể sử dụng trực tiếp các biến GeoIP trong cấu hình nginx, ví dụ như sau:
Trong ví dụ này, nếu khách truy cập đến từ Đức (mã quốc gia: DE) và tệp index_DE.html tồn tại, thì tệp này sẽ được phục vụ, nếu không, tệp index.html mặc định sẽ được phục vụ.
Điều này có thể được sử dụng để phục vụ nội dung bằng các ngôn ngữ khác nhau, dựa trên nguồn gốc của người dùng.
1 Lưu ý sơ bộ
Tôi đang sử dụng trang web www.example.com tại đây với thư mục gốc của tài liệu /var/www/www.example.com/web/ và tệp cấu hình vhost Nginx /etc/nginx/sites-enabled/www.example.com.vhost. Tôi sẽ sử dụng hướng dẫn này để thiết lập Ubuntu-Nginx cơ bản. https://www.howtoforge.com/tutorial...-php7-fpm-and-mysql-on-ubuntu-16.04-lts-lemp/Hướng dẫn này cũng tương thích với các thiết lập nginx ISPConfig.
Lưu ý dành cho người dùng Ubuntu:
Vì chúng ta phải chạy tất cả các bước trong hướng dẫn này với quyền root, nên chúng ta có thể thêm chuỗi sudo vào trước tất cả các lệnh trong hướng dẫn này hoặc chúng ta trở thành root ngay bây giờ bằng cách nhập
Mã:
sudo -s
2 Tìm hiểu xem Nginx có hỗ trợ GeoIP không
Trước khi bắt đầu, chúng ta phải tìm hiểu xem mô-đun GeoIP có được tích hợp vào máy chủ nginx của chúng ta không:
Mã:
nginx -V
Mã:
root@server1:~# nginx -V
phiên bản nginx: nginx/1.10.0 (Ubuntu)
được xây dựng với OpenSSL 1.0.2g-fips 1 tháng 3 năm 2016
Hỗ trợ TLS SNI được bật
cấu hình đối số: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
3 Tải xuống GeoIP Cơ sở dữ liệu
Trên Debian và Ubuntu, có gói geoip-database có thể được cài đặt thông qua apt, nhưng gói này hơi lỗi thời và chỉ chứa GeoIP.dat (cơ sở dữ liệu quốc gia), không phải GeoLiteCity.dat (cơ sở dữ liệu thành phố). Do đó, chúng ta không cài đặt gói đó mà tải xuống các bản sao mới từ trang web GeoIP vào thư mục /etc/nginx/geoip:
Mã:
mkdir /etc/nginx/geoip
Mã:
cd /etc/nginx/geoip
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
4 Cấu hình Nginx
Bây giờ chúng ta cấu hình nginx. Mở /etc/nginx/nginx.conf...
Mã:
nano /etc/nginx/nginx.conf
Mã:
[...]http {
##
# Thiết lập cơ bản
##
geoip_country /etc/nginx/geoip/GeoIP.dat; # cơ sở dữ liệu IP của quốc gia
geoip_city /etc/nginx/geoip/GeoLiteCity.dat; # cơ sở dữ liệu IP của thành phố[...]
- $geoip_country_code - mã quốc gia gồm hai chữ cái, ví dụ: RU, US.
- $geoip_country_code3 - mã quốc gia gồm ba chữ cái, ví dụ: RUS, USA.
- $geoip_country_name - tên (chi tiết) của quốc gia, ví dụ: Liên bang Nga, Hoa Kỳ, v.v.
- $geoip_city_country_code - mã quốc gia gồm hai chữ cái, ví dụ: RU, US.
- $geoip_city_country_code3 - mã quốc gia gồm ba chữ cái, ví dụ: RUS, USA.
- $geoip_city_country_name - tên quốc gia, ví dụ: Liên bang Nga, Hoa Kỳ - nếu có.
- $geoip_region - tên vùng (tỉnh, khu vực, tiểu bang, tỉnh, đất liên bang, v.v.), ví dụ: Thành phố Moscow, DC - nếu có.
- $geoip_city - tên thành phố, ví dụ: Moscow, Washington, Lisbon, v.v. - nếu có.
- $geoip_postal_code - mã zip hoặc mã bưu chính - nếu có.
- $geoip_city_continent_code - nếu có.
- $geoip_latitude - vĩ độ - nếu có.
- $geoip_longitude - kinh độ - nếu có.
Mã:
nano /etc/nginx/fastcgi_params
Mã:
[...]### ĐẶT Biến GEOIP ###fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;fastcgi_param GEOIP_REGION $geoip_region;fastcgi_param GEOIP_CITY $geoip_city;fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;fastcgi_param GEOIP_LATITUDE $geoip_latitude;fastcgi_param GEOIP_LONGITUDE $geoip_longitude;
Nếu bạn sử dụng nginx làm proxy ngược và muốn truyền các biến GeoIP đến phần phụ trợ, bạn nên tạo/chỉnh sửa tệp /etc/nginx/proxy.conf...
Mã:
nano /etc/nginx/proxy.conf
Mã:
[...]### ĐẶT Biến GEOIP ###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_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 ĐỊA LÝ_VĨ ĐỘ $geoip_latitude;proxy_set_header GEOIP_LONGITUDE $geoip_longitude;
Bây giờ hãy tải lại nginx...
Mã:
systemctl reload nginx.service
Khởi động lại PHP-FPM như sau:
Mã:
systemctl restart php7.0-fpm.service
5 Bài kiểm tra ngắn
Để xem mô-đun GeoIP có hoạt động chính xác không, chúng ta có thể tạo một tệp PHP nhỏ trong không gian web www.example.com của mình (ví dụ: /var/www/www.example.com/web):
Mã:
nano /var/www/www.example.com/web/geoiptest.php
Mã:
$geoip_country_code = getenv(GEOIP_COUNTRY_CODE);
Mã:
$geoip_country_code = $_SERVER['GEOIP_COUNTRY_CODE'];
Mã:
Bạn cũng có thể sử dụng trực tiếp các biến GeoIP trong cấu hình nginx, ví dụ như sau:
Mã:
nano /etc/nginx/sites-enabled/www.example.com.vhost
Mã:
[...] location / { index index.html index.php; try_files /index_$geoip_country_code.html /index.html; }[...]
Mã:
systemctl reload nginx.service
Điều này có thể được sử dụng để phục vụ nội dung bằng các ngôn ngữ khác nhau, dựa trên nguồn gốc của người dùng.
6 Liên kết
- nginx: http://nginx.org/
- Wiki nginx: http://wiki.nginx.org/
- Ubuntu: http://www.ubuntu.com/