"The best way" is always hard to define. I think you have to make a difference between backing up code and backing up the database.
To backup the database, you can use the Backup and Migrate module.
To keep track of your code, there are many strategies. The simplest way (apart from doing nothing) is take all of your site's code and store it in a version control system (VCS) like SVN, GIT, etc. Myself, I'm considering to start using Drush Make for this. Drush Make is an extension for Drush, a command line shell and scripting interface for Drupal. It allows you to define your site in a .make file, describing the combination of Drupal core, contributed modules and custom code. Drush Make will then grab the code (from drupal.org, your SVN repo, or where ever it's at) and roll out the site. If you keep your .make file under version control, you can easily take last month's version and rebuild the code as it was then. Have a look at the slideshow For every site a make file to learn more about this approach.