The sides entered the Group G clash level on points after the first two rounds of matches and there was nothing to separate them in Portugal.
Porto took the lead through Diaz's long-range strike 36 minutes in, but Morelos equalised on the brink of half-time with his 10th European goal of the campaign.
Rangers had some promising moments in the second half but were thankful for a late double save from Allan McGregor, with the point lifting them to second in the group and still above third-place Porto on goal difference.
Ze Luis glanced wide from a good position early on and hit the outside of the post with his next headed attempt 33 minutes in.
Porto made their possession count by edging in front three minutes later through Diaz's unstoppable effort into the top-right corner.
Rangers mustered an instant response, however, as Morelos - having headed James Tavernier's cross against the post a few minutes beforehand - controlled Borna Barisic's pass and fired past Agustin Marchesin.
The same two players combined early in the second half as Morelos tested Marchesin with another header, but it was Porto who went closest to snatching all three points.
Substitute Bruno Costa went within inches of converting at the back post and McGregor was then required to keep out Francisco Soares and Mateus Uribe in quick succession.