继上一篇 asp.net core 3.1多种身份验证方案,cookie和jwt混合认证授权 的公司内部项目上线后发现文件上传功能有问题。

上传的文件超过50M以后前端就报错了,没有状态返回,也没有响应。只有浏览器 Console 里面能看到一条 net::ERR_CONNECTION_RESET错误。

50M以内的都能传输,第一反应肯定是配置或者参数限制了。因为是部署的Linux,然后 nginx 做反向代理,检查了代码,运行程序的方面的大小限制是已经解除了的。

然后就是nginx限制,让运维修改了大小限制,但是仍然不行。因为开发人员接触不到部署环境,运维又说配置已经修改了,最后只得我自己在本地模拟线上环境调试找问题了(本地测试使用的IIS部署)。

由于我机器安装了 wsl 2,所以准备用 wsl 2 来部署测试玩一玩,关于 wsl 2 的安装可以看这个 Windows10上安装Linux子系统(WSL2,Ubuntu),配合Windows Terminal使用

接口和服务修改上传限制

对于程序需要修改两个地方,一个是接口的请求大小限制,在方法上面打上 [DisableRequestSizeLimit]

另外一个是kestrel服务器 MultipartBodyLengthLimit 大小限制,Startup里面修改大小。

独立方式部署

一般本地测试环境 .NET Core 会使用预先安装运行时来部署,但是如果使用容器一般是自包含运行时的,所以使用独立方式部署走一波。

可以使用命令方式发布,有vs就直接操作下就行了。

右键发布,设置独立部署模式,选择目标运行时 Linux-x64。

wsl 安装 unbuntu 后,本地几个盘就已经挂载在了mnt下面。所以直接可以访问windows上的目录启动程序,这也是wsl方便的地方。

我们进入到程序的目录,然后执行主程序就行了。注意: 如果已经在程序所在目录了,执行时要加 ./ 然后 ./xxx 的形式才能执行。

不需要安装任何东西或者依赖,程序已经启动了。接下来我们安装 nginx

nginx 安装和配置

使用 apt-get 安装 Nginx。

sudo apt-get install nginx

安装完成后启动nginx

sudo service nginx start

nginx 默认使用的是80端口,但是我启动后提示端口被占用。由于 wsl 与 Windows 是共用端口。

查看 iis 配置了80端口站点,停掉 iis 后再启动还是占用,搜索是 SQL Server Reporting Services 服务停止后就可以了。

测试环境如果你不是非要用80端口,可以在配置里面将 nginx 端口改成其它的,以防常用端口冲突。

Nginx 配置为反向代理将请求转接到 ASP.NET Core 应用,修改配置 /etc/nginx/sites-available/default。

sudo vim /etc/nginx/sites-available/default

使用vim修改配置为如下,我修改了 nginx 的端口为5000

server {
listen 5000;
location / {
proxy_pass http://localhost:5004;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

完成配置 Nginx 后,运行 sudo nginx -t 来验证配置文件的语法。 如果配置文件测试成功,通过运行 sudo nginx -s reload 重新加载。

测试与发现问题

上面的两步走完后,直接在 Windows 浏览器里面访问 http://localhost:5000 地址就行了,然后进行测试。

上传文件报 413 requset entity too large,但是 kestrel 并没有报错,所以将 nginx 配置 client_max_body_size 设置成 3000m。

再次上传几百兆的文件都可以,当我上传 1.5G 的文件时又报了一个错误。

504 超时,修改配置 设置 proxy_read_timeout 大小为 3600s,至于其它的一些 nginx 时间设置不用修改,比如网上有人修改链接超时时间什么的,其实没什么关系。

配置修改后同上,需要运行 sudo nginx -s reload

最后测试了 2G 以内各种大小的上传都能成功上传了。

最后

我将本地的测试情况给运维说明了情况,起码保证了程序是没问题的,以及nginx会出问题的点。

当然线上环境比我这个测试环境复杂,还需要运维去排查(可能是配置没生效或者配置不对),我这儿只是分享简单的部署安装和找问题过程。

另外还有一个注意点:

部署后启动服务报 Microsoft.Data.SqlClient.dll 目标平台不支持。最后将运行时里面的复制替换到程序下面就没问题了,而且运行时里面的文件是1M多,生成的只有几百k。

这个是为什么?暂时我还不得而知,有没知道的道友,后续我找到原因会更新在文章中。

wsl 2 unbuntu 部署 asp.net core 使用 nginx 做反向代理,调试文件上传失败的更多相关文章

  1. Asp.Net Core 轻松学-一行代码搞定文件上传 JSONHelper

    Asp.Net Core 轻松学-一行代码搞定文件上传   前言     在 Web 应用程序开发过程中,总是无法避免涉及到文件上传,这次我们来聊一聊怎么去实现一个简单方便可复用文件上传功能:通过创建 ...

  2. Asp.Net Core使用Nginx实现反向代理

    ---恢复内容开始--- 前两篇文章介绍了使用Docker作为运行环境,用Nginx做反向代理的部署方法,这篇介绍一下使用Nginx配合.Net Core运行时直接在Liunx上裸奔的方法. 一.安装 ...

  3. Asp.Net Core 轻松学-一行代码搞定文件上传

    前言     在 Web 应用程序开发过程中,总是无法避免涉及到文件上传,这次我们来聊一聊怎么去实现一个简单方便可复用文件上传功能:通过创建自定义绑定模型来实现文件上传. 1. 实现自定义绑定模型 1 ...

  4. 关于.net core使用nginx做反向代理获取客户端ip的问题

    1.正常情况下.net core获取客户端ip是比较简单的 /// <summary> /// 获取客户Ip /// </summary> /// <param name ...

  5. 同一个服务器部署两个Tomcat并用Nginx实现反向代理

    需求场景:由于服务器只有80端口可供外网访问,但需要部署两台tomcat来运行两个不同的项目,所以选择了nginx做反向代理 一个upstream tomcat_server对应一个  locatio ...

  6. ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

    一.前言 在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core ...

  7. 在 .NET Core项目中使用UEditor图片、文件上传服务

    在.NET Framework中使用UEditor时,只需要将UEditor提供的后端服务,部署为一个子程序,即可直接使用文件上传相关的服务,但是UEditor官方并未提供.Net Core的项目,并 ...

  8. Asp.Net Core 使用Docker进行容器化部署(二)使用Nginx进行反向代理

    上一篇介绍了Asp.Net 程序在Docker中的部署,这篇介绍使用Nginx对Docker的实例进行反向代理 一.修改Nginx配置文件 使用winscp链接Liunx服务器,在/ect/nginx ...

  9. docker部署Asp.Net Core、Nginx、MySQL

    2019/10/24,docker19.03.4, .netcore 3.0,CentOS7.6 摘要:asp.net core 3.0 网站项目容器化部署,使用docker-compose编排Ngi ...

随机推荐

  1. JVM系列之:Contend注解和false-sharing

    目录 简介 false-sharing的由来 怎么解决? 使用JOL分析 Contended在JDK9中的问题 padded和unpadded性能对比 Contended在JDK中的使用 总结 简介 ...

  2. CODING DevOps + Nginx-ingress 实现自动化灰度发布

    作者:王炜,CODING DevOps 后端开发工程师,拥有多年研发经验,云原生.DevOps.Kubernetes 资深爱好者,Servicemesher 服务网格中文社区成员.获得 Kuberne ...

  3. 2.pandas的数据结构

    对于文件来说,读取只是最初级的要求,那我们要对文件进行数据分析,首先就应该要知道,pandas会将我们熟悉的文件转换成了什么形式的数据结构,以便于后续的操作 数据结构 pandas对文件一共有两种数据 ...

  4. Oracle数据库出现[23000][2291] ORA-02291: integrity constraint (SIMTH.SYS_C005306) violated异常

    参考链接 这个异常发生在往中间表中插入数据时,这时出现异常是因为关联的某个表没有插入数据,所以给没有插入数据的关联表插入数据,再给中间表插入数据此时异常就会解决.

  5. Airflow Dag可视化管理编辑工具Airflow Console

    Airflow Console: https://github.com/Ryan-Miao/airflow-console Apache Airflow扩展组件, 可以辅助生成dag, 并存储到git ...

  6. 如何使用 PHP 语言来编码和解码 JSON 对象

    PHP JSON 本章节我们将为大家介绍如何使用 PHP 语言来编码和解码 JSON 对象. 环境配置 在 php5.2.0 及以上版本已经内置 JSON 扩展. JSON 函数 函数 描述 json ...

  7. Python os.tmpnam() 方法

    概述 os.tmpnam() 方法用于为创建一个临时文件返回一个唯一的路径.高佣联盟 www.cgewang.com 语法 tmpnam()方法语法格式如下: os.tmpnam 参数 无 返回值 返 ...

  8. luogu P2252 威佐夫博弈 模板 博弈

    LINK:威佐夫博弈 四大博弈 我都没有好好整理 不过大致可以了解一下. 在这个博弈中 存在一些局面 先手遇到必胜. 不过由于后手必胜的局面更具规律性这里研究先手遇到的局面后手必胜的情况. 这些局面分 ...

  9. 实验10—— java读取歌词文件内容动画输出

    1.Read.java package cn.tedu.demo; import java.io.BufferedReader; import java.io.File; import java.io ...

  10. udevd启动失败问题

    最近用到udev自动挂载U盘,下载udev源码编译后,放在设备里运行,发现udev启动后立即就退出了, 通过加--debug参数可以看到输出错误信息: [root@DMF:dev]#mkdir .ud ...