It really depends on the size of the project, ideally you have RabbitMq, celery workers and web workers running on different machines.
You need only one RabbitMQ and eventually multiple queue workers (bigger queues need more workers of course).
You dont need 1 celery worker per webworker, the webworkers are going to publish tasks to the broker and then the workers will get them from there, in fact the webworker does not care about the amount of workers connected to the broker as it only communicates with the broker.
Of course if you are starting a project it makes sense to keep everything on the same hardware and keep budget low and wait for the traffic and the money to flow :)
You want to have the same code on every running instance of your app, no matter if they are celery workers/ webservers or whatever.