Статический файл Nginx, относящийся к поддомену

У меня есть приложение NodeJs, работающее на локальном хосте: 8000, и я использую Nginx в качестве прокси-сервера. Это единственное приложение, работающее на Nodejs, в то время как другие приложения основаны на PHP.

Я пытаюсь настроить прокси в Nginx для перенаправления всех запросов с "http://localhost/NodeApp/" на " http://localhost:8000/". Nginx должен получать напрямую только файлы css/js/images из этого nodeapp. Все остальные запросы направляются на сервер Apache. Конфигурация Nginx такая:

#Need to modify this code to fetch static files for NodeApp only!
location ~ ^/(uploads/|vendor/|images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
  root /var/www/NodeApp/public;
  access_log off;
}

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://localhost:8000/;
}

Приведенная выше конфигурация Nginx ломает другие приложения, поскольку ищет статические файлы в общей папке NodeApp. Как мне изменить приведенную выше конфигурацию, чтобы она работала только для «localhost/NodeApp/»

Я пробовал ниже конфигурацию, но это ломает статическую папку NodeApp, имеет подпапки - /public/js/bootstrap/ /public/js/datepicker/ /public/css/bootstrap/ /public/css/datepicker/ /public/uploads/pdf / /общедоступные/изображения/

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://OneDesktop/;
    alias /var/www/NodeApp/public/;
}

Любой совет? Я пробовал много вещей, но не повезло!

Спасибо!


person Legolas    schedule 25.01.2016    source источник


Ответы (1)


Проблема в том, что приложение Node — это не просто один URI, это набор URI. Самый чистый подход — изменить само приложение так, чтобы оно жило ниже /NodeApp/ (включая то, где оно извлекает свои статические ресурсы).

В текущей ситуации файлы ресурсов для приложения Node перекрывают пространство имен файлов ресурсов для других размещенных приложений, и трудно определить правила для разделения этих двух перекрывающихся пространств имен.

Один из вариантов (менее чем идеальный) состоит в том, чтобы попросить nginx обслуживать файлы из одного корня документа, а затем передать его в другой корень документа, если исходный файл не существует.

Что-то вроде этого:

root /other/application/root;

location / {
    index ...;
    try_files $uri $uri/ =404;
}

location @other {
}

location ~ \.php$ {
    try_files $uri =404;
    ... 
}

location ~ ^/(uploads/|vendor/|images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
    root /var/www/NodeApp/public;
    access_log off;
    try_files $uri @other;
}

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://localhost:8000/;
}

Блок location @other будет обслуживать статические файлы из другого корня приложения. Блок местоположения PHP является первым регулярным выражением location, поэтому он имеет приоритет.

person Richard Smith    schedule 25.01.2016
comment
Спасибо, Ричард. Ценю ваш ответ. Сегодня вечером попробую настроить параметры конфигурации nginx и снова обновить здесь. Один вопрос по реализации приложения под /NodeApp/. Я использую hackathon-starter, который рекомендует помещать статические файлы в public/js, public/css и т. д. Однако в этом приложении express обрабатывает статические файлы. . Что вы предлагаете, чтобы не использовать этот подход? Я делаю что-то не так, так как мог найти что-нибудь подобное в Интернете. - person Legolas; 28.01.2016
comment
Извините за опечатку в предыдущем комментарии - я что-то делаю не так, потому что не смог не найти ничего подобного нигде в Интернете? - person Legolas; 28.01.2016
comment
Извините, я имел в виду URL-адреса, а не физические каталоги. Где ваши файлы живут в данный момент, это совершенно нормально. Проблема заключается в том, что их URL-адреса отделены от URL-адресов приложений PHP. Запуск разрозненных приложений в одном домене часто требует творческих решений, которые не рассматриваются в руководствах по отдельным приложениям. - person Richard Smith; 28.01.2016