The app_offline method is good but not perfect for very busy sites.
The main limitation is you can't perform the actual upgrade until the file is removed. Once removed, any user can trigger the upgrade. If your site is very busy then you have to be quick on your feet. Further, you can't do any tweaks to accommodate the new stuff without the public seeing the changes.
Instead, what I have found the works very well is make a entirely separate app offline website that includes a default page and a wide 404 redirect to the home page.
I change the home directory of the DNN site to this folder and people experience the same as the single app_offline file method. Difference being it a completely functional site so you could have a number of pages. Even functions like contact forms but remember: all portals will be seeing the same files so branding is out the door less you do some fancy JS style switching.
Concurrently, I create an alias website with the home directory set to the DNN folder. Of course you have to have the alias previously mapped to a portal. This now allows me to access the installation again free of any traffic. I can take my time and perform all the updates and tweaks I want.
This is not a solution for most people but if you have RDC access and a lot of traffic I highly recommend it.