Using variables in proxy_pass implies, that the URI specified is a full one. Quoting the documentation:
A server name, its port and the passed URI can also be specified using variables:
proxy_pass http://$host$uri;
This behaviour is not very intuitive, though it's how it works. Variables in proxy_pass were introduced
If you want nginx to use URI of the original request instead of the one specified in the proxy_pass, avoid specifying URI at all (note no trailing slash):
proxy_pass http://$host;
If you want to pass some changed URI, you can do so by using rewrite ... break in the same location.
nginx вначале ищет среди всех префиксных location’ов, заданных строками, максимально совпадающий. В вышеприведённой конфигурации указан только один префиксный location “/”, и поскольку он подходит под любой запрос, он и будет использован, если других совпадений не будет найдено. Затем nginx проверяет location’ы, заданные регулярными выражениями, в порядке их следования в конфигурационном файле. При первом же совпадении поиск прекращается и nginx использует совпавший location. Если запросу не соответствует ни одно из регулярных выражений, nginx использует максимально совпавший префиксный location, найденный ранее.
/var/www/crm/elc/frontend/web
и при запросе ничего не напутано с регистром символов (а ещё лучше - приведите названия к нижнему), а также, что у пользователя www-data (или другого, из-под которого работает веб-сервер) есть права на чтение этих файлов.