Nginx + Unicorn vários aplicativos com localizações - roteamento

1

Eu gostaria de executar vários aplicativos de trilhos usando apenas blocos de localização diferentes. Trabalhadores diferentes de unicórnios são iniciados e configurados, eles estão trabalhando muito bem.

Cada aplicativo está na mesma pasta: /var/www/<app> , então eu configurei o nginx assim:

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;
}

Meu problema é que, com este conjunto de regras, uma solicitação (como mydomain / app1 / check) entra no meu app1 assim: Started GET "/app1/check" for ... Gostaria de ter apenas Started GET "/check" for ...

O que devo alterar na minha configuração?

    
por p1100i 05.04.2013 / 23:25

3 respostas

1

Se você não quiser alterar seus parâmetros upstream (o que estiver fazendo em @app locais), um simples rewrite pode ajudar você:

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

O parâmetro break para rewrite fará com que o nginx reescreva o URI sem realmente redirecionar ou reencaminhar o pedido.

Não se esqueça de adicionar o prefixo /app1/ aos seus nomes try_files , porque $uri já será reescrito no momento em que try_files for executado.

    
por 07.04.2013 / 04:20
1

Como você configurou seu caminho de recursos nesse caso?

Meu caminho de recursos é

<host>/assets/<asset_name>.css 

mas o caminho correto é:

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

Minha configuração é basicamente a mesma que a acima.

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;
}
    
por 27.03.2015 / 19:49
0

Eu faço isso com nginx, uwsgi e django / wsgi - a chave é:

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

Eu hospedo os aplicativos como "nomes"; ou seja, / tiny / foobar /, mas o aplicativo vê o caminho como / foobar / devido à alteração de SCRIPT_NAME acima. modifier1 é peculiar ao WSGI (IIRC), portanto pode não se aplicar à sua configuração.

    
por 06.04.2013 / 14:38