Option 1. Hierarchical Deterministic Wallet in your server
One that is widely used is Electrum (electrum.org). You can install it in your webserver (it can be a watch only wallet so you don't keep your private keys in the server) and every time it receives a request it will generate a new address. You can see a full tutorial here:
Another option would be to use a plugin to do that in a much easier way. If you are using Wordpress + WooCommerce you can use this:
There are many other plugins that work in the same way for most CMS and eCommerce solutions.
Option 2. Use a payment processor
They will take care of everything for you, but they will keep a small fee. Everytime someone clicks on the donate button, they will create a new address and show it to the user. Usually you just need to embed some html on your website on install a plugin they provide. This, however, will send the funds to your account at the payment processor. You can withdraw from there, but you are losing control of your funds until you do.
Some well known are: