一.服务器配置
操作系统:银河麒麟桌面操作系统V10
CPU:intel i5
内存:16G
内核:5.10.0.8-generic
未激活
二.运行环境安装
.netcore 6.0 runtime时安装下载离线包
Download .NET 6.0 (Linux, macOS, and Windows)
-下载完后进行解压
sudo su #提权
mkdir -p $HOME/dotnet && tar zxf aspnetcore-runtime-6.0.21-linux-x64.tar.gz -C $HOME/dotnet #创建文件夹并解压到指定文件夹
.netcore 3.0 runtime时安装下载离线包
Download .NET Core 3.1 (Linux, macOS, and Windows)
-下载完后进行解压
mkdir -p $HOME/dotnet && tar zxf aspnetcore-runtime-3.1.32-linux-x64.tar.gz -C $HOME/dotnet #创建文件夹并解压到指定文件夹
加入环境变量配置
source /etc/profile #退出文件后,重新执行此文件
dotnet --info #查看.NET 信息
dotnet --version #查看.NET 版本信息
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$DOTNET_ROOT
其他命令:
#文件解锁:
sudo chmod 777 /data/website/d/css/public.css
Linux守护进程工具Supervisor
Supervisor安装
1.安装命令
apt-get install supervisor
测试安装时候成功
ps ax | grep supervisor
2. 配置supervisor
每个进程的配置文件都可以单独分拆,放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名,例如,app.conf定义了一个helloworld的进程
[program:helloword]
command=/data/app/helloworld
directory=/data/app
3. 启动Supervisor
/etc/init.d/supervisor restart
这样我们的web服务程序就可以作为一个稳定的接口提供服务了
三.编译发布
四.运行
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$DOTNET_ROOT
dotnet /data/website/E/E.WebHost.dll --urls "http://*:5006"
运行如图:
五.注意事项
1.windows的不支持在linux里使用的dll场景:
中断性变更:仅在 Windows 上支持 System.Drawing.Common - .NET | Microsoft Learn
2.linux的文件路径是区分大小写的:
如果文件夹是Assets的话 那如下地址是读取不到的 会报404
http://127.0.0.1:5006/assets/12.js
六.nginx配置
七.防火墙
格式如下
sudo firewall-cmd -add-port=3306/tcp
下方命令是开放所有端口的命令
出口和入口都要设置
sudo firewall-cmd --permanent --zone=public --add-port=0/tcp,0/udp sudo firewall-cmd --reload
八.常见问题以及解决办法
a.验证码功能
在windows会用到System.Draw进行绘图,但该dll在linux是不支持的,会报错
解决办法:去掉System.Draw.dll的引用,改安装:SixLabors.ImageSharp.Drawing
具体nuget下搜索SixLabors.ImageSharp.Drawing
我用的是如下这个版本
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="2.1.3" />
然后将验证码生成Base64图片
using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
{
public class CaptchaUtil
{
/// <summary>
///
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static string CreateBase64Imgage(string code)
{
var image = GenerateCaptchaImage(code);
using (MemoryStream stream = new MemoryStream())
{
image.Save(stream, SixLabors.ImageSharp.Formats.Png.PngFormat.Instance);
byte[] imageBytes = stream.ToArray();
return Convert.ToBase64String(stream.ToArray());
}
}
private static Image<Rgba32> GenerateCaptchaImage(string code)
{
//验证码颜色集合
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
var image = new Image<Rgba32>((int)code.Length * 18, 30);
image.Mutate(x => x
.BackgroundColor(Color.White)
.Fill(Color.LightSteelBlue, new RectangularPolygon(1, 1, 119, 30)));
Random random = new Random();
var fontName = "Arial";
if (!SystemFonts.Families.Any(x => x.Name == fontName))
fontName = SystemFonts.Families.FirstOrDefault().CreateFont(18).Name;
var font = SystemFonts.CreateFont(fontName, 18);
//在随机位置画背景点
for (int i = 0; i < 45; i++)
{
int x1 = random.Next(image.Width);
int y1 = random.Next(image.Height);
var font2 = SystemFonts.CreateFont(fontName, 6);
image.Mutate(x => x.DrawText("▪", font2, c[random.Next(0, c.Length)], new PointF(x1, y1)));
}
//验证码绘制在g中
for (int i = 0; i < code.Length; i++)
{
int cindex = random.Next(7);//随机颜色索引值
int findex = random.Next(5);//随机字体索引值
Font f = SystemFonts.CreateFont(fontName, 15, FontStyle.Bold);//字体
Brush b = new SolidBrush(c[cindex]);//颜色
int ii = 12;
if ((i + 1) % 2 == 0)//控制验证码不在同一高度
{
ii = 10;
}
image.Mutate(x => x.DrawText(code.Substring(i, 1), f, c[random.Next(0, c.Length)], new PointF(10 + (i * 12), ii)));
}
return image;
}
}
}
生成的效果如图: