<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: upordown.online</title>
    <description>The latest articles on DEV Community by upordown.online (@upordownonline).</description>
    <link>https://dev.to/upordownonline</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4207346%2F6128a48b-a24a-466f-a304-ab19b1655a1e.png</url>
      <title>DEV Community: upordown.online</title>
      <link>https://dev.to/upordownonline</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/upordownonline"/>
    <language>en</language>
    <item>
      <title>Is it down, or is it me? Debugging a site that won't load, one layer at a time</title>
      <dc:creator>upordown.online</dc:creator>
      <pubDate>Sun, 25 Oct 2026 21:30:26 +0000</pubDate>
      <link>https://dev.to/upordownonline/is-it-down-or-is-it-me-debugging-a-site-that-wont-load-one-layer-at-a-time-deh</link>
      <guid>https://dev.to/upordownonline/is-it-down-or-is-it-me-debugging-a-site-that-wont-load-one-layer-at-a-time-deh</guid>
      <description>&lt;p&gt;"The site is down" is one of the least useful bug reports there is. Down for whom? Down how? A page that never loads, a certificate warning and a &lt;code&gt;502 Bad Gateway&lt;/code&gt; are three completely different problems with three different owners.&lt;/p&gt;

&lt;p&gt;The fastest way to stop guessing is to walk the same path your browser walks, one layer at a time. Every request to &lt;code&gt;https://example.com&lt;/code&gt; goes through roughly five steps, and each one fails in its own recognizable way.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. DNS: can the name be turned into an address?
&lt;/h2&gt;

&lt;p&gt;Before anything else, the name has to resolve.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short example.com A
dig +short example.com AAAA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No answer, &lt;code&gt;NXDOMAIN&lt;/code&gt; or &lt;code&gt;SERVFAIL&lt;/code&gt; means you never got as far as the server. Compare against a public resolver to see whether it's your resolver or the domain itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short example.com @1.1.1.1
dig +short example.com @8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If public resolvers answer and yours doesn't, the problem is local (router, ISP resolver, a stale cache). If nobody can resolve it, the domain's DNS is broken or the domain has expired. A useful sanity check is whether &lt;em&gt;other&lt;/em&gt; names resolve for you at all: if sites fail by name but you can still reach an IP like &lt;code&gt;1.1.1.1&lt;/code&gt;, your DNS is the thing that broke, not "the internet".&lt;/p&gt;

&lt;h2&gt;
  
  
  2. TCP: does anything answer on the port?
&lt;/h2&gt;

&lt;p&gt;An address doesn't mean a listening server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nc &lt;span class="nt"&gt;-vz&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; 6 example.com 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Connection refused" means a machine answered but nothing is listening on that port, which is often a crashed service or a misconfigured load balancer. A timeout means packets disappear somewhere: a firewall, a routing problem, or a host that is simply gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. TLS: does the secure handshake complete?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 &lt;span class="nt"&gt;-servername&lt;/span&gt; example.com &amp;lt;/dev/null 2&amp;gt;/dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-subject&lt;/span&gt; &lt;span class="nt"&gt;-dates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at &lt;code&gt;notAfter&lt;/code&gt;. Expired certificates still take down real sites, usually on a weekend. Also check the subject actually covers the hostname you asked for. One sneaky client-side cause: if your device clock is far off, a perfectly valid certificate looks expired or not yet valid, and browsers show &lt;code&gt;NET::ERR_CERT_DATE_INVALID&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. HTTP: what did the server actually say?
&lt;/h2&gt;

&lt;p&gt;Now the request itself. &lt;code&gt;curl&lt;/code&gt; can print a timing breakdown that maps neatly onto the layers above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;--max-redirs&lt;/span&gt; 4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'dns=%{time_namelookup}s connect=%{time_connect}s tls=%{time_appconnect}s ttfb=%{time_starttransfer}s code=%{http_code}\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How to read the status code is where most "is it down?" arguments come from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;200&lt;/code&gt;, &lt;code&gt;301&lt;/code&gt;/&lt;code&gt;302&lt;/code&gt;&lt;/strong&gt;: up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;403&lt;/code&gt; or &lt;code&gt;429&lt;/code&gt;&lt;/strong&gt;: the server is reachable; it just doesn't like your client. Large sites routinely block scripts and data-center IPs. That's not an outage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;503&lt;/code&gt;&lt;/strong&gt;: the server is alive but says it can't serve right now: overload or maintenance. Degraded, not gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;500&lt;/code&gt;, &lt;code&gt;502&lt;/code&gt;, &lt;code&gt;504&lt;/code&gt;&lt;/strong&gt;: something behind the front door is failing. This is the classic real outage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Time: is it slow enough to count as broken?
&lt;/h2&gt;

&lt;p&gt;A page that answers after 25 seconds is "down" to every human who tried it. Set explicit limits instead of waiting forever:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;--connect-timeout&lt;/span&gt; 6 &lt;span class="nt"&gt;--max-time&lt;/span&gt; 10 &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code} %{time_starttransfer}\n'&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Time to first byte is the honest number here, because it includes DNS, connection and handshake, the parts users actually wait on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't trust a single failure
&lt;/h2&gt;

&lt;p&gt;Networks drop packets. A single failed request is a data point, not an incident. Retry once after a couple of seconds before you page anyone or post "X is down" in the team channel. Most transient blips vanish on the second try; real outages don't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then change your vantage point
&lt;/h2&gt;

&lt;p&gt;Everything above tells you what happens &lt;em&gt;from your machine&lt;/em&gt;. To answer "is it me?", you need a second opinion from somewhere else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the same check from a server in another region (a cheap VPS, a CI runner, a cloud shell).&lt;/li&gt;
&lt;li&gt;Try mobile data instead of Wi-Fi. That swaps your ISP, your router and your DNS in one move.&lt;/li&gt;
&lt;li&gt;Check the service's official status page, but treat it as the provider's statement, not as a measurement. They are often updated after users notice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it works from elsewhere and fails for you, start with your own DNS and network. If it fails everywhere, it's them, and the useful thing you can do is report &lt;em&gt;which layer&lt;/em&gt; failed: "TLS handshake fails, cert expired at 00:00 UTC" gets fixed much faster than "site down".&lt;/p&gt;

&lt;h2&gt;
  
  
  A shortcut when you're in a hurry
&lt;/h2&gt;

&lt;p&gt;I help run &lt;a href="https://upordown.online" rel="noopener noreferrer"&gt;upordown.online&lt;/a&gt;, a free checker that automates this exact sequence: DNS lookup, connection, TLS verification and the first byte of the homepage with fixed timeouts and a repeat check before anything is called an outage, then shows that next to tests from home and mobile connections in other countries. The page linked above documents every rule it uses, which is handy even if you only want a checklist to copy into your own monitoring.&lt;/p&gt;

&lt;p&gt;But the real takeaway is the method: name the layer, then change the vantage point. Once you do that, "is it down or is it me?" usually answers itself in under a minute.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>webdev</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
