Ubuntu服务器单域名多Laravel应用子目录部署Nginx配置问题
问题根源
你的Nginx配置存在三个核心问题,直接导致脚本路径匹配错误:
- PHP请求的location规则匹配不到实际URL:你配置的
location ~ ^/app_1\.php$只能匹配/app_1.php,但实际请求的是/apps/app_1/index.php,完全不匹配,导致FastCGI找不到脚本。 - Alias模式下的脚本路径拼接错误:使用
alias时,$document_root$fastcgi_script_name会结合server根目录和请求URI生成错误路径,而非alias指向的public目录。 - Try_files的 fallback路径错误:直接写
/index.php会去server根目录寻找,而非当前应用的public目录下的index.php。
修正后的Nginx配置
针对每个Laravel应用,使用如下配置格式(以app_1为例):
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name my-domain.com; root /srv/users/usr1/apps/myapps/apps; # 处理app_1的子路径访问 location ^~ /apps/app_1 { # 指向Laravel应用的public目录 alias /srv/users/usr1/apps/myapps/apps/app_1/public; # 优先匹配静态文件,找不到则重写至index.php try_files $uri $uri/ @laravel_app_1; # 处理PHP请求 location ~ \.php$ { include fastcgi_params; # 使用$request_filename自动结合alias路径和请求URI,生成正确的脚本路径 fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; } } # Laravel路由重写规则 location @laravel_app_1 { rewrite ^/apps/app_1/(.*)$ /apps/app_1/index.php?$1 last; } # 同理复制上述配置,修改路径即可处理app_2、api_1等其他应用 # location ^~ /apps/app_2 { # alias /srv/users/usr1/apps/myapps/apps/app_2/public; # try_files $uri $uri/ @laravel_app_2; # ... # } # location @laravel_app_2 { # rewrite ^/apps/app_2/(.*)$ /apps/app_2/index.php?$1 last; # } # 注:server块中的proxy_set_header是用于反向代理的,当前用FastCGI处理PHP,这些配置可以删除 }
额外注意事项
- 确保Nginx运行用户(通常是
www-data)对每个Laravel应用的storage、bootstrap/cache目录有读写权限,可执行命令:chown -R www-data:www-data /srv/users/usr1/apps/myapps/apps/app_1/{storage,bootstrap/cache} chmod -R 775 /srv/users/usr1/apps/myapps/apps/app_1/{storage,bootstrap/cache} - 修改配置后,重启Nginx生效:
sudo systemctl restart nginx
内容的提问来源于stack exchange,提问作者웃웃웃웃웃
相关产品推荐
相关产品推荐

