Lets say you have a basic website at www.domain.com. All of the files are on a single server, so when I request a page, i get www.domain.com/index.php. Apache fires up, PHP does its thing, fetches some data from MySQL, and presents a page. My browser sees that the HTML needs www.domain.com/style.css, script.js, and a dozen images. So it requests them from that same overloaded Apache/PHP/MySQL server.
Instead, create an Amazon CloudFront distribution. Go to your DNS setting and create a CNAME record (e.g. cdn.domain.com) and point it at your distribution url. Enter the cdn.domain.com in the CNAME field in the distribution detail screen. Set the origin to custom (DNS), and enter www.domain.com. Wait a few minutes for the distribution to be set up, and however long it takes the DNS setting to propogate. Then change all paths for static files (CSS, JS, images, etc.) to cdn.domain.com instead of www.
Now, in that scenario above, when the page gets served by the browser, all requests for stylesheets, javascript, and those dozen images hit Amazon's servers around the world. The user gets routed to the closest one to them. If Amazon doesn't have your image, they fetch it from your server and cache it. But after that, future requests get served directly from their servers, not yours. So if 1000 people from a certain city visit your site, instead of 20,000 requests hitting your server (assuming one page has 20 requests for images, css, js), you just get 1020 requests (the first one was a cache miss, the rest were cache hits).