Here is what I would recommend as a start. Although you do not have to use a server farm in this case (as you are not using it as a load balancing scenario), I would still recommend using the server farm as using ARR in the context of server farm provides additional features, such as health monitoring, run time statistics, etc.
I would create two farms - your config would look something like:
<webFarms>
<webFarm name="OWAFarm" enabled="true">
<server address="10.0.0.3" enabled="true" />
</webFarm>
<webFarm name="CRMFarm" enabled="true">
<server address="10.0.0.3" enabled="true">
<applicationRequestRouting httpPort="5555" />
</server>
</webFarm>
<applicationRequestRouting>
<hostAffinityProviderList>
<add name="Microsoft.Web.Arr.HostNameRoundRobin" />
<add name="Microsoft.Web.Arr.HostNameMemory" />
</hostAffinityProviderList>
</applicationRequestRouting>
</webFarms>
Basically, what you have there is a farm for OWA and another farm for CRM. The main difference is the HTTP port. (80 is default for HTTP so you do not need to specify it for the OWA case.)
Then, I would write the URL rewrite rules that look something like:
<rewrite>
<globalRules>
<rule name="ARR_OWAFarm_loadbalance" patternSyntax="Wildcard" stopProcessing="true">
<match url="owa*" />
<action type="Rewrite" url="http://OWAFarm/{R:0}" />
</rule>
<rule name="ARR_CRMFarm_loadbalance" patternSyntax="Wildcard" stopProcessing="true">
<match url="crm*" />
<action type="Rewrite" url="http://CRMFarm/{R:1}" />
</rule>
</globalRules>
</rewrite>
What you are doing there is the following:
-
If the URL looks like
http://corp.mydomain.com/owa, then route it to OWA farm. (Note that it is reference 0 - meaning it forwards everything starting /owa.... - this is okay, since your OWA on 10.0.0.3 is also expects /owa...
-
If the URL looks like
http://corp.mydomain.com/crm, then route it to CRM farm. (Note that it is reference 1 - meaning it forwards everything
after /crm... - this is necessary since your CRM is running on the root of the server (ie. It does not expect /crm/someurl. It expects /someurl).
As a precautionary measure, you may also want to add the following rule to block everything else.
<rule name="No match" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<action type="CustomResponse" statusCode="400" subStatusCode="0" statusReason="" statusDescription="" />
</rule>
That is to say that, if the URL does not look like either http://corp.mydomain.com/owa or http://corp.mydomain.com/crm, then respond 400.
Finally, because you are rewriting the URL for your CRM app (ie. the client sends /crm/someurl but your server receives /someurl), it may or may not work correctly depending on whether your crm application uses relative path everywhere. It it uses an absolute path somewhere to reference a resource on the machine, then it may not work correctly. For your OWA, it should work fine.