Tide Data for Station: Matlacha Pass (bascule bridge), Florida
| Time (Local) | Height (ft) | Type |
|---|---|---|
| 2026-03-09 01:27 | -0.347 | L |
| 2026-03-09 08:12 | 0.809 | H |
| 2026-03-09 12:02 | 0.543 | L |
| 2026-03-09 17:30 | 1.495 | H |
| Time (Local) | Height (ft) | Type |
|---|---|---|
| 2026-03-09 01:27 | -0.347 | L |
| 2026-03-09 08:12 | 0.809 | H |
| 2026-03-09 12:02 | 0.543 | L |
| 2026-03-09 17:30 | 1.495 | H |
While there is no single, universally recognized “2nd hand” guide, a wealth of information exists on how to use AI effectively, ranging from foundational principles to advanced techniques. The key is adopting a strategic and iterative approach to your prompts, rather than viewing AI as a mind-reader.
Core principles for effective AI use
Advanced prompting techniques
1. Provide structure and context
Instead of a vague command, give the AI a clear framework to follow.
2. Encourage deeper reasoning
For complex or multi-step tasks, ask the AI to show its work.
3. Build a system, not a single prompt
Productive AI use involves a multi-prompt strategy.
Best practices for working with AI
Experiment and develop a practical guide for diagnosing and stopping abusive bot traffic that pegs PHP-FPM on WordPress.
Example domains used: example.com (primary).
Date: 04 Sep 2025
Our experiment began on , example.com we simulated abusive bot traffic targeting
/w/ and /w/index.php (paths used by MediaWiki). Because the site runs WordPress, these requests
fell through to PHP, driving PHP-FPM CPU to 100% and slowing responses.
What we did:
/w, /w/, and anything under /w/…./xmlrpc.php (safe if Jetpack/remote publishing is not used)./wp-login.php with a Managed Challenge (or IP allow-list).Result: /w/* no longer reaches origin; PHP-FPM load normalized; key pages serve with
CF-Cache-Status: HIT.
example.com pool.example.com. example-two.com also showed noisy login/XML-RPC hits.ps -eo pcpu,pmem,args --no-headers \
| awk '/php-fpm: pool/ {pool=$NF; cpu[pool]+=$1; mem[pool]+=$2; n[pool]++} \
END {for (p in cpu) printf "%6.1f%% CPU %6.1f%% MEM %2d procs %s\n", cpu[p], mem[p], n[p], p}' \
| sort -nr
tail -n 20000 /var/www/vhosts/system/example.com/logs/*access* 2>/dev/null \
| awk '{print $7}' | cut -d? -f1 | sort | uniq -c | sort -nr | head
FROM="04/Sep/2025:16:55"; TO="04/Sep/2025:17:01"
awk -v f="$FROM" -v t="$TO" '$4~/\[/ {ts=substr($4,2,20); if(ts>=f&&ts<=t) print $7}' \
/var/www/vhosts/system/example.com/logs/access_log \
/var/www/vhosts/system/example.com/logs/access_ssl_log \
| cut -d? -f1 | sort | uniq -c | sort -nr | head
Finding: Clustered /w/ and /w/index.php requests via Cloudflare edge IPs (bot traffic through the proxy).
Automated crawl/attack requested MediaWiki edit paths on a WordPress site. Each request invoked PHP (Apache → PHP-FPM), saturating CPU.
/w/*Cloudflare → Security → WAF → Custom rules → Create rule
Expression:
(http.request.uri.path in {"/w", "/w/"} or starts_with(http.request.uri.path, "/w/"))
/w and /w/ exactly, plus /w/index.php, but does not match /wp-login.php or /winner.(http.request.uri.path eq "/xmlrpc.php")
Action: Block
(http.request.uri.path eq "/wp-login.php") → Managed Challenge(http.request.uri.path eq "/wp-login.php") and not ip.src in {YOUR.PUBLIC.IP} → Block/ChallengeCloudflare → Caching → Cache Rules → Create rule
Match (AND all):
/wp-admin/wp-login.php/xmlrpc.phppreview=truewordpress_logged_in_comment_author_Then: Cache eligibility: Eligible for cache; Edge TTL: (use plan minimum, e.g., 2 hours); enable “Serve stale while revalidating”.
Raw expression (equivalent):
not starts_with(http.request.uri.path, "/wp-admin")
and http.request.uri.path ne "/wp-login.php"
and http.request.uri.path ne "/xmlrpc.php"
and not (http.request.uri.query contains "preview=true")
and not any(http.request.headers["cookie"][*] contains "wordpress_logged_in_")
and not any(http.request.headers["cookie"][*] contains "comment_author_")
Effect: Anonymous page views come from Cloudflare’s edge (CF-Cache-Status: HIT), dramatically reducing origin PHP load.
/w/* eliminated:
tail -n 500 /var/www/vhosts/system/example.com/logs/access_* 2>/dev/null \
| awk '{print $7}' | cut -d? -f1 | grep -E '^/w(/|$)' | wc -l
ps -eo pcpu,pmem,args --no-headers \
| awk '/php-fpm: pool/ {p=$NF; c[p]+=$1} END{for(p in c) printf "%5.1f%% CPU %s\n", c[p], p}' \
| sort -nr
curl -sI https://example.com/ | egrep -i 'CF-Cache-Status|Age'
tail -n 600 /var/www/vhosts/system/example.com/logs/access_* 2>/dev/null \
| awk '{print $7}' | cut -d? -f1 | sort | uniq -c | sort -nr | head
ps -eo pcpu,pmem,args --no-headers \
| awk '/php-fpm: pool/ {pool=$NF; cpu[pool]+=$1} END {for (p in cpu) printf "%6.1f%% CPU %s\n", cpu[p], p}' \
| sort -nr
/w/* block permanently (zero cost on WordPress)./xmlrpc.php blocked unless a product explicitly requires it./wp-login.php with Managed Challenge or IP allow-list.ps -eo pcpu,pmem,args --no-headers \
| awk '/php-fpm: pool/ {p=$NF; c[p]+=$1} END{for(p in c) printf "%5.1f%% CPU %s\n", c[p], p}' \
| sort -nr
tail -n 20000 /var/www/vhosts/system/<DOMAIN>/logs/*access* 2>/dev/null \
| awk '{print $7}' | cut -d? -f1 | sort | uniq -c | sort -nr | head
FROM="dd/Mon/yyyy:HH:MM"; TO="dd/Mon/yyyy:HH:MM"
awk -v f="$FROM" -v t="$TO" '$4~/\[/ {ts=substr($4,2,20); if(ts>=f&&ts<=t) print $7}' \
/var/www/vhosts/system/<DOMAIN>/logs/access_log \
/var/www/vhosts/system/<DOMAIN>/logs/access_ssl_log \
| cut -d? -f1 | sort | uniq -c | sort -nr | head
(http.request.uri.path in {"/w", "/w/"} or starts_with(http.request.uri.path, "/w/"))
(http.request.uri.path eq "/xmlrpc.php")
(http.request.uri.path eq "/wp-login.php") and not ip.src in {YOUR.PUBLIC.IP}
not starts_with(http.request.uri.path, "/wp-admin")
and http.request.uri.path ne "/wp-login.php"
and http.request.uri.path ne "/xmlrpc.php"
and not (http.request.uri.query contains "preview=true")
and not any(http.request.headers["cookie"][*] contains "wordpress_logged_in_")
and not any(http.request.headers["cookie"][*] contains "comment_author_")
/w/ and /w/index.php exist):
mediawiki.org/wiki/Manual:Short_URL
By default, your end-point server will NOT see the real end-user’s IP address.
Instead, every incoming request appears to come from a Cloudflare data center.
This impacts:
Cloudflare acts as a reverse proxy, routing all traffic through their global edge network.
Your server’s REMOTE_ADDR variable now reflects the Cloudflare node—not your actual visitor.
Cloudflare automatically sends the true client IP in the CF-Connecting-IP HTTP header.
To reliably log and process the real user’s IP in PHP, use this snippet:
function getRealIp() {
// Prefer Cloudflare's header if present
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
return $_SERVER['HTTP_CF_CONNECTING_IP'];
}
// Optionally support generic proxies
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0];
}
// Fallback to server-provided address
return $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN';
}
getRealIp() helper everywhere you log, rate-limit, or analyze IP addresses.X-Forwarded-For unless you control all proxy hops—it can be spoofed by end users.TL;DR:
When accounting for Cloudflare, always log and use the IP from CF-Connecting-IP, not just REMOTE_ADDR.
It’s a simple fix that saves hours of debugging and improves your site’s security and analytics.
Download the Plesk Cloudflare plugin and import the DNS records to plesk for the domain. Make sure Cloudflare is in Strict SSL Mode when doing this or it won’t work. After this is complete you will get a certificate error. If you wish to add a free certificate then you must put the cert into full mode as opposed to strict to add the free let’s encrypt certificate.