A variável incorporada $upstream_http_*
armazena os cabeçalhos enviados pelo servidor upstream no cache.
Você pode abusar do cabeçalho Date:
enviado pelo upstream para preencher o cabeçalho Last-Modified enviado pelo seu proxy reverso, desta forma:
add_header Last-Modified '$upstream_http_date';
Funciona como esperado:
Last-Modified: Sun, 22 Apr 2018 08:48:44 GMT
X-Cached: MISS
...
Last-Modified: Sun, 22 Apr 2018 08:50:05 GMT
X-Cached: HIT
...
Last-Modified: Sun, 22 Apr 2018 08:50:05 GMT
X-Cached: HIT
Mais informações sobre $ upstream_http_ * aqui: link (procure por $ upstream_http_name).
Dito isto, o que você está tentando alcançar é uma geralmente uma má idéia: o proxy reverso não tem idéia se o objeto upstream foi atualizado desde que foi último buscado ou não, ainda assim, ele informará ao cliente que o objeto não foi modificado. Esta é uma informação falsa.
É claro que pode haver razões pelas quais você deseja fazer isso, ou seja, se você tiver controle total sobre qualquer atualização de objeto que esteja ocorrendo no upstream e / ou planejar o esvaziamento do cache do proxy reverso sempre que necessário.
Se você tiver um único proxy reverso, recomendo enfaticamente que você analise ETags como uma solução melhor para o seu problema. Se você tiver um conjunto de proxies reversos usando ETags, será complicado.