Nginx + Unicorn 具有位置的多个应用程序 - 路由

Nginx + Unicorn 具有位置的多个应用程序 - 路由

我想使用不同的位置块来运行多个 rails 应用程序。不同的 unicorn worker 已启动并配置,它们运行良好。

每个应用程序都在同一个文件夹下:/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)会像这样进入我的 app1:Started GET "/app1/check" for ...我只想Started GET "/check" for ...

我应该对我的配置做哪些更改?

答案1

如果你不想改变上游参数(无论你在你的@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;
}

参数breaktorewrite将导致 nginx 重写 URI,而无需实际重定向或重新路由请求。

/app1/不要忘记在名称中添加前缀try_files,因为$uri它在运行时会被重写try_files

答案2

在这种情况下,您如何设置资产路径?

我的资产路径是

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

答案3

我使用 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 /,但由于上述SCRIPT_NAME的更改,应用程序将路径视为/ foobar /。modifier1是WSGI(IIRC)所特有的,因此可能不适用于您的设置。

相关内容