You could use Elastic Load Balancing http://aws.amazon.com/elasticloadbalancing/ to load balance a couple of nginex web server, then two or three application servers with Thin (http://code.macournoyer.com/thin/) configured as a cluster. As Cloud DBMS you could use RDS, which is Amazon offer for MySql. You can share the sessions but using AR session storage or by using memchaced.
Thin is an application server for Ruby, but you can substitute Thin with Apache + mod_php, Tomcat or whatever.
The application servers should mount a clustered file system, such as GlusterFS, were you should put your code (the same code for any server).
Then using the command line tool of Amazon you can configure when the servers new instances should be created, for instance when a server reach the 70% of CPU usage.
You could use Varnish for static caching, installed in the same instance of the web server or using its own instance (better).
There are lot's of solutions, although the easiest one is to use Heroku.