我在 VPS 上安装了 Ubuntu。我没有域名,因此所有内容都通过以下方式访问https://IP:端口。我一直在尝试配置 nginx 以便运行多个通过 ip/name 访问的 webapps。
这是我的配置
server {
listen 443 ssl;
error_log /var/log/nginx/nginx_error.log;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
set $root_path '/var/www/html';
root $root_path;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html index.php;
server_name localhost;
# handle static files within project.. break at end to avoid recursive redirect
location ~ app3/((.*)\.(?:css|cur|js|jpg|jpeg|gif|htc|ico|png|html|xml))$ {
rewrite app3/((.*)\.(?:css|cur|js|jpg|jpeg|gif|htc|ico|png|html|xml))$ /app3/$1 break;
}
location /app3 {
rewrite ^/app3(.*)?$ /app3/pathto/public/index.php?$1 last;
}
location / {
try_files $uri $uri/ =404;
}
location /app1 {
try_files $uri $uri/ /index.php;
}
location /app2 {
try_files $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#try_files $uri $uri/ =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_nam
}
}
这对 app1 和 app2 来说效果很好。App3(Laravel 应用程序)无法正确运行,因为它使用的是绝对 URL 而不是相对路径。因此,我收到 /api.. 而不是 /app3/pathto/public/.. 的 404 请求(我尝试使用相对路径对 app3 进行分叉,除了一些图像和字体未显示外,其他都运行良好)
如何配置 nginx 以便 app3 拥有自己的根文件夹?app3 位置中的 root 或 alias 指令无法正常工作。
谢谢 !
答案1
你的问题是关于给 app3 一个自己的根文件夹,这个步骤很简单。只要你注意到陷阱,你应该没问题。 http://wiki.nginx.org/Pitfalls#Root_inside_Location_Block
然而我认为这并不能真正解决你的问题。你的问题似乎是 Laravel 应用程序无法在子文件夹中工作,或者它只是没有配置为在其中运行。在 nginx 级别没有太多可以做的事情来解决这个问题。但请检查配置以获取有关应用程序配置的任何帮助。
另一种“解决方案”是在根目录中安装(或重写)应用程序 3 的资源(api/、img/ 等),而只重写应用程序 1 和 2。这不是最优雅的解决方案,但只要 Laravel 应用程序中没有名为 app1 或 app2 的文件夹,它就可以工作。
编辑:第三个选项,也可能是最好的选项,当然是每年花 10 美元左右购买一个域名,或者从免费 DNS 服务中获取一个免费子域名。然后,您就可以为 app3 拥有一个单独的域名(或子域名)。我没有使用过任何免费 DNS 服务,但这应该对您有所帮助。
答案2
我观察到,如果应用程序只能在一个文件夹中运行,则可以使用简单的重定向。但如果它打开了其中的多个文件夹,则情况会更加复杂。当您按子文件夹分隔子站点时,这会创建一个复杂的迷宫,因为一个应用程序的一个文件夹可能会将用户发送到另一个应用程序。最好的解决方案是为每个应用程序添加一个子域。然后,您可以执行重定向,例如:app1.mydomain.com app2.mydomain.com,方法是使用 server_name app1.mydomain.com ... server_name app2.mydomain.com ...,然后每个应用程序都可以打开所需的文件夹,并且一切都将正常工作。
请注意,如果您为域名付费,您将拥有该域名的自己的 DNS 设置,并且您可以设置任意数量的子域名,而无需支付任何额外费用。