我想使用不同的位置块来运行多个 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;
}
参数break
torewrite
将导致 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)所特有的,因此可能不适用于您的设置。