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

简介: 【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于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日志

View Code

 

第四步:把第三步的 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]

目录
打赏
0
0
0
0
194
分享
相关文章
【Azure App Service】基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?
基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?Web App Linux 默认使用的 Nginx 版本是由平台预定义的,无法更改这个版本。
134 77
|
28天前
|
C#
【Azure Function】Function App出现System.IO.FileNotFoundException异常
Exception while executing function: xxxxxxx,The type initializer for 'xxxxxx.Storage.Adls2.StoreDataLakeGen2Reading' threw an exception. Could not load file or assembly 'Microsoft.Extensions.Configuration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the
115 64
【Azure Function】Function App门户上的Test/Run返回错误:Failed to fetch
Running your function in portal requires the app to explicitly accept requests from https://portal.azure.cn. This is known as cross-origin resource sharing (CORS).Configure CORS to add https://portal.azure.cn to allowed origins.
|
17天前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
54 23
Linux系统之whereis命令的基本使用
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
384 8
|
3月前
|
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
1205 6
|
3月前
|
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
231 3
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
54 25
|
3天前
|
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
14 2
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
42 11

热门文章

最新文章

  • 1
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    9
  • 2
    flutter3-wetrip跨平台自研仿携程app预约酒店系统模板
    25
  • 3
    通过外部链接启动 Flutter App(详细介绍及示例)
    21
  • 4
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 5
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40
  • 7
    【Azure Function】Function App门户上的Test/Run返回错误:Failed to fetch
    36
  • 8
    小游戏源码开发之可跨app软件对接是如何设计和开发的
    42
  • 9
    原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
    178
  • 10
    PiliPala:开源项目真香,B站用户狂喜!这个开源APP竟能自定义主题+去广告?PiliPala隐藏功能大揭秘
    78