本系列将开始.netcore在Linux上的跨平台之旅,从最初的.netcore在Linux平台上运行示例开始;

一个demo

运行一个.netcore示例

先看下本机安装的dotnet版本信息:

image-20230520002206618

开始构建dotnet demo:

1
dotnet new webapp -n AspNetCoreDemo -o firstwebapp

image-20230520002448353

编译并运行项目:

1
dotnet run

image-20230520002553831

将项目发布到指定位置:

1
dotnet publish -o /var/testdotnet/

image-20230520002917901

将打包好的应用运行起来:

1
dotnet /var/testdotnet/AspNetCoreDemo.dll 

image-20230520122243328

但是这时候外部是无法访问的,因为是内网起的应用;

image-20230520122821860

内部可以访问:

image-20230520130327331

我们可以改到0.0.0.0对外全部放开,然后就可以外部访问了,但是一般不推荐这么做;

这时候我们可以用一个nginx代理一个应用程序,我们知道nginx 做的不仅仅是代理,nginx 有安全模块、限流模块、记录等等日志,这样我们就不用在应用程序中实现类似的功能,大大降低了项目的复杂度;

安装Nginx

我这里的环境是Ubuntu18.04系统,可以在线安装nginx, 当然也可以编译安装指定版本nginx。这里因为Nginx 软件包在默认的 Ubuntu 存储库中可用。 安装非常简单,就在线安装下;

image-20230520123213736

1
2
3
4
5
sudo apt update

# 下面二选一
sudo apt install nginx 
sudo apt install -y nginx

查看nginx版本与服务启动状态:

image-20230520123638854

这时候我们输入ip地址,正常出现了Nginx默认的界面,这表明可以正常使用了,Nginx安装成功;

image-20230520123849238

Nginx代理应用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        location / {
         proxy_pass         http://localhost:5000;
         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;
        }

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

然后nginx配置重新加载配置或者重启服务一下:

1
2
3
4
5
6
# 检查nginx配置是否出错
sudo nginx -t
# 在进行一些配置更改后重新加载Nginx服务:
sudo systemctl reload nginx
# 重新启动Nginx服务:
sudo systemctl restart nginx

创建服务文件

什么是服务文件?

在 Linux 中,还有具有“.service”扩展名的单元配置文件,用于在进程退出时控制守护程序的行为。 这些文件也称为 服务文件、 单元文件和 服务单元文件。

这些服务文件位于以下目录之一:

/usr/lib/systemd/system:存储已下载应用程序的服务文件 /etc/systemd/system/:存储由系统管理员创建的服务文件

这两个分别放什么呢?

比如这种nginx 一般是第三方的程序,就放在/usr/lib/systemd/system下面。

一般yum安装都在里面。

然后/etc/systemd/system/ 这里放的是我们自己的应用程序。

这里就可以在这个目录下写一个:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description= AspNetCoreDemo
[Service]
WorkingDirctory:/var/testdotnet/
ExecStart=/usr/bin/dotnet /var/testdotnet/AspNetCoreDemo.dll
Restart=aways
RestartSec=10
SyslogIdentifier=AspNetCoreDemo
User=root
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

上述配置文件的含义解释一下:

  • WorkingDirectory 是发布应用程序的目录。
  • ExecStart 是启动应用程序的实际命令。
  • Restart=always 是不言而喻的。 如果由于某种原因(崩溃、异常等)而停止,则始终会启动此过程。
  • RestartSec=10 也是不言而喻的。 进程停止后,将在经过 10 秒后启动。
  • SyslogIdentifier 很重要。 它表示“系统日志标识符”。 有关守护程序的信息记录在此名称下的系统日志中。 还可以使用此标识符查找进程的 PID。
  • User 是管理服务的用户。 它应存在于系统中,并具有相应的应用程序文件所有权。
  • Environment可以在服务文件中设置任意数量的环境变量。

img

然后这里有一个disable,这个意思是系统重启后不会去启动这个。

设置enable:systemctl enable AspNetCoreDemo

img

这里就会创建一个链接过去。 这里面的就是开启自启动的。

img

类似的可以用iptables具体为你的应用做一些访问需求,可以在规则里面配置;

再看Linux

linux 是基于名为procfs的特殊文件系统。在Linux上,可以认为一切皆文件;

通常,数据会在启动时映射到名为 /proc 的装入点。 proc 文件系统充当内核中内部数据结构的接口。 可以使用该文件获取有关系统的信息,并在运行时更改某些内核参数 (sysctl) 。

进程被视为 /proc/ 目录下的文件。 此目录在此处定义为特殊目录:该目录就是保存有关 Linux 系统的所有详细信息,包括其内核、进程和配置参数等。

我们常见的查看内存,可以用free命令,同时也可以使用:cat /proc/meminfo

image-20230520174807898

又比如查看cpu信息:cat /etc/cpuinfo

image-20230520174928126

可以看到机器的cpu是:Intel(R) Core(TM) i5-8300H CPU @ 2.30GHz

我们来查看进程信息:

image-20230520175635641

这个我们进入13956这个目录里面看一下:

image-20230520175754920

这目录里面就是这个进程运行的数据;

查看cmdline和进程环境变量:

image-20230520180327804

Linux排查

最基础的排查方式就是查看内存,CPU, 硬盘,网络等信息;

首先最耳熟能详的就是top命令;

image-20230520181140984

如果上述显示的信息不能满足我们的查看要求,可以按f去选择自己想要的信息;

image-20230520181336242

通过空格,选择自己需要看的信息。

然后使用man top 查看用法。

top -p xxx 查看某一个进程,然后有个比较好用的是 top -Hp xxx

这个是查看线程模式:

image-20230520181555354

可以观察到线程的运行情况。

如果运行太多,可以使用U来查看某个用户的进程。

1
top -u root

如果查看正在使用cpu的进程可以使用-i,比如 top -i -u root 这样查看。

image-20230520182055853

类似的还有很多性能观察工具htop, vmstat, procinfo, gnome-system-monitor, mpstat等等可用, 可以多方面多维度的观察Linux的性能指标;