{"id":523,"date":"2026-09-06T09:18:53","date_gmt":"2026-09-06T09:18:53","guid":{"rendered":"https:\/\/www.vps.tc\/blog\/?p=523"},"modified":"2026-09-06T17:50:14","modified_gmt":"2026-09-06T17:50:14","slug":"err-connection-reset-fix-chrome","status":"publish","type":"post","link":"https:\/\/www.vps.tc\/blog\/en\/err-connection-reset-fix-chrome\/","title":{"rendered":"How to Fix ERR_CONNECTION_RESET Error in Chrome"},"content":{"rendered":"<div class=\"aiw-toc\" style=\"border:1px solid #dbe3ea;border-radius:8px;padding:16px 20px;margin:0 0 28px\"><strong>Table of Contents<\/strong><\/p>\n<ol style=\"margin:10px 0 0;padding-left:22px\">\n<li><a href=\"#how-do-you-fix-err_connection_reset-in-chrome\">How do you fix ERR_CONNECTION_RESET in Chrome?<\/a><\/li>\n<li><a href=\"#what-does-err_connection_reset-mean\">What does ERR_CONNECTION_RESET mean?<\/a><\/li>\n<li><a href=\"#why-does-err_connection_reset-happen\">Why does ERR_CONNECTION_RESET happen?<\/a><\/li>\n<li><a href=\"#how-can-you-tell-whether-the-site-or-your-connection-is-at-fault\">How can you tell whether the site or your connection is at fault?<\/a><\/li>\n<li><a href=\"#how-do-you-fix-err_connection_reset-on-the-server\">How do you fix ERR_CONNECTION_RESET on the server?<\/a><\/li>\n<li><a href=\"#what-can-you-try-in-chrome-and-on-the-computer\">What can you try in Chrome and on the computer?<\/a><\/li>\n<li><a href=\"#how-do-you-identify-an-ipv6-specific-failure\">How do you identify an IPv6-specific failure?<\/a><\/li>\n<li><a href=\"#why-can-a-proxy-vpn-or-mtu-reset-the-connection\">Why can a proxy, VPN, or MTU reset the connection?<\/a><\/li>\n<li><a href=\"#what-should-hosting-customers-check-first\">What should hosting customers check first?<\/a><\/li>\n<li><a href=\"#which-fix-applies-to-each-symptom\">Which fix applies to each symptom?<\/a><\/li>\n<li><a href=\"#frequently-asked-questions\">Frequently asked questions<\/a><\/li>\n<li><a href=\"#sources\">Sources<\/a><\/li>\n<\/ol>\n<\/div>\n<h2 id=\"how-do-you-fix-err_connection_reset-in-chrome\">How do you fix ERR_CONNECTION_RESET in Chrome?<\/h2>\n<p>At 3 a.m., restarting the server feels like progress. It often is not. To fix <code>ERR_CONNECTION_RESET<\/code>, I first check whether the problem affects one site or the whole connection. I test the domain over mobile data, compare IPv4 and IPv6 with <code>curl<\/code>, then inspect DNS, firewalls, proxies, VPNs, and server logs. Chrome or the server gets restarted only after those checks.<\/p>\n<h2 id=\"what-does-err_connection_reset-mean\">What does ERR_CONNECTION_RESET mean?<\/h2>\n<p><code>ERR_CONNECTION_RESET<\/code> means that the TCP connection between your browser and the web server was closed before the exchange completed. The reset may have come from the server, a firewall, proxy, VPN, DNS-related path, network device, or software on your own computer. If only one site is affected, I start on the server and DNS side. If every site fails, I look at the local network first.<\/p>\n<p>Chrome and other Chromium-based browsers use this message for an unexpected connection reset. It does not prove that the web server is down. A TCP connection may have been established and then terminated when one endpoint or an intermediate device sent an <code>RST<\/code> packet.<\/p>\n<p>The connection can fail before it reaches the HTTP layer, so the web server&#8217;s access log may contain no request at all. That distinction saves time. When there is no log entry, I check DNS, IPv4 and IPv6, firewall rules, and the network path before touching an nginx setting.<\/p>\n<h2 id=\"why-does-err_connection_reset-happen\">Why does ERR_CONNECTION_RESET happen?<\/h2>\n<p>The error name comes from the browser, but the cause is often somewhere else. This is where I usually begin:<\/p>\n<table>\n<thead>\n<tr>\n<th>Possible cause<\/th>\n<th>Typical symptom<\/th>\n<th>First check<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Server service is down<\/td>\n<td>The site fails from every network<\/td>\n<td><code>systemctl status nginx<\/code> and listening ports<\/td>\n<\/tr>\n<tr>\n<td>Firewall or WAF<\/td>\n<td>Some IP addresses cannot connect<\/td>\n<td>nftables, fail2ban, and WAF logs<\/td>\n<\/tr>\n<tr>\n<td>Incorrect proxy configuration<\/td>\n<td>The failure occurs behind a reverse proxy<\/td>\n<td>nginx error log and upstream connection<\/td>\n<\/tr>\n<tr>\n<td>IPv6 problem<\/td>\n<td>IPv6 clients fail while IPv4 clients work<\/td>\n<td>Compare <code>curl -4<\/code> and <code>curl -6<\/code><\/td>\n<\/tr>\n<tr>\n<td>VPN, router, or ISP<\/td>\n<td>The same site opens over mobile data<\/td>\n<td>Disable the VPN and test another network<\/td>\n<\/tr>\n<tr>\n<td>MTU or routing problem<\/td>\n<td>Small requests work but some HTTPS requests fail<\/td>\n<td><code>mtr<\/code>, packet size, and tunnel settings<\/td>\n<\/tr>\n<tr>\n<td>Browser extension or damaged cache<\/td>\n<td>The page opens in an incognito window<\/td>\n<td>Disable extensions and test again<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>RFC 9293 describes <code>RST<\/code> as a TCP control mechanism for aborting a connection unexpectedly. The browser message is the user-facing result of that network event. Saying that the web server definitely sent the reset is too strong.<\/p>\n<h2 id=\"how-can-you-tell-whether-the-site-or-your-connection-is-at-fault\">How can you tell whether the site or your connection is at fault?<\/h2>\n<p>Start by narrowing the scope. Open the same domain using mobile data, another Wi-Fi connection, and, if possible, another device. If only your computer is affected, the browser, local DNS, VPN, or security software becomes more likely. If the failure follows the domain across networks, inspect the server, DNS, or hosting side.<\/p>\n<p>These are usually the first commands I run:<\/p>\n<pre><code>dig +short A example.com\ndig +short AAAA example.com\ncurl -IvsS --connect-timeout 10 https:\/\/example.com\/<\/code><\/pre>\n<p>The first two commands show the IPv4 and IPv6 addresses. The <code>curl<\/code> output shows which address was used, whether the TLS handshake started, and where the connection stopped. <code>-I<\/code> requests only HTTP headers, while <code>-v<\/code> prints detailed connection information. The verbose output is usually more useful than another browser refresh.<\/p>\n<p>Test both address families separately:<\/p>\n<pre><code>curl -4Iv https:\/\/example.com\/\ncurl -6Iv https:\/\/example.com\/<\/code><\/pre>\n<p>If <code>curl -4<\/code> succeeds but <code>curl -6<\/code> ends with a reset, the A record and IPv4 path may be healthy while the AAAA record, IPv6 routing, or the server&#8217;s IPv6 listener is wrong. A browser may prefer IPv6, which is why the problem can appear only on certain connections.<\/p>\n<h3>What if DNS resolves but the connection still fails?<\/h3>\n<p>A correct DNS response does not prove that port 443 is reachable on that address. The domain may point to an old server or an incorrect AAAA record. Some clients can retain an older response until the DNS TTL expires, but calling every DNS problem propagation is not an investigation.<\/p>\n<p>On the server, check the listening ports:<\/p>\n<pre><code>sudo ss -lntp | grep -E ':(80|443)'\nsudo systemctl status nginx --no-pager<\/code><\/pre>\n<p><code>0.0.0.0:443<\/code> generally indicates an IPv4 listener, while <code>[::]:443<\/code> indicates an IPv6 listener. If you see only one, compare the DNS records with the addresses and protocols that the service actually supports.<\/p>\n<h2 id=\"how-do-you-fix-err_connection_reset-on-the-server\">How do you fix ERR_CONNECTION_RESET on the server?<\/h2>\n<p>If you can SSH into the server, do not begin by restarting services at random. Record the symptom and its time first. Restarting without reading logs can remove useful evidence, including connection counts, kernel messages, and temporary WAF blocks.<\/p>\n<p>Observe first.<\/p>\n<h3>1. Check the nginx or Apache logs<\/h3>\n<p>For nginx, watch the access and error logs for the affected site:<\/p>\n<pre><code>sudo tail -f \/var\/log\/nginx\/access.log \/var\/log\/nginx\/error.log<\/code><\/pre>\n<p>If the request appears in the access log but the client receives a reset, the problem may be in the proxy, upstream application, or response generation. If there is no entry, the traffic may be stopping before it reaches nginx. On Apache systems, check <code>\/var\/log\/apache2\/<\/code> or <code>\/var\/log\/httpd\/<\/code>, depending on the distribution.<\/p>\n<p>For recent service messages and a configuration test:<\/p>\n<pre><code>sudo journalctl -u nginx --since '15 minutes ago' --no-pager\nsudo nginx -t<\/code><\/pre>\n<p><code>nginx -t<\/code> validates configuration syntax; it does not explain why existing connections dropped. The test can pass while the upstream application has crashed, the file descriptor limit is exhausted, or the kernel is rejecting connections.<\/p>\n<h3>2. Check the application service and upstream<\/h3>\n<p>If PHP-FPM, Node.js, Python, or another application behind the reverse proxy is not responding, nginx may fail while trying to serve the request. Check the application port and service separately:<\/p>\n<pre><code>sudo ss -lntp\nsudo systemctl --failed\nsudo journalctl -u php8.2-fpm --since '30 minutes ago' --no-pager<\/code><\/pre>\n<p>The service name may differ on your system. On Ubuntu, seeing <code>php8.1-fpm<\/code> or <code>php8.3-fpm<\/code> is normal. The nginx <code>proxy_pass<\/code> or <code>fastcgi_pass<\/code> target must point to a socket or port that is actually listening.<\/p>\n<h3>3. Inspect firewall and fail2ban records<\/h3>\n<p>If one client is blocked while the site opens from another network, an automated ban becomes more likely. Changing the SSH port is not a security strategy by itself; reading the fail2ban and nftables rules is what reveals an accidental block.<\/p>\n<pre><code>sudo nft list ruleset\nsudo fail2ban-client status\nsudo fail2ban-client status sshd<\/code><\/pre>\n<p>On a production system, note the source IP, chain, and counters before removing a rule. Also inspect the WAF, CDN, or hosting panel&#8217;s security layer. A client IP on a ban list can explain the reset shown by the browser.<\/p>\n<h3>4. Check resource limits and kernel messages<\/h3>\n<p>When a web server reaches its file descriptor, memory, or connection queue limits, the failure may look intermittent. These commands do not diagnose the problem alone, but they show where I would look next:<\/p>\n<pre><code>free -h\nuptime\nsudo dmesg -T | tail -n 80\nsudo ss -s<\/code><\/pre>\n<p>Look in <code>dmesg<\/code> for out-of-memory events, network driver messages, or connection-table problems. <code>ss -s<\/code> provides a summary of connection states.<\/p>\n<p>During one night shift, clients reported dropped connections. I initially focused on nginx, but <code>ncdu<\/code> showed that <code>\/var<\/code> was filling with logs because an application&#8217;s logrotate configuration had been forgotten. I corrected the rotation before the filesystem filled completely, then confirmed that new nginx connections returned to normal. Since then, disk usage gets checked as early as CPU usage.<\/p>\n<h2 id=\"what-can-you-try-in-chrome-and-on-the-computer\">What can you try in Chrome and on the computer?<\/h2>\n<p>If the server looks healthy, I work through the client side in this order:<\/p>\n<ol>\n<li>Open the page in an incognito window and temporarily disable extensions.<\/li>\n<li>Temporarily disable the VPN, corporate proxy, and antivirus HTTPS inspection, then test again.<\/li>\n<li>Compare the result with another DNS resolver, but record the current DNS response first.<\/li>\n<li>Test another network before restarting the modem or local network equipment.<\/li>\n<li>Check the operating system&#8217;s date and time and its system proxy settings.<\/li>\n<\/ol>\n<p>Clearing the browser cache sometimes helps, but it cannot repair a reset at the network layer. If the same URL also resets with <code>curl<\/code>, the browser cache is probably not the only problem.<\/p>\n<h3>Flushing the DNS cache on Windows and Linux<\/h3>\n<p>On Windows:<\/p>\n<pre><code>ipconfig \/flushdns<\/code><\/pre>\n<p>On Linux, the command depends on the caching service. With <code>systemd-resolved<\/code>:<\/p>\n<pre><code>sudo resolvectl flush-caches\nresolvectl statistics<\/code><\/pre>\n<p>These commands clear only the local DNS cache. They do not correct a record pointing to the wrong address; verify the A or AAAA value in the DNS control panel as well.<\/p>\n<h2 id=\"how-do-you-identify-an-ipv6-specific-failure\">How do you identify an IPv6-specific failure?<\/h2>\n<p>IPv6 problems are easy to miss when IPv4 works. I test the two protocols separately instead of guessing which route the browser selected.<\/p>\n<pre><code>$ curl -4I https:\/\/example.test\nHTTP\/2 200\n\n$ curl -6I https:\/\/example.test\ncurl: (35) Recv failure: Connection reset by peer<\/code><\/pre>\n<p>This output shows that HTTP headers arrived over IPv4, while the IPv6 connection closed before reaching the TLS or HTTP stage. The AAAA record might still point to an old VPS, the IPv6 firewall rule may be missing, or the web service may listen only on IPv4.<\/p>\n<p>When changing DNS, check the A record, AAAA record, CDN origin address, and the server&#8217;s actual listening addresses together. The same principle applies when configuring a <em><a href=\"https:\/\/www.vps.tc\/blog\/en\/what-is-a-subdomain-uses-setup-best-practices\/\">subdomain<\/a><\/em>: each hostname must point to the correct IP family and service.<\/p>\n<h2 id=\"why-can-a-proxy-vpn-or-mtu-reset-the-connection\">Why can a proxy, VPN, or MTU reset the connection?<\/h2>\n<p>A VPN or corporate proxy adds another network layer between your client and the web server. If the tunnel&#8217;s MTU is wrong, larger packets may fragment or disappear. Some devices block the ICMP messages needed for path discovery, leaving the browser with a generic reset message.<\/p>\n<p>To get a rough view of the path:<\/p>\n<pre><code>mtr -rwzc 50 example.com<\/code><\/pre>\n<p>The <code>-r<\/code> flag selects report mode, <code>-w<\/code> enables wide output, and <code>-c 50<\/code> sets the number of test packets. The packet count matters here. Loss at one intermediate hop is not necessarily real end-to-end loss if later hops show no loss; some routers simply give diagnostic packets low priority. Focus on loss at the final destination rather than blaming the ISP from one row in the table.<\/p>\n<p>If the site opens with the VPN off but resets with it enabled, the VPN exit IP may be blocked, the tunnel MTU may be incompatible, or the proxy may be interfering with TLS. Do not add a permanent <code>sysctl<\/code> setting for packet sizes without measuring first. I have copied a network tweak to more than one machine before and created a second problem while trying to solve the first.<\/p>\n<h2 id=\"what-should-hosting-customers-check-first\">What should hosting customers check first?<\/h2>\n<p>With shared hosting or a VPS, you may not have access to every layer. A support request containing more than the words the site is down usually gets a useful answer faster. Include:<\/p>\n<ul>\n<li>The full domain and URL where the error appears.<\/li>\n<li>When it first appeared, including the time zone.<\/li>\n<li>Results from mobile data, home internet, and VPN testing.<\/li>\n<li>The results of IPv4 and IPv6 tests.<\/li>\n<li>Your browser, operating system, and the exact error text.<\/li>\n<li>Where the connection stops in <code>curl -Iv<\/code> output.<\/li>\n<\/ul>\n<p>If you suspect traffic overload or a DDoS event, connection counts and bandwidth also matter. The rate-limiting approach in <em><a href=\"https:\/\/www.vps.tc\/blog\/en\/what-is-a-ddos-attack-vps-protection-guide\/\">What Is a DDoS Attack? A Practical VPS Protection Guide<\/a><\/em> is relevant here. Changing a port or rebooting the server does not remove attack traffic.<\/p>\n<p>Before changing site files, prepare a backup and rollback plan. Running <code>nginx -t<\/code> before a reload is a small habit that prevents a configuration mistake from becoming a longer outage. My production sequence is simple: observe, make one change, test the configuration, and reload in a controlled way.<\/p>\n<h2 id=\"which-fix-applies-to-each-symptom\">Which fix applies to each symptom?<\/h2>\n<table>\n<thead>\n<tr>\n<th>Symptom<\/th>\n<th>Likely layer<\/th>\n<th>Suitable action<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Failure in only one browser<\/td>\n<td>Extension, proxy, or cache<\/td>\n<td>Incognito and extension-free testing<\/td>\n<\/tr>\n<tr>\n<td>Failure only with a VPN<\/td>\n<td>VPN exit, MTU, or IP block<\/td>\n<td>Test without VPN, run MTR, and inspect VPN logs<\/td>\n<\/tr>\n<tr>\n<td>Failure only over IPv6<\/td>\n<td>AAAA, IPv6 firewall, or service listener<\/td>\n<td>Compare <code>curl -4<\/code> and <code>curl -6<\/code> and check AAAA<\/td>\n<\/tr>\n<tr>\n<td>No request in the server log<\/td>\n<td>DNS, firewall, or network path<\/td>\n<td>Inspect DNS, port access, and packet path<\/td>\n<\/tr>\n<tr>\n<td>Upstream error in the log<\/td>\n<td>Application or proxy<\/td>\n<td>Check the upstream service, socket, and timeouts<\/td>\n<\/tr>\n<tr>\n<td>All clients fail from every network<\/td>\n<td>Server, origin, or CDN<\/td>\n<td>Check the service, listening ports, and hosting status<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Uninstalling and reinstalling Chrome is useful only when the other tests point to the client. The error code alone is not proof of one cause; the same reset message can come from a wrong IPv6 record, a blocked address, or a broken VPN tunnel.<\/p>\n<p>Once I&#8217;ve ruled out network and browser issues, I sometimes explore harmless JavaScript experiments; my guide, <a href=\"https:\/\/www.vps.tc\/blog\/en\/what-is-google-gravity-and-how-does-it-work\/\">What Is Google Gravity and How Does It Work?<\/a>, explains how the effect works in Chrome.<\/p>\n<h2 id=\"frequently-asked-questions\">Frequently asked questions<\/h2>\n<h3>Is ERR_CONNECTION_RESET a sign of malware?<\/h3>\n<p>Not by itself. A VPN, antivirus HTTPS inspection, local proxy, firewall, or the remote server can close the connection. If you have other suspicious symptoms, run a separate security scan.<\/p>\n<h3>What is the difference between ERR_CONNECTION_RESET and ERR_CONNECTION_REFUSED?<\/h3>\n<p><code>ERR_CONNECTION_REFUSED<\/code> usually means that the destination did not accept the connection, such as when no service is listening on the port. <code>ERR_CONNECTION_RESET<\/code> means that an established or partially established connection was closed with an RST. They are different network events presented by the browser.<\/p>\n<h3>Will restarting the server fix the error?<\/h3>\n<p>It may clear a temporary service lockup, but it does not remove the root cause. Save nginx, application, firewall, and kernel logs first, or the restart may erase the evidence needed to diagnose the failure.<\/p>\n<h3>What should I do if ERR_CONNECTION_RESET affects only one website?<\/h3>\n<p>Check the domain&#8217;s A and AAAA records, then compare mobile data with IPv4 and IPv6 tests. If other sites work but this domain fails across networks, the site owner or hosting provider should inspect the server, CDN, and firewall logs.<\/p>\n<p>My first instinct used to be a restart. Now I want one useful fact before touching anything: an address family that fails, a log line, or a packet path that stops somewhere. That small pause has saved me more than once.<\/p>\n<h2 id=\"sources\">Sources<\/h2>\n<ul class=\"aiw-sources\">\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9293\" target=\"_blank\" rel=\"noopener nofollow\">RFC 9293 &#8211; Transmission Control Protocol<\/a> \u2014 rfc-editor.org<\/li>\n<li><a href=\"https:\/\/nginx.org\/en\/docs\/\" target=\"_blank\" rel=\"noopener nofollow\">nginx Documentation<\/a> \u2014 nginx.org<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A practical ERR_CONNECTION_RESET fix for Chrome, covering DNS, IPv4 and IPv6, nginx, firewalls, VPNs, MTU problems, and client-side checks.<\/p>\n","protected":false},"author":2,"featured_media":521,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[1741,425,1744,1668,1747,1289,29],"class_list":["post-523","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to","tag-chrome","tag-dns","tag-err_connection_reset-en","tag-ipv6-en","tag-network-troubleshooting","tag-nginx-en","tag-vps"],"lang":"en","translations":{"en":523,"tr":522},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/comments?post=523"}],"version-history":[{"count":2,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/523\/revisions"}],"predecessor-version":[{"id":532,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/posts\/523\/revisions\/532"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/media\/521"}],"wp:attachment":[{"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/media?parent=523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/categories?post=523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vps.tc\/blog\/wp-json\/wp\/v2\/tags?post=523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}