There's no hard and firm answer here, as agile is more of an umbrella term that covers many specific methodologies.
Personally, I like to keep my iterations as small as the solution could possibly allow. What this means, is that for every iteration, I go through with the users:
- What is the most essential problem that needs to be solved next?
- What is the minimum possible solution that addresses this problem?
This is hardest to solve on the first few iterations. Really focus on delivering the smallest piece of functionality possible, even if it's barely useful.
For this reason, I don't like defining fixed iteration lengths, although a maximum of 3-4 weeks is usually ideal. Your first iteration may be as short as a few days to get a functional skeleton of a program up. Later iterations may be several weeks long.
Resist the temptation to build a "framework" with your first few iterations. Build the minimum possible solution, and don't try to anticipate what problems you might need to solve in the future. Add abstractions and frameworks to solve pain, not to anticipate it.
I'm also not a huge fan of the approach of scheduling multiple stories, requirements, features, or what have you into one iteration. Doing 8 differing things on a project is a good way to reduce developer cohesion and have things get lost in the shuffle. This usually isn't a popular opinion with the business side, however.
Finally, one thing that has been very useful with customers in the past is to divorce the concept of iterations from public releases. The fact that an iteration is complete doesn't necessarily mean it's ready for the public yet. Set up a beta environment for early adopters and user representatives to play around with, and package multiple iterations into monthly / quarterly / yearly / whatever releases for your main project. Tying iterations to your release cycle puts way too much business and user pressure on your development methodology.