AWS ECS中Nginx+PHP容器静态文件404问题求助
AWS ECS中Nginx+PHP容器静态文件404问题排查与解决
问题场景
在AWS ECS中采用Nginx和PHP分离容器部署,需要让PHP容器提供特定静态文件(如/app/plugins/sitepress-multilingual-cms/templates/language-switchers/legacy-list-horizontal/style.min.css),但访问这类文件时返回404状态码,且响应Content-Type为text/html; charset=UTF-8。
当前Nginx配置
load_module modules/ngx_http_perl_module.so; env PHP_SERVICE; http { perl_set $php_service 'sub { return $ENV{"PHP_SERVICE"}; }'; resolver 169.254.169.253; sendfile on; keepalive_timeout 65; gzip on; server { index index.php index.html index.htm; listen 80; listen [::]:80; root /var/www/html/web; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; add_header Access-Control-Allow-Origin *; } location ~ \.php$ { fastcgi_pass ${php_service}:9000; include fastcgi.conf; add_header Access-Control-Allow-Origin *; } location ~* \.(css|js|gif|ico|jpeg|jpg|png)$ { try_files $uri /index.php?$query_string; include /etc/nginx/mime.types; expires max; log_not_found off; } } }
问题细节
- 访问示例URL返回404:
https://xxxxxxx.xxxxxxxxx.xx/app/plugins/sitepress-multilingual-cms/templates/language-switchers/legacy-list-horizontal/style.min.css?ver=1 Request Method: GET Status Code: 404 - 文件存在于PHP容器,但不存在于Nginx容器:
- Nginx容器内执行结果:
/var/www/html/web # cat web/app/plugins/sitepress-multilingual-cms/templates/language-switchers/legacy-list-horizontal/style.min.css cat: can't open 'web/app/plugins/sitepress-multilingual-cms/templates/language-switchers/legacy-list-horizontal/style.min.css': No such file or directory - PHP容器内执行结果:
/var/www/html # cat web/app/plugins/sitepress-multilingual-cms/templates/language-switchers/legacy-list-horizontal/style.min.css .wpml-ls-legacy-list-horizontal{border:1px solid transparent;padding:7px;clear:both}.wpml-ls-legacy-list-horizontal>ul{padding:0;margin:0 !important;list-style-type:none}.wpml-ls-legacy-list-horizontal .wpml-ls-item{padding:0;margin:0;list-style-type:none;display:inline-block}.wpml-ls-legacy-list-horizontal a{display:block;text-decoration:none;padding:5px 10px 6px;line-height:1}.wpml-ls-legacy-list-horizontal a span{vertical-align:middle}.wpml-ls-legacy-list-horizontal a span.wpml-ls-bracket{vertical-align:unset}.wpml-ls-legacy-list-horizontal .wpml-ls-flag{display:inline;vertical-align:middle}.wpml-ls-legacy-list-horizontal .wpml-ls-flag+span{margin-left:.4em}.rtl .wpml-ls-legacy-list-horizontal .wpml-ls-flag+span{margin-left:0;margin-right:.4em}.wpml-ls-legacy-list-horizontal.wpml-ls-statics-footer{margin-bottom:30px}.wpml-ls-legacy-list-horizontal.wpml-ls-statics-footer>ul{text-align:center}
- Nginx容器内执行结果:
- PHP容器日志显示对应请求返回404:
10.80.18.143 - 10/Aug/2022:11:00:55 +0000 "GET /index.php" 200 10.80.18.143 - 10/Aug/2022:11:00:57 +0000 "GET /index.php" 404 10.80.18.143 - 10/Aug/2022:11:00:57 +0000 "GET /index.php" 404 10.80.18.143 - 10/Aug/2022:11:00:57 +0000 "GET /index.php" 404 10.80.18.143 - 10/Aug/2022:11:00:57 +0000 "GET /index.php" 404 10.80.18.143 - 10/Aug/2022:11:00:59 +0000 "GET /index.php" 404
问题分析与解决方案
核心问题
Nginx找不到本地静态文件时,会将请求转发到/index.php,但PHP入口脚本无法解析这类静态文件路径,导致返回404;同时因为响应由PHP生成,Content-Type被错误设置为text/html,而非对应静态文件的类型。
解决步骤
添加针对性Nginx转发规则
针对存放在PHP容器的静态文件路径,添加优先匹配的location规则,跳过本地文件检查,直接转发到PHP服务并传递真实文件路径:# 匹配需要PHP提供的静态文件路径,需放在通用静态文件规则之前 location ~ ^/app/plugins/sitepress-multilingual-cms/templates/.*\.(css|js)$ { fastcgi_pass ${php_service}:9000; # 传递真实请求路径给PHP,确保能找到对应文件 fastcgi_param SCRIPT_FILENAME $document_root$uri; include fastcgi_params; # 自动设置正确的Content-Type include /etc/nginx/mime.types; add_header Access-Control-Allow-Origin *; }验证路径一致性
确认Nginx的root配置(/var/www/html/web)与PHP容器内文件的根路径匹配,当前PHP容器中文件路径/var/www/html/web/app/plugins/...符合要求,无需调整。可选:共享静态文件目录
若此类静态文件数量较多,可通过AWS EFS或容器卷将PHP容器的静态文件目录共享给Nginx容器,避免请求转发到PHP,提升服务性能。
内容的提问来源于stack exchange,提问作者Georgios
相关产品推荐
相关产品推荐

