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 распознавать запросы, поступающие с восходящего сервера, и автоматически перенаправлять их на этот сервер?
Ответы
Ответ 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, даже зная об этом.