O motivo é que você tem dois blocos que correspondem aos arquivos de imagem:
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
Isso significa que o nginx usa apenas o último para seus arquivos de imagem.
Você precisa alterar as declarações location
desta forma:
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
try_files $uri =404;
}
location ~ \.(?:swf|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
Agora os arquivos de imagem correspondem apenas ao primeiro bloco, por isso é usado.
Considere também adicionar o cabeçalho Expires
, se quiser controlar o tempo que os navegadores armazenam em cache os arquivos, sem revalidá-los do servidor.