skip to Main Content

I have a subdomain sub.example.com that is pointing to a web server hosted on an EC2 instance.

  • In the AWS Route53 console I’ve created an A-record that points to the public EIP of that instance.
  • I’ve checked the DNS records with nslookup and they look ok.
  • I can access the subdomain web server from the browser using its public IP address.

But if I try to access using the domain name, the browser redirects the request to the parent domain: http://sub.example.com -> http://example.com. I’m using Nginx as a reverse proxy & NodeJs as a backend server.

What do I need to do to make it work?

Edit
I’m able to access it if I use the www. prefix (www.sub.example.com). But without the "www" the browser just redirects me to the parent domain..

nginx.conf

user nginx;

worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80;
        server_name sub.example.com www.sub.example.com;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        # Redirect all HTTP request to the node.js
        location / {
            proxy_redirect off;
            proxy_pass "http://127.0.0.1:5000";
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}

2

Answers


  1. Chosen as BEST ANSWER

    The problem was in the dns resolver cache. It has cached obsolete A-records that point to old IPs. After the dns cache has been updated the problem was gone.

    Thank you @maslick for your replies.


    • Create two type "A" DNS records in Route53 (xxx.yyy.zzz.aaa is the public IP address of your EC2 instance, e.g. 18.185.121.30):
    sub.example.com -> xxx.yyy.zzz.aaa
    www.sub.example.com -> xxx.yyy.zzz.aaa
    
    • Use the standard nginx configuration (do not specify any DNS name in server_name – use the default value instead i.e. server_name _;):
    user nginx;
    
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 4096;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen 80;
            server_name _;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            # Redirect all HTTP request to the node.js
            location / {
                proxy_redirect off;
                proxy_pass "http://127.0.0.1:5000";
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
            }
        }
    }
    
    • Both the client (browser) and server (nginx) might be caching responses from an old configuration. Use your browser’s Incognito mode or curl with a no-cache header to test:
    curl -I -H "Cache-Control: no-cache" http://sub.example.com
    
    • Be patient. DNS records require some time (time to live or TTL) to propagate across the globe. You can reduce TTL in Route53 and wait less.

    • To debug DNS issues, use this Linux command:

    dig -t a sub.example.com
    

    I also like this web-service which can help you track DNS propagation globally.


    UPDATE: here’s the example node.js web server I’m running on port 5000:

    var http = require('http');
    
    var server = http.createServer(function (req, res) {
      if (req.url == '/') {
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.write('<html><body><p>This is home Page.</p></body></html>');
        res.end();
      }
    });
    
    server.listen(5000);
    console.log('Node.js web server at port 5000 is running..')
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search