Skip to content

Inaccurate upload speeds: these settings work on everything but iPad OS and iOS when using Wi-FiΒ #28

@dimepues

Description

@dimepues

Hi all,

I'm having success on all platforms but iOS and iPad OS when using Wi-Fi πŸ˜‹ and wanted to share my setup / settings. Enjoy!

  • When testing with Windows / MacOS / Linux, I get accurate numbers (verified with my networking devices).
  • When testing on iOS (iPhone 15 Pro Max) and iPad OS (iPad Pro M4) via either Safari or Edge (both Web Kit-based), I still get wonky upload speeds.

Numbers I'm seeing on Wi-Fi 6E 6ghz:

  • Windows: accurate
  • iOS (Edge/Safari): inflated upload
  • iPad OS (Edge/Safari): inflated upload

Numbers I'm seeing on Wi-Fi 6 5ghz:

  • Windows: accurate
  • iOS (Edge/Safari): inflated upload
  • iPad OS (Edge/Safari): inflated upload
  • macOS (Edge/Safari): accurate
  • Debian Bookworm (Firefox ESR 115.4): accurate
  • openSUSE Tumbleweed (Firefox 128.0.3): accurate
  • ubuntu 24.04 (Firefox 129.0.1): accurate

My Setup:

  • Docker host running ubuntu 24.04 cloud image
  • Docker host is connected via 100g switch
  • Wi-Fi 6E APs are connected via 2.5Gb to a 10Gb switch
  • Wi-Fi clients and servers are on separate VLANs but I have Layer-3 routing so the only bottlenecks are my dreams πŸ’–
  • Portainer-based management for stacks (Docker Compose with bells and whistles)
  • Centralized Nginx proxy stack for all my workloads
  • Dedicated OpenSpeedTest stack

Docker Compose: Nginx

version: '3.8'

networks:
  apps-general:  
    external: true
  paperless-ngx:
    external: true

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: unless-stopped
    ports:
      - '80:80'
    volumes:
      - /home/ubuntu/nginx-configs/apps.conf:/etc/nginx/conf.d/apps.conf
    networks:
      - apps-general

Docker Compose: OpenSpeedTest

version: '3.3'

services:
  speedtest:
    image: openspeedtest/latest
    restart: unless-stopped
    container_name: openspeedtest

    networks:
      - apps-general

networks:
  apps-general:
    external: true

OpenSpeedTest Portion of apps.conf

Partially sourced from this configuration:

server {
    listen 80;
    server_name speed.apps.home.domain.com;

    location / {
        # Proxy pass directive to route requests to the OpenSpeedTest container
        proxy_pass http://openspeedtest:3000/;
        proxy_http_version 1.1; # Ensure HTTP/1.1 is used for this location
        # Standard headers for proxying
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Additional headers to ensure correct handling
        add_header 'Access-Control-Allow-Origin' "*" always;
        add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
        add_header Cache-Control 'no-store, no-cache, max-age=0, no-transform';
        add_header Last-Modified $date_gmt;
        if_modified_since off;
        expires off;
        etag off;

        # Handle OPTIONS requests
        if ($request_method = OPTIONS ) {
            add_header 'Access-Control-Allow-Credentials' "true";
            add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With' always;
            add_header 'Access-Control-Allow-Origin' "$http_origin" always;
            add_header 'Access-Control-Allow-Methods' "GET, POST, OPTIONS" always;
            return 200;
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions