Назад | Перейти на главную страницу

Nginx + Unicorn несколько приложений с местоположениями - маршрутизация

Я хотел бы запустить несколько приложений rails, просто используя разные блоки местоположения. Запускаются и настраиваются разные воркеры-единороги, работают нормально.

Все приложения находятся в одной папке: /var/www/<app>, поэтому я настроил nginx так:

root /var/www;

location  /app1/ {
  root /var/www/app1/public;
  try_files $uri/index.html $uri.html $uri @app1;
}

location  /app2/ {
  root /var/www/app2/public;
  try_files $uri/index.html $uri.html $uri @app2;
}

Моя проблема в том, что с этим набором правил запрос (например, mydomain / app1 / check) поступает в мое приложение1 следующим образом: Started GET "/app1/check" for ... Я бы хотел просто Started GET "/check" for ...

Что мне следует изменить в моей конфигурации?

Как вы настроили свой путь к активам в этом случае?

Мой путь к активам

<host>/assets/<asset_name>.css 

но правильный путь:

<host>/<app_name>/assets/<asset_name>.css

Моя конфигурация в основном такая же, как и выше.

upstream app1 {
    # Path to Unicorn SOCK file, as defined previously
    server unix:/tmp/unicorn.app1.sock fail_timeout=0;
}
upstream app2 {
    # Path to Unicorn SOCK file, as defined previously
    server unix:/tmp/unicorn.app2.sock fail_timeout=0;
}
location /app1/ {
    root /home/<user_app1>/<app1>;
    rewrite ^/app1/(.*)$ /$1 break;
    try_files $uri @app1;
}
location /app2/ {
    root /home/<user_app2>/<app2>;
    rewrite ^/app2/(.*)$ /$1 break;
    try_files $uri @app2;
}
location @app1 {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app1;
}
location @app2 {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app2;
}

Если вы не хотите изменять параметры восходящего потока (что бы вы ни делали в своем @app локаций), простой rewrite могу помочь тебе:

location /app1/ {
    root /var/www/app1/public;
    rewrite ^/app1/(.*)$ /$1 break;
    try_files /app1/$uri/index.html /app1/$uri.html /app1/$uri @app1;
}

В break параметр для rewrite заставит nginx перезаписать URI без фактического перенаправления или перенаправления запроса.

Не забудьте добавить префикс /app1/ на ваш try_files имена, потому что $uri уже будет переписан в то время try_files бежит.

Я делаю это с помощью nginx, uwsgi и django / wsgi - ключ:

location ~* /tiny/(.+?)/ {
    include uwsgi_params;
    uwsgi_pass unix:/run/uwsgi/tiny_$1.sock;
    uwsgi_param SCRIPT_NAME /tiny/$1;
    uwsgi_modifier1 30;
}

Я размещаю приложения как «имена»; то есть / tiny / foobar /, но приложение видит путь как / foobar / из-за изменения SCRIPT_NAME выше. modifier1 специфичен для WSGI (IIRC), поэтому может не относиться к вашей настройке.