Подтвердить что ты не робот

Nginx Обратное Проксирование до Node.js с переписыванием

У меня есть несколько приложений, работающих за обратным прокси-сервером Nginx, одним из которых является сервер Node с Express.js. Я проксинг domain.com/demo/app/<path> до localhost:7003/<path>, используя эту конфигурацию Nginx:

http {

    ...

    server {

        listen 80;
        server_name domain.com;

        ...

        location /demo/app {

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Scheme $scheme;

            rewrite ^/demo/app/?(.*) /$1 break;
            proxy_pass http://localhost:7003;
        }

        ...
    }
}

Это отлично работает, а app получает запросы, как если бы он был внедрен в /. Проблема заключается в том, что app обрабатывает свои собственные статические файлы и может запрашивать маршруты, такие как css/app.css или images/image.jpg. Но из-за обратного прокси они фактически существуют в /demo/app/css/app.css и /demo/app/images/image.jpg соответственно.

Я решил это, получив Nginx для перехода к Node настраиваемому заголовку, указывающему корневой путь, который сервер Node добавляет к URL-адресам всех последующих запросов. Но теперь мой код завален этими корневыми строками пути. Например, часть моих исходных шаблонов:

link(rel='stylesheet', href="#{basePath}/css/base.css")
link(rel='stylesheet', href="#{basePath}/css/skeleton.css")
link(rel='stylesheet', href="#{basePath}/css/layout.css")

Какой более элегантный способ справиться с этим? Нет ли способа заставить Nginx распознавать запросы, поступающие с восходящего сервера, и автоматически перенаправлять их на этот сервер?

4b9b3361

Ответ 1

Я сделал nginx для статических файлов, даже не передавая эти запросы node, добавив директиву местоположения в файл конфигурации приложения nginx (который включен в nginx.conf):

location ~ /(img|js)/ {
    rewrite ^(.*)$ /public/$1 break;
}

location / {
    proxy_pass http://localhost:3000/;
    ...
}

В случае, если запрос поступает в /img или/js, каталог nginx обслуживает файлы из каталога /public/img или/public/js соответственно. Все остальные запросы проксируются до node.

Если вам нужно добавить дополнительные каталоги (например,/css или /views, если вы храните там шаблоны, которые хотите использовать как в node, так и в браузере) и иметь любую структуру каталогов внутри этих каталогов, nginx просто добавляет /public для них и получает файлы отсюда без вашего приложения node, даже зная об этом.