AWS ElasticBeanstalk部署Symfony 2.8:NGINX隐藏入口文件问题求助
我在帮朋友部署Symfony到Elastic Beanstalk时也碰到过一模一样的问题,你修改nginx.conf.default没效果的核心原因是:这个文件并不是Elastic Beanstalk实际运行时加载的配置文件,平台有自己的专属配置路径,而且手动修改的配置还会在实例重启后丢失。给你一步步的解决思路:
1. 先确认当前生效的Nginx配置文件
首先登录到你的EB实例,运行以下命令查看所有正在生效的Nginx配置:
nginx -T
这个命令会输出完整的配置内容,你可以搜索location /或者root字段,找到处理根路径请求的配置块所在的文件(通常在/etc/nginx/conf.d/elasticbeanstalk/目录下,比如php.conf或者00_application.conf)。
2. 修改正确的Nginx配置文件
找到实际生效的配置文件后,编辑它(比如用sudo nano /etc/nginx/conf.d/elasticbeanstalk/00_application.conf),替换成下面的配置(注意替换root为你的实际项目根目录,Symfony 2.8默认是web,如果你改成public就写对应路径):
server { listen 80; server_name localhost; root /var/www/html/web; # 设置默认索引,优先尝试index.php/app.php index index.php app.php; location / { try_files $uri $uri/ /app.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/www.sock; fastcgi_index app.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 配置Symfony的环境参数 fastcgi_param APP_ENV prod; fastcgi_param APP_DEBUG 0; } }
保存后,重启Nginx和php-fpm服务:
sudo service nginx restart sudo service php-fpm restart
这时候再访问你的域名,应该就不需要带app.php了。
3. 持久化配置(避免实例重启后丢失)
因为Elastic Beanstalk的实例是临时的,手动修改的配置会在实例重启或重新部署后消失,所以最好用平台的.ebextensions配置来持久化修改:
在你的Symfony项目根目录创建.ebextensions/nginx.config文件,内容如下:
files: "/etc/nginx/conf.d/elasticbeanstalk/00_application.conf": mode: "000644" owner: root group: root content: | server { listen 80; server_name localhost; root /var/www/html/web; index index.php app.php; location / { try_files $uri $uri/ /app.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/www.sock; fastcgi_index app.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param APP_ENV prod; fastcgi_param APP_DEBUG 0; } }
然后把这个文件一起打包部署到Elastic Beanstalk,平台会自动帮你配置好Nginx,后续实例重启也不会丢失配置。
4. 额外排查点
- 如果改了
index.php还是需要带路径,检查Nginx的index指令是否包含index.php,上面的配置已经加了,确保这一步没问题。 - 清除浏览器缓存或者用隐私模式测试,避免旧缓存影响结果。
- 确认你的document root确实指向了Symfony的
web(或public)目录,没有指向项目根目录。
内容的提问来源于stack exchange,提问作者Adrián Rodriguez

