 #  Configuring Apache2 and NGINX with MaxMind GeoIP2 

 

- Extension Page: [System - EU e-Privacy Directive](/software/joomla/plugins/system-eu-e-privacy-directive)

An upcoming feature of the Joomla [System - EU e-Privacy Directive](/software/joomla/plugins/system-eu-e-privacy-directive) plugin supports multiple location detection methods, ensuring compliance with GDPR and the EU e-Privacy Directive. For Joomla sites relying on caching (e.g., Varnish), integrating MaxMind’s GeoIP2 datasets with Apache2 or NGINX allows administrators to inject geolocation data into the Server-Timing HTTP header (e.g., Server-Timing: geo\_eu;desc="1") post-cache. This server-side approach avoids client-side cookies, maintains cache efficiency, and enables the plugin to detect EU/EEA visitors for targeted consent banners.

### Why Server-Timing?

The Server-Timing header is uniquely accessible to JavaScript via the Performance API, making it ideal for injecting geolocation data without altering cached content. This ensures fast, efficient, and privacy-compliant detection of EU visitors, with minimal performance overhead (~1-5ms).

This guide focuses on configuring MaxMind’s [geoipupdate tool](https://github.com/maxmind/geoipupdate) to maintain GeoLite2 databases and setting up Apache2 or NGINX to deliver the geo\_eu metric in the Server-Timing header for the Joomla plugin. We assume a Linux environment (e.g., Ubuntu/Debian) and that you’ve followed MaxMind’s installation instructions.

## Step 1: Install and Configure geoipupdate

The geoipupdate tool keeps MaxMind’s GeoLite2 databases up-to-date, providing the geolocation data needed for server-side lookups.

### Prerequisites

- Follow the [official installation instructions](https://github.com/maxmind/geoipupdate) for your distribution (e.g., sudo add-apt-repository ppa:maxmind/ppa &amp;&amp; sudo apt update &amp;&amp; sudo apt install geoipupdate for Ubuntu/Debian).
- Register for a free MaxMind account at [maxmind.com](https://www.maxmind.com/en/account) to obtain your Account ID and License Key.
 
### Configuration

Edit /etc/GeoIP.conf (default location):

 

 

 

 ```
AccountID your_account_id
LicenseKey your_license_key
EditionIDs GeoLite2-Country
DatabaseDirectory /usr/share/GeoIP
```

 

 

 

 

 

- Ensure the directory /usr/share/GeoIP/ exists: sudo mkdir -p /usr/share/GeoIP.
- Test the setup: sudo geoipupdate -f /etc/GeoIP.conf. Verify the database at /usr/share/GeoIP/GeoLite2-Country.mmdb.
- Automate updates with a cron job: Add to sudo crontab -e:  
     ```
    0 2 * * 0 /usr/bin/geoipupdate -f /etc/GeoIP.conf
    ```
 
This runs weekly at 2 AM Sunday. Alternatively, if your package includes a systemd service, enable it: sudo systemctl enable geoipupdate.

## Step 2: NGINX Configuration

NGINX uses the ngx\_http\_geoip2\_module for GeoIP2 lookups and headers-more-nginx-module to set the Server-Timing header, injecting EU/EEA detection post-cache.

### Prerequisites

- Install required modules (Ubuntu/Debian example):  
     ```
    sudo apt install libnginx-mod-http-geoip2 libnginx-mod-http-headers-more-filter
    ```
- Ensure /usr/share/GeoIP/GeoLite2-Country.mmdb exists.
- Restart NGINX: sudo systemctl restart nginx.
 
### Configuration

Add the GeoIP2 configuration to the http block in /etc/nginx/nginx.conf or a separate file like /etc/nginx/conf.d/geoip2.conf:

 ```
http {
    geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
        auto_reload 24h;
        $geoip2_data_country_is_eu default=0 country is_in_european_union;
        $geoip2_data_country_iso country iso_code;  # Optional for debugging
    }
}
```

In your server block (e.g., /etc/nginx/sites-available/default), add:

 ```
server {
    listen 80;
    server_name example.com;

    add_header Server-Timing "remote_addr;desc=\"$remote_addr\",geo_eu;desc=\"$geoip2_data_country_is_eu\"";

    # Existing location blocks (e.g., proxy_pass or root)
    location / {
        # Your configuration here
    }
}
```

This sets geo\_eu to 1 for EU/EEA countries (e.g., DE, FR) or 0 otherwise, with remote\_addr for debugging. Test with:

 ```
curl -H "X-Real-IP: 141.52.0.0" -I https://your-domain.com
```

Expect: server-timing: remote\_addr;desc="141.52.0.0",geo\_eu;desc="1" (Germany). For a non-EU IP (e.g., 8.8.8.8), expect geo\_eu;desc="0".

## Step 3: Apache2 Configuration

Apache2 uses mod\_maxminddb for GeoIP2 lookups and mod\_headers to inject the Server-Timing header, compatible with cached responses.

### Prerequisites

- Install dependencies (Ubuntu/Debian):  
     ```
    sudo apt install apache2 libmaxminddb-dev libapache2-mod-maxminddb
    ```
- Enable modules: sudo a2enmod maxminddb headers &amp;&amp; sudo systemctl restart apache2.
- Verify /usr/share/GeoIP/GeoLite2-Country.mmdb exists.
 
### Configuration

Add to your virtual host (e.g., /etc/apache2/sites-available/000-default.conf):

 ```
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    # Enable MaxMind GeoIP2
    MaxMindDBEnable On
    MaxMindDBEnv GEOIP_COUNTRY_IS_EU default=0 country is_in_european_union /usr/share/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBEnv GEOIP_COUNTRY_CODE country iso_code /usr/share/GeoIP/GeoLite2-Country.mmdb  # Optional for debugging

    # Add Server-Timing header
    <IfModule mod_headers.c>
        Header always append Server-Timing "remote_addr;desc=%{REMOTE_ADDR}e,geo_eu;desc=%{GEOIP_COUNTRY_IS_EU}e"
    </IfModule>

    # Existing <Directory> or proxy settings
</VirtualHost>
```

Test with:

 ```
curl -H "X-Forwarded-For: 141.52.0.0" -I https://your-domain.com
```

Expect: server-timing: remote\_addr;desc="141.52.0.0",geo\_eu;desc="1". For non-EU IPs (e.g., 8.8.8.8), expect geo\_eu;desc="0".

## Step 4: Testing and Joomla Configuration

Verify the Server-Timing header using:

- Browser Dev Tools (Network &gt; Headers) to inspect responses.
- CLI: curl -I https://your-domain.com.
 
The header should appear as:

 ```
server-timing: remote_addr;desc="1.2.3.4",geo_eu;desc="0"
```

For EU IPs, geo\_eu will be 1. Secure against IP spoofing in production by configuring your proxy or firewall to trust only valid X-Real-IP or X-Forwarded-For headers.

In the Joomla Administrator panel, configure the System - EU e-Privacy Directive plugin:

- **GeoIP**: Set to **Yes**.
- **GeoIP Service**: Set to **Server Timing**.
 
This enables the plugin to read geo\_eu and apply EU-specific logic (e.g., consent banners for countries in the EU).

## Best Practices

- **Caching**: Place GeoIP2 lookups after cache layers (e.g., Varnish/CDN) to preserve cache hits.
- **Database Updates**: Monitor /var/log/geoipupdate.log for errors. Ensure weekly updates via cron or systemd.
- **Security**: Prevent header spoofing by validating client IPs at the proxy level.
- **Performance**: GeoIP2 lookups are lightweight, but test with tools like ab or wrk for high-traffic sites.
- **Compliance**: This cookie-free approach aligns with e-Privacy goals, but consult legal experts for full compliance.
 
For troubleshooting, refer to MaxMind’s [documentation](https://dev.maxmind.com/geoip/updating-databases) or server logs (/var/log/nginx/error.log or /var/log/apache2/error.log).

 

- [      email ](mailto:?subject=Configuring+Apache2+and+NGINX+with+MaxMind+GeoIP2&body=https%3A%2F%2Fwww.richeyweb.com%2Fsoftware%2Fdocumentation%2Fconfiguring-apache2-and-nginx-with-maxmind-geoip2)
- [      facebook ](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.richeyweb.com%2Fsoftware%2Fdocumentation%2Fconfiguring-apache2-and-nginx-with-maxmind-geoip2)
- [      x-twitter ](https://twitter.com/intent/tweet?text=Configuring+Apache2+and+NGINX+with+MaxMind+GeoIP2%3A+https%3A%2F%2Fwww.richeyweb.com%2Fsoftware%2Fdocumentation%2Fconfiguring-apache2-and-nginx-with-maxmind-geoip2)
- [      linkedin ](http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.richeyweb.com%2Fsoftware%2Fdocumentation%2Fconfiguring-apache2-and-nginx-with-maxmind-geoip2&title=Configuring+Apache2+and+NGINX+with+MaxMind+GeoIP2&summary=An+upcoming+feature+of+the+Joomla+System+-+EU+e-Pr...)
- [      pinterest ](http://pinterest.com/pin/create/button/?url=https%3A%2F%2Fwww.richeyweb.com%2Fsoftware%2Fdocumentation%2Fconfiguring-apache2-and-nginx-with-maxmind-geoip2&media=https%3A%2F%2Fcdn.joomla.org%2Fimages%2Fjoomla-org-og.jpg&description=Configuring+Apache2+and+NGINX+with+MaxMind+GeoIP2)
 


 

   [  Previous article: CLI - Reminder Documentation   CLI - Reminder Documentation ](/software/documentation/cli-reminder) [  Next article: Console - Indexing API Documentation  Console - Indexing API Documentation  ](/software/documentation/console-indexing-api)  

##### We Value Your Privacy

 

We use cookies to enhance your experience and for traffic analysis. By continuing to visit this site you agree to our use of cookies.

[Privacy Policy](/privacy-policy)

 Details 

###### Google Tag Manager Items

- Ad Storage
- Ad User Data
- Ad Personalization
- Analytics Storage
- Functionality Storage
- Personalization Storage
- Security Storage
 
 

 

 

 

 

 Decline Accept
```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://www.richeyweb.com/#organization","name":"RicheyWeb","url":"https://www.richeyweb.com/","logo":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/logo/richeyweb.svg","contentUrl":"https://www.richeyweb.com/images/logo/richeyweb.svg","width":{"@type":"QuantitativeValue","value":38,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":38,"unitCode":"PX"},"@id":"https://www.richeyweb.com/#logo"},"image":{"@id":"https://www.richeyweb.com/#logo"},"sameAs":["https://x.com/ComRicheyweb","https://www.facebook.com/RicheyWebDev/","https://www.youtube.com/channel/UCxnVG8BwOvQRO7hVqNX7T2g","https://community.joomla.org/service-providers-directory/listings/115:richeyweb.html"],"description":"RicheyWeb is a custom software developer specializing in Joomla extensions.","ContactPoint":[{"@type":"ContactPoint","url":"https://www.richeyweb.com/contact-us","telephone":"903-873-8460","contactType":"Owner/Administrator","areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"availableLanguage":"en"},{"@type":"ContactPoint","url":"https://www.richeyweb.com/bugs","telephone":"903-873-8460","contactType":"Technical Support","areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"availableLanguage":"en"}],"knowsAbout":["Computer programming",{"@type":"Thing","name":"Computer programming","sameAs":["https://en.wikipedia.org/wiki/Computer_programming","https://www.wikidata.org/wiki/Q80006","https://g.co/kg/m/01mf_"]},"PHP",{"@type":"Thing","name":"PHP","sameAs":["https://en.wikipedia.org/wiki/PHP","https://www.wikidata.org/wiki/Q59","https://g.co/kg/m/060kv"]},"JavaScript",{"@type":"Thing","name":"JavaScript","sameAs":["https://en.wikipedia.org/wiki/JavaScript","https://www.wikidata.org/wiki/Q2005","https://g.co/kg/m/02p97"]},"arduino","Computer forensics",{"@type":"Thing","name":"Computer forensics","sameAs":["https://en.wikipedia.org/wiki/Computer_forensics","https://www.wikidata.org/wiki/Q878553","https://g.co/kg/m/02wxbd"]},"White hat",{"@type":"Thing","name":"White hat","sameAs":["https://en.wikipedia.org/wiki/White_hat_(computer_security)","https://www.wikidata.org/wiki/Q7995625","https://g.co/kg/m/03ns_5"]},"Search engine optimization",{"@type":"Thing","name":"Search engine optimization","sameAs":["https://en.wikipedia.org/wiki/Search_engine_optimization","https://www.wikidata.org/wiki/Q180711","https://g.co/kg/m/019qb_"]},"Search engine marketing",{"@type":"Thing","name":"Search engine marketing","sameAs":["https://en.wikipedia.org/wiki/Search_engine_marketing","https://www.wikidata.org/wiki/Q846132","https://g.co/kg/m/06mw8r"]},"Digital marketing",{"@type":"Thing","name":"Digital marketing","sameAs":["https://en.wikipedia.org/wiki/Digital_marketing","https://www.wikidata.org/wiki/Q1323528","https://g.co/kg/g/122hcnps"]},"Web hosting service",{"@type":"Thing","name":"Web hosting service","sameAs":["https://en.wikipedia.org/wiki/Web_hosting_service","https://www.wikidata.org/wiki/Q5892272","https://g.co/kg/m/014pz4"]},"Email hosting service",{"@type":"Thing","name":"Email hosting service","sameAs":["https://en.wikipedia.org/wiki/Email_hosting_service","https://www.wikidata.org/wiki/Q5368818","https://g.co/kg/m/09w60m"]},"Internet hosting service",{"@type":"Thing","name":"Internet hosting service","sameAs":["https://en.wikipedia.org/wiki/Internet_hosting_service","https://www.wikidata.org/wiki/Q1210425","https://g.co/kg/m/09w5yw"]},"Virtual hosting",{"@type":"Thing","name":"Virtual hosting","sameAs":["https://en.wikipedia.org/wiki/Virtual_hosting","https://www.wikidata.org/wiki/Q588365","https://g.co/kg/m/024mvh"]},"Web performance",{"@type":"Thing","name":"Web performance","sameAs":["https://en.wikipedia.org/wiki/Web_performance","https://www.wikidata.org/wiki/Q7978612","https://g.co/kg/m/0gfj3f1"]},"Web content management system",{"@type":"Thing","name":"Web content management system","sameAs":["https://en.wikipedia.org/wiki/Web_content_management_system","https://www.wikidata.org/wiki/Q45211","https://g.co/kg/m/0615s2"]},"Content management system",{"@type":"Thing","name":"Content management system","sameAs":["https://en.wikipedia.org/wiki/Content_management_system","https://www.wikidata.org/wiki/Q131093","https://g.co/kg/m/0k23c"]},"General Data Protection Regulation",{"@type":"Thing","name":"General Data Protection Regulation","sameAs":["https://en.wikipedia.org/wiki/General_Data_Protection_Regulation","https://www.wikidata.org/wiki/Q1172506","https://g.co/kg/m/0pk_7xs"]},"SERP",{"@type":"Thing","name":"SERP","sameAs":["https://en.wikipedia.org/wiki/SERP","https://www.wikidata.org/wiki/Q2205811","https://g.co/kg/g/11c5szp7kc"]},"Artificial intelligence",{"@type":"Thing","name":"Artificial intelligence","sameAs":["https://en.wikipedia.org/wiki/Artificial_intelligence","https://www.wikidata.org/wiki/Q11660","https://g.co/kg/m/0mkz"]},"Prompt engineering",{"@type":"Thing","name":"Prompt engineering","sameAs":["https://en.wikipedia.org/wiki/Prompt_engineering","https://www.wikidata.org/wiki/Q108941486","https://g.co/kg/g/11p6kpgt_n"]},"E-learning",{"@type":"Thing","name":"E-learning","sameAs":["https://en.wikipedia.org/wiki/E-learning_(theory)","https://www.wikidata.org/wiki/Q182250","https://g.co/kg/g/122czm1f"]},"Sharable Content Object Reference Model",{"@type":"Thing","name":"Sharable Content Object Reference Model","sameAs":["https://en.wikipedia.org/wiki/Sharable_Content_Object_Reference_Model","https://www.wikidata.org/wiki/Q827811","https://g.co/kg/m/06_40"]},"Experience API",{"@type":"Thing","name":"Experience API","sameAs":["https://en.wikipedia.org/wiki/Experience_API","https://www.wikidata.org/wiki/Q7807728","https://g.co/kg/g/1yw9ktxr8"]},"Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]},"Nginx",{"@type":"Thing","name":"Nginx","sameAs":["https://en.wikipedia.org/wiki/Nginx","https://www.wikidata.org/wiki/Q306144","https://g.co/kg/m/02qft91"]},"MySQL",{"@type":"Thing","name":"MySQL","sameAs":["https://en.wikipedia.org/wiki/MySQL","https://www.wikidata.org/wiki/Q850","https://g.co/kg/m/04y3k"]}],"areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"memberOf":["Mensa International",{"@type":"Organization","name":"Mensa International","sameAs":["https://en.wikipedia.org/wiki/Mensa_International","https://www.wikidata.org/wiki/Q184194","https://g.co/kg/m/0140pf"]},"National Rifle Association",{"@type":"Organization","name":"National Rifle Association","sameAs":["https://en.wikipedia.org/wiki/National_Rifle_Association","https://www.wikidata.org/wiki/Q863259","https://g.co/kg/m/0j6f9"]},"CompTIA",{"@type":"Organization","name":"CompTIA","sameAs":["https://en.wikipedia.org/wiki/CompTIA","https://www.wikidata.org/wiki/Q597534","https://g.co/kg/m/040shq"]},"ISFCE LLC",{"@type":"Organization","name":"ISFCE LLC","sameAs":["https://isfce.com","https://g.co/kg/g/11wxm5r0rg"]}],"hasCredential":[{"@type":"EducationalOccupationalCredential","name":"Joomla 3 Certified Administrator","credentialCategory":"Certification","description":"Administrator Exam is the first available Joomla! certification exam","recognizedBy":{"@type":"Organization","name":"Open Source Matters, Inc.","sameAs":["https://en.wikipedia.org/wiki/Open_Source_Matters,_Inc.","https://g.co/kg/g/11f00wvjhz"]},"url":"https://certification.joomla.org/certified-user-directory/michael-richey","about":["Content management system",{"@type":"Thing","name":"Content management system","sameAs":["https://en.wikipedia.org/wiki/Content_management_system","https://www.wikidata.org/wiki/Q131093","https://g.co/kg/m/0k23c"]},"Web content management system",{"@type":"Thing","name":"Web content management system","sameAs":["https://en.wikipedia.org/wiki/Web_content_management_system","https://www.wikidata.org/wiki/Q45211","https://g.co/kg/m/0615s2"]},"Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]}],"educationalLevel":"expert","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/contact/badge.webp","contentUrl":"https://www.richeyweb.com/images/contact/badge.webp","width":{"@type":"QuantitativeValue","value":300,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":86,"unitCode":"PX"},"caption":"Joomla 3 Certified Administrator"}},{"@type":"EducationalOccupationalCredential","name":"Certified Computer Examiner","credentialCategory":"Certification","description":"Internationally recognized computer forensics certifiecation","recognizedBy":{"@type":"Organization","name":"ISFCE LLC","sameAs":["https://en.wikipedia.org/wiki/ISFCE_LLC","https://g.co/kg/g/11wxm5r0rg"]},"url":"https://isfce.com/","about":["Digital forensics",{"@type":"Thing","name":"Digital forensics","sameAs":["https://en.wikipedia.org/wiki/Digital_forensics","https://www.wikidata.org/wiki/Q3246940","https://g.co/kg/m/0cnxzfx"]},"Computer forensics",{"@type":"Thing","name":"Computer forensics","sameAs":["https://en.wikipedia.org/wiki/Computer_forensics","https://www.wikidata.org/wiki/Q878553","https://g.co/kg/m/02wxbd"]},"Mobile device forensics",{"@type":"Thing","name":"Mobile device forensics","sameAs":["https://en.wikipedia.org/wiki/Mobile_device_forensics","https://www.wikidata.org/wiki/Q6887097","https://g.co/kg/m/06zp3tp"]},"Network forensics",{"@type":"Thing","name":"Network forensics","sameAs":["https://en.wikipedia.org/wiki/Network_forensics","https://www.wikidata.org/wiki/Q7001032","https://g.co/kg/m/05pb280"]},"Database forensics",{"@type":"Thing","name":"Database forensics","sameAs":["https://en.wikipedia.org/wiki/Database_forensics","https://www.wikidata.org/wiki/Q5227405","https://g.co/kg/m/0cgqsy"]}],"educationalLevel":"expert","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/contact/isfce-cce.webp","contentUrl":"https://www.richeyweb.com/images/contact/isfce-cce.webp","width":{"@type":"QuantitativeValue","value":150,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":150,"unitCode":"PX"},"caption":"Certified Computer Examiner"}}],"hasOfferCatalog":{"@type":"OfferCatalog","name":"Web Services","itemListElement":[{"@type":"Offer","itemOffered":{"@type":"Service","name":"Hosting"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Development"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Search Engine Optimization"}}]}},{"@type":"WebSite","@id":"https://www.richeyweb.com/#website","url":"https://www.richeyweb.com/","name":"RicheyWeb","publisher":{"@id":"https://www.richeyweb.com/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.richeyweb.com/search?q={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string","valueMaxLength":256,"valueMinLength":2,"valuePattern":"^[A-Za-z0-9\\s]+$"}},"creator":{"@id":"https://www.richeyweb.com/#organization"},"copyrightHolder":{"@id":"https://www.richeyweb.com/#organization"}},{"@type":"WebPage","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#webpage","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2","name":"Configuring Apache2 and NGINX with MaxMind GeoIP2","description":"Configure Apache2 & NGINX with MaxMind GeoIP2 to add Server-Timing headers for Joomla EU e-Privacy Directive, ensuring GDPR compliance and cache efficiency.","isPartOf":{"@id":"https://www.richeyweb.com/#website"},"about":{"@id":"https://www.richeyweb.com/#organization"},"inLanguage":"en-GB"},{"@type":"Article","headline":"Configuring Apache2 and NGINX with MaxMind GeoIP2","description":"Configure Apache2 & NGINX with MaxMind GeoIP2 to add Server-Timing headers for Joomla EU e-Privacy Directive, ensuring GDPR compliance and cache efficiency.","author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"},"datePublished":"2025-10-12T00:00:00+00:00","dateModified":"2025-11-24T00:00:00+00:00","about":["Web server",{"@type":"Thing","name":"Web server","sameAs":["https://en.wikipedia.org/wiki/Web_server","https://www.wikidata.org/wiki/Q11288","https://g.co/kg/m/083hh"]},"Apache HTTP Server",{"@type":"Thing","name":"Apache HTTP Server","sameAs":["https://en.wikipedia.org/wiki/Apache_HTTP_Server","https://www.wikidata.org/wiki/Q11354","https://g.co/kg/m/0_h2"]},"Nginx",{"@type":"Thing","name":"Nginx","sameAs":["https://en.wikipedia.org/wiki/Nginx","https://www.wikidata.org/wiki/Q306144","https://g.co/kg/m/02qft91"]},"MaxMind",{"@type":"Corporation","name":"MaxMind","sameAs":["https://en.wikipedia.org/wiki/MaxMind","https://www.wikidata.org/wiki/Q25022243","https://g.co/kg/g/11cmttz01t"]},"Internet geolocation",{"@type":"Thing","name":"Internet geolocation","sameAs":["https://en.wikipedia.org/wiki/Internet_geolocation","https://www.wikidata.org/wiki/Q916335","https://g.co/kg/m/04dj3q"]},"Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]}],"mentions":["Debian GNU Linux","General Data Protection Regulation",{"@type":"Book","name":"General Data Protection Regulation","sameAs":["https://en.wikipedia.org/wiki/General_Data_Protection_Regulation","https://www.wikidata.org/wiki/Q1172506","https://g.co/kg/m/0pk_7xs"]},"ePrivacy Directive",{"@type":"Book","name":"ePrivacy Directive","sameAs":["https://en.wikipedia.org/wiki/EPrivacy_Directive","https://www.wikidata.org/wiki/Q1744072","https://g.co/kg/m/02qv74_"]},"Ubuntu",{"@type":"Thing","name":"Ubuntu","sameAs":["https://en.wikipedia.org/wiki/Ubuntu","https://www.wikidata.org/wiki/Q381","https://g.co/kg/m/03x5qm"]},"Varnish",{"@type":"Thing","name":"Varnish","sameAs":["https://en.wikipedia.org/wiki/Varnish_(software)","https://www.wikidata.org/wiki/Q81683","https://g.co/kg/m/0279z4k"]},"Internet geolocation",{"@type":"Thing","name":"Internet geolocation","sameAs":["https://en.wikipedia.org/wiki/Internet_geolocation","https://www.wikidata.org/wiki/Q916335","https://g.co/kg/m/04dj3q"]}],"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#article","isPartOf":{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#webpage"},"publisher":{"@id":"https://www.richeyweb.com/#organization"},"articleSection":"Documentation","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2","hasPart":[{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-why-server-timing_3_1"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-step-1-install-and-configure-geoipupdate_2_2"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-prerequisites_3_3"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-configuration_3_4"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-step-2-nginx-configuration_2_5"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-prerequisites_3_6"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-configuration_3_7"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-step-3-apache2-configuration_2_8"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-prerequisites_3_9"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-configuration_3_10"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-step-4-testing-and-joomla-configuration_2_11"},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-best-practices_2_12"}]},{"@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex","@type":"ItemList","name":"Configuring Apache2 and NGINX with MaxMind GeoIP2","numberOfItems":12,"itemListElement":[{"@type":"ListItem","position":1,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-why-server-timing_3_1","name":"Why Server-Timing?","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-why-server-timing_3_1"}},{"@type":"ListItem","position":2,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-step-1-install-and-configure-geoipupdate_2_2","name":"Step 1: Install and Configure geoipupdate","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-step-1-install-and-configure-geoipupdate_2_2"}},{"@type":"ListItem","position":3,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-prerequisites_3_3","name":"Prerequisites","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-prerequisites_3_3"}},{"@type":"ListItem","position":4,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-configuration_3_4","name":"Configuration","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-configuration_3_4"}},{"@type":"ListItem","position":5,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-step-2-nginx-configuration_2_5","name":"Step 2: NGINX Configuration","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-step-2-nginx-configuration_2_5"}},{"@type":"ListItem","position":6,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-prerequisites_3_6","name":"Prerequisites","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-prerequisites_3_6"}},{"@type":"ListItem","position":7,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-configuration_3_7","name":"Configuration","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-configuration_3_7"}},{"@type":"ListItem","position":8,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-step-3-apache2-configuration_2_8","name":"Step 3: Apache2 Configuration","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-step-3-apache2-configuration_2_8"}},{"@type":"ListItem","position":9,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-prerequisites_3_9","name":"Prerequisites","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-prerequisites_3_9"}},{"@type":"ListItem","position":10,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-configuration_3_10","name":"Configuration","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-configuration_3_10"}},{"@type":"ListItem","position":11,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-step-4-testing-and-joomla-configuration_2_11","name":"Step 4: Testing and Joomla Configuration","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-step-4-testing-and-joomla-configuration_2_11"}},{"@type":"ListItem","position":12,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#articleindex-toc-best-practices_2_12","name":"Best Practices","url":"https://www.richeyweb.com/software/documentation/configuring-apache2-and-nginx-with-maxmind-geoip2#toc-best-practices_2_12"}}]}]}
```
