Making soup stock is a common practice in cultures throughout the world. It's a way of maximizing the value, nutrition and flavor of foods that are not always abundant. It's particularly relevant in the 21st century, when it's important to make the most of animal products that have a large environmental footprint.
The simplest way to make stock is to keep a "stock bag" in the freezer. Keep two plastic freezer bags (or whatever container you prefer) in the freezer, ready to accept food scraps whenever you have them. One is for vegetable scraps such as carrot peels, onion skins (not the brown part!), radish tops, etc. The other is for animal scraps such as bones, fish heads/tails, gristle, etc.
These are examples of vegetable scraps that are appropriate for stock:
These are examples of animal products that are good for stock:
Parmesan rinds (thanks Debs!)
These should not be used for stock:
Brown onion skins
Anything covered in dirt
Anything rotten or unpleasant-smelling
Celery greens, carrot greens and other bitter greens
Vegetable stock is the easiest. Take a generous amount of vegetable scraps out of your stock bag and put them in a pot full of water. Boil for one hour, then strain.
In my opinion, the best stock is made with animal bones. It's rich in minerals and gelatin, and has a full, meaty flavor. Break the bones to expose the marrow, put them in a pot full of water or a crockpot, add 2 tablespoons vinegar, and simmer for 1-20 hours. Add vegetable scraps for the last hour, then strain. Large bones from beef or lamb require long cooking to draw out their full flavor, while thinner chicken bones and fish parts require less. The vinegar helps draw the minerals out of the bones into solution.
Fish heads also make a delicious, nutritious stock. They're full of minerals (including iodine), omega-3 fats and vitamin A from the eyes. You can often get them dirt-cheap at the fish counter. Boil them for one hour with vegetable scraps and two tablespoons of vinegar, strain, pick off the meat and add it to your soup.