Say you have a big bloat of enterprise software and for every customer a different setup in terms of amount of appservers, search cluster size, webservers, database, loadbalancers and application-related staging functionality (edit -> live systems).
Of course, you want to be as narrow as possible to your production environment within your UAT environment, where acceptance testing is done. Possibly you may want to do extensivly automated testing in this or any previous stage.
But, as a matter of fact, mirroring production like environments into testing stages is much to expensive, simply due to the resources necessary.
So my question is, if there are any good best practices to keep this gap between production and testing environments as small as possible, or good techniques to bridge that gap
For the large majority of tests, the focus is on the functionality and only one or at most a handful of tests will be executed at the same time in the same environment.
For these tests, it really doesn't matter if you have just a single appserver or a few dozen behind a load-balancer. The same goes for the other components that you might duplicate for handling larger loads.
There are only a few test areas where having a copy of the production system is beneficial or needed. Those tests are typically not executed often enough to warrant more than one setup with multiple instances of each component.
Tests to think about here are performance/load tests and tests that verify that components like load-balancers don't break the system (what happens if the load-balancer decides to shift a session from one appserver to another halfway through the session).