PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法

简介: 在Azure App Service for Linux上部署的PHP应用遇到上传文件超过1MB时出现413 Request Entity Too Large错误的解决之法

问题描述

在PHP项目部署在App Service后,上传文件如果大于1MB就会遇见 413 Request Entity Too Large 的问题。

 

问题解决

目前这个问题,首先需要分析应用所在的环境。

在App Service for Linux环境中,为PHP提供的运行时当前只有PHP 8.0, 并且 PHP 8.0 中使用的Nginx作为代理服务器。然后请求才会传递到PHP应用中。


基于以上分析,在PHP应用中,会收到Nginx 和PHP双重限制。所以传递文件的限制问题设计到两个方面:

一:Nginx 服务器对上传文件大小的限制。(默认限制为 1 MB,需通过 client_max_body_size 参数修改大小)

二:PHP 对上传文件文件大小的限制。(默认限制为 2MB,可以通过 upload_max_filesize 和 post_max_size 修改大小)


所以,本文主要介绍,如何在App Service For Linux环境中,修改Nginx对文件大小的限制和PHP文件大小的限制。

 


第一部分:修改 Nginx client_max_body_size

第一步:进入App Service SSH 页面,寻找Nginx的default文件,路径为( /etc/nginx/sites-available/default),通过CAT查看默认的内容。

上图中执行的指令有:

cd ..

cd etc/nginx/sites-availabled

ls

cat default

 

第二步:复制default的内容到本地自己的PHP项目文件中,添加client_max_body_size后,随项目文件一起部署到 /home/site/wwwroot/目录下

(PS: 目录可以自定义修改,但必须注意,如果项目部署的根目录不在wwwroot中,必须同步修改 nginx 的 default配置文件,避免应用报错找不到源文件)

default的默认内容为

server {
    #proxy_cache cache;
        #proxy_cache_valid 200 1s;
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot;
    index  index.php index.html index.htm;
    server_name  example.com www.example.com; 
    location / {            
        index  index.php index.html index.htm hostingstart.html;
    }
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /html/;
    }
    
    # Disable .git directory
    location ~ /\.git {
        deny all;
        access_log off;
        log_not_found off;
    }
    # Add locations of phpmyadmin here.
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        fastcgi_connect_timeout         300; 
        fastcgi_send_timeout           3600; 
        fastcgi_read_timeout           3600;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }
}

需要在其中添加  client_max_body_size , 比如这里设置为10m (不要写成 10MB,并且结尾要带上分号)

server {
    #proxy_cache cache;
    #proxy_cache_valid 200 1s;
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot;
    index  index.php index.html index.htm;
    server_name  lbphplinuxtest01.chinacloudsites.cn;
    client_max_body_size 10m;
   location / {
        try_files $uri $uri/ /index.php$is_args$query_string;
        index  index.php index.html index.htm hostingstart.html;
    }
   # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /html/;
    }
    
    # Disable .git directory
    location ~ /\.git {
        deny all;
        access_log off;
        log_not_found off;
    }
   # Add locations of phpmyadmin here.
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        fastcgi_connect_timeout         300;
        fastcgi_send_timeout           3600;
        fastcgi_read_timeout           3600;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }
}

 

第三步:PHP应用文件部署后,可以也SSH中通过cp 命令把修改后的default文件复制到 nginx sites-available default目录下,并且重启Nginx服务(service nginx restart)。此步为临时性有效。

此步执行的命令为


##复制 default 到nginx sites-available目录中

cp /home/site/wwwroot/default /etc/nginx/sites-available/default

##重新加载 nginx 服务

service nginx reload


如果通过SSH直接在应用的容器中执行以上命令,当App Service站点重启,应用重新部署时,以上修改都会丢失,Nginx配置会恢复默认。所以需要下一步永久性操作。

PS: 修改完成后,可以通过 Nginx -T 来查看Nginx所使用的配置参数。以及可以在 /var/log/nginx中查看error.log日志



第四步:把第三步的 cp 命令和 restart命令设置在 App Service的启动命令中,以便长久有效。如果启动命令中内容过多,可以把全部内容写入到一个脚本文件中(如 startscript.sh),并随项目文件一起放置。然后把文件全路径填入启动命令中。

把第三步的两句命令用分号(;)连接在一起设置在Startup Command中,操作如下图:


cp /home/site/wwwroot/default /etc/nginx/sites-available/default; service nginx reload


1)在App Service的目录页面中, 点击Configuration目录进入Configuration页面

2)选择General Settings选项卡

3)在Startup Command中添加 cp和restart命令

4)点击保存按钮。应用会自动重启并运行命令

注意:当以上操作完成后,Nginx上传文件默认1MB 的限制就变为了 10MB,但是因为PHP的限制还没有修改,所以当在应用中上传文件大于2MB时候,依旧会收到 413 或者 404 错误。只是,此时错误的根源为PHP限制。

 

第二部分:修改PHP upload_max_filesize 和 post_max_size

第一步:在项目文件根目录中创建 extensions.ini 的文件,并在其中设置 upload_max_filesize 和 post_max_size 值为50M。然后把修改后的文件一起部署到 wwwroot中

或者也可以直接在 SSH中通过命令创建 extensions.ini 文件和内容

cd site
mkdir ini
cd ini
echo "upload_max_filesize=50M"  >> extensions.ini 
echo "post_max_size=50M"  >> extensions.ini 
cat extensions.ini
ls

 


第二步:回到Azure App Service 门户页面,在Application Setting中添加 PHP_INI_SCAN_DIR 参数,指定它的值为 /usr/local/etc/php/conf.d:/home/site/ini  或者 /usr/local/etc/php/conf.d:/home/site/wwwroot/ini

PS:  前一段 /usr/local/etc/php/conf.d 路径固定,为PHP Runtime加载配置配置文件的路径,而一部分 /home/site/ini 则需要根据第一步extensions.ini文件的路径而改变

 

第三步: 通过phpinfo()函数验证修改后的参数

在info.php文件中写入  <?php phpinfo();     ,然后通过url访问 https://<sitename>.chinacloudsites.cn/info.php

echo "<?php phpinfo();" >> info.php

 

 

 

附录:PHP上传文件的可用代码

W3School PHP File Uploadhttps://www.w3schools.com/php/php_file_upload.asp

PHPFileUpload : https://github.com/zgcwkjOpenProject/PHPFileUpload

 

 

参考资料

NGINX Rewrite Rules for Azure App Service Linux PHP 8.x:https://azureossd.github.io/2021/09/02/php-8-rewrite-rule/index.html  

Azure App Service Linux - Update PHP Settings:https://azureossd.github.io/2019/01/29/azure-app-service-linux-update-php-settings/

 

 

 

[END]



 

当在复杂的环境中面临问题,格物之道需:

浊而静之徐清,安以动之徐生。

云中,恰是如此!


相关文章
|
人工智能 文件存储 数据中心
Ollama部署本地大模型并通过Infortress APP远程访问保姆级教程
本文介绍如何快速上手本地大模型部署工具Ollama及AI远程访问工具Infortress。通过Ollama,开发者可轻松部署如Llama、Deepseek等主流开源模型,仅需几行命令即可完成安装与运行。结合Infortress,用户能实现对本地大模型的远程访问,支持多设备无缝对接,同时提供便捷的模型切换与知识库管理功能。Infortress更兼具NAS软件特性,成为个人AI数据中心的理想选择。
|
10月前
|
Java 应用服务中间件 API
【App Service】部署War包到Azure云上遇404错误
Java应用部署至Azure App Service for Windows后报404,本地运行正常。经排查,日志提示类文件版本不兼容:应用由Java 17(class file version 61.0)编译,但环境仅支持到Java 11(55.0)。错误根源为Java版本不匹配。调整App Service的Java版本至17后问题解决,成功访问接口。
1123 3
|
11月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
SQL 关系型数据库 数据库连接
PHP脚本中应用while循环按照ID顺序列出数据集的技巧。
代码整体运行流程非常简单高效:连接数据库、发送查询、处理结果、关闭连接。下面的步骤是常规的PHP数据库操作流程,无需复杂处理即可实现按ID顺序列出数据集。确保代码清晰,易于理解,且可执行性强。如果在生产环境中应用这段代码,需要注意处理数据库连接的安全性、查询效率以及异常处理等。
235 16
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
814 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
存储 监控 NoSQL
在阿里云上构建高性能PHP应用:最佳实践指南
本文档从四个核心方面阐述了系统设计与优化的全面方案:**架构设计原则**包括分层架构(Web/逻辑/数据分离)与无状态设计(Redis会话存储、OSS文件管理);**核心服务选型**推荐高性价比的ECS、高性能Redis企业版及PolarDB数据库等;**性能优化技巧**涵盖代码层面(OPcache、Swoole框架)、数据库优化(复合索引、分库分表)以及进阶容器化和函数计算策略;**监控体系搭建**则通过云监控、ARMS应用监控、日志服务SLS等工具,确保系统稳定高效运行。
328 10
|
存储 自然语言处理 安全
PHP-Casbin:现代化 PHP 应用的权限管理引擎
PHP-Casbin 是基于 PERM 模型的轻量级权限框架,支持 ACL、RBAC、ABAC 等多种访问控制模型,适用于 API 安全控制、企业权限管理等场景。其灵活配置、多语言协同与分布式支持,使其成为现代化 PHP 应用权限管理的首选工具。
457 0
|
域名解析 监控 NoSQL
即时通讯APP应用开发的部署策略
随着移动互联网发展,即时通讯APP成为生活和工作的必备工具。本文探讨其开发部署的关键环节,包括用户界面设计、通讯协议选择、数据库设计与服务器搭建等方面,以及部署过程中的环境准备、应用打包、服务器部署、域名解析和监控维护等步骤。通过优化每个环节,确保APP稳定高效运行,提升用户体验,在市场中保持竞争力。
|
存储 监控 算法
公司员工电脑监控软件剖析:PHP 布隆过滤器算法的应用与效能探究
在数字化办公的浪潮下,公司员工电脑监控软件成为企业管理的重要工具,它能够帮助企业了解员工的工作状态、保障数据安全以及提升工作效率。然而,随着监控数据量的不断增长,如何高效地处理和查询这些数据成为了关键问题。布隆过滤器(Bloom Filter)作为一种高效的概率型数据结构,在公司员工电脑监控软件中展现出独特的优势,本文将深入探讨 PHP 语言实现的布隆过滤器算法在该软件中的应用。
242 1
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
401 3