Я пытаюсь запустить несколько приложений nodejs (используя экспресс-фреймворк), все они обслуживаются на одном и том же внешнем порту (80), но каждое в подкаталоге.
Например. Я хочу...
NodeJsApplication1 будет доступен по адресу http://www.mydomain.com/NodeJsApplication1
NodeJsApplication2 будет доступен по адресу http://www.mydomain.com/NodeJsApplication2
и т.п.
Я пробовал использовать Nginx в качестве прокси с конфигурацией, подобной следующей.
server {
listen 80;
server_name www.mydomain.com;
location / {
root /var/www/html;
index index.html index.htm;
}
location /NodeJsApplication1/ {
proxy_pass http://0.0.0.0:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite /NodeJsApplication1/(.*) /$1 break;
}
location /NodeJsApplication2/ {
proxy_pass http://0.0.0.0:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite /NodeJsApplication2/(.*) /$1 break;
}
}
Это работает для доступа к странице, но ломает все относительные URL-адреса на возвращающейся странице. Все скрипты, CSS и т. Д. Указывают на корень (например, www.mydomain.com/styles/main.css).
Я знаю, что могу использовать несколько поддоменов, но не хочу идти по этому пути. Я бы предпочел использовать прокси для подпапок, чтобы все это обрабатывалось программным обеспечением, и мне не нужно было настраивать какие-либо записи DNS для каждого приложения.
Это вообще возможно?
Обновить
Внутри самих приложений все ссылки используют относительные пути. Например:
<link href="styles/main.css" />
<script src="scripts/app.js" />
Но при отображении браузер рассматривает их как "www.mydomain.com/styles/main.css
" скорее, чем "www.mydomain.com/NodeJsApplication1/styles/main.css
".
Обновление 2 я знаю два три возможных (неидеальных) решения этой проблемы.
NodeJsApplication1.mydomain.com
и все ссылки будут действовать, как ожидалось. Проблема, с которой я столкнулся, заключается в том, что для каждого приложения требуется настройка записи DNS. Я хочу что-то, что можно было бы сделать почти автоматически без особой ручной работы. (Запись с подстановочными знаками не подходит, поскольку домен используется для других целей).<base>
тег чтобы указать корень приложения. Опять же, проблема состоит в том, что требуется изменение приложения, а не среды.У меня была аналогичная проблема с несколькими приложениями MEAN в одном домене. Мне нужны подкаталоги вместо того, чтобы создавать новый поддомен для каждого приложения. Помимо добавления перезаписи в конфигурацию Nginx:
rewrite ^/app1/(.*)$ /$1 break;
Вам также необходимо установить свой <base>
тег в заголовке вашего индекса:
<base href="/app1/">
Оказывается, это проблема самого приложения NodeJS, а не настройки среды. Кажется, что приложение пытается быть умным и получить корень приложения, но не знает, что оно проксируется (или что-то в этом роде).
Когда я попробовал это с чистым базовым приложением, оно работало, как ожидалось, и относительные пути были действительными.
Обновить
Поскольку похоже, что у вас работает прокси-сервер nginx, проблема в вашем приложении, использующем жестко заданные ссылки на основной домен. Это похоже на ограничение, наложенное приложением, и nginx не может вам с этим помочь, потому что он не может узнать, когда вы обращаетесь к файлам, например /css/style.css
должен ли он перенаправить его на /NodeJsApplication1
или /NodeJsApplication2
.
Старый ответ
Два разных приложения не могут быть привязаны к одному порту в одной системе. Вместо этого вы должны привязать их к разным портам, а затем в конфигурации nginx перейти к конкретному порту приложения, подобному этому (это предполагает, что вы используете 3000
порт для app1 и 3001
порт для приложения2):
location /NodeJsApplication1/ {
proxy_pass http://0.0.0.0:3000;
...
}
location /NodeJsApplication2/ {
proxy_pass http://0.0.0.0:3001;
...
}
По поводу вопроса, файлы изображений css 、 js 、 отсутствуют, вы можете это сделать
если вы используете экспресс-фреймворк, вам нужно добавить эту строку кода
app.enable('trust proxy');
значение по умолчанию для доверенного прокси-сервера отключено.