• Linux部署.Net Core 3.1服务,并使用Nginx托管


    准备.NET Core环境

    1.注册 Microsoft 密钥和源

    sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

     2.安装 .NET Core SDK

    sudo yum install dotnet-sdk-3.1

     3.安装 ASP.NET Core 运行时

    sudo yum install aspnetcore-runtime-3.1

     站点部署

    1.创建目录

    mkdir /usr/dotnet

    2.将发布文件上传到服务器目录,我使用的是WinSCP工具上传的文件,这里不做介绍

    3.启动服务

    进入站点目录 cd /usr/dotnet
    启动服务 dotnet *****.dll

    启动成功后我们可以看到服务端口号

    4.访问站点

     5.如果访问失败,需要检查防火墙是否有开放端口及阿里云是否有配置端口

    开放端口:sudo firewall-cmd --zone=public --add-port=5000/tcp --permanent
    
    如果是FirewallD is not running状态,则执行:systemctl start firewalld,执行成功后,再重新配置端口
    

    查服务进程:ps -aux | grep   "TuoKeWeb.dll"   强制杀掉进程:kill -9 进程ID 
    重启防火墙 sudo firewall
    -cmd --reload 查看防火墙开放的端口 sudo firewall-cmd --list-ports

     安装配置Nginx

    1.安装Nginx

    sudo yum -y install nginx 

    2.启动Nginx并查看Nginx状态

    systemctl enable nginx --设置开机启动
    service nginx start  --启动nginx
    ps -ef | grep nginx --查看端口号

     3.为.NET Core服务站点配置反向代理

    找到nginx配置文件,我的路径是:/etc/nginx/nginx.conf,将以下配置复制到配置文件

    worker_processes 1; #设置值和CPU核心数一致
    error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
    pid /usr/local/webserver/nginx/nginx.pid;
    #Specifies the value for maximum file descriptors that can be opened by this process.
    worker_rlimit_nofile 65535;
    events
    {
    use epoll;
    worker_connections 65535;
    }
    http
    {
    include mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
    
    #charset gb2312;
    
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;
    
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 60;
    tcp_nodelay on;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    
    #limit_zone crawler $binary_remote_addr 10m;
    #下面是server虚拟主机的配置
    server
    {
    listen 80;
    server_name core.yz0735.cn;
    
    
    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;
    }
    location ~ .*.(js|css)?$
    {
    expires 15d;
    # access_log off;
    }
    access_log off;
    }
    
    }

    4.重新加载配置,访问站点

    service nginx reload

    配置好后,我们就可以通过域名+端口号访问服务了

    5.通过域名不带端口访问需要进行如下配置,端口为站点端口

    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 5000
    
    另外如果防火墙重新启动,该命令就会失效,可以使用下面的命令把该规则保存到iptables里面。
    
    service iptables save

    配置好后,我们可以直接通过域名不带端口号访问站点

    创建Supervisor进程守护监控

    1.先安装epel,软件包更丰富点

    yum install epel-release

    2.安装Supervisor

    yum install -y supervisor
    systemctl enable supervisord # 开机自启动
    systemctl start supervisord # 启动supervisord服务

    3.创建.Net Core项目的Supervisor配置文件

    #进入supervisord.d目录
    cd /etc/supervisord.d
    
    #新建NetCore进程配置文件
    sudo touch DemoNetCore.ini
    
    #查看和编辑DemoNetCore.ini配置文件
    sudo vim DemoNetCore.ini
    
    #进入文件后,按“i”或者“a”进入插入模式,插入下面的配置信息

    将以下配置复制到刚创建的DemoNetCore.ini配置文件

    #配置程序名称,
    [program:DemoNetCore]
    #运行程序的命令
    command=dotnet TuoKeWeb.dll --urls="http://*:5000;"
    #命令执行的目录
    directory=/usr/dotnet
    #进程环境变量
    environment=ASPNETCORE_ENVIRONMENT=Production
    #进程执行的用户身份
    user=root
    #进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号默认为TERM 。当用设定的信号去干掉进程,退出码会被认为是expected,非必须设置
    stopsignal=INT
    #如果是true的话,子进程将在supervisord启动后被自动启动,默认就是true,非必须设置
    autostart=true
    #这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
    autorestart=true
    #这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了,默认值为1 。非必须设置
    startsecs=1
    #错误日志文件
    stderr_logfile=/var/log/DemoNetCore.err.log
    #输出日志文件
    stdout_logfile=/var/log/DemoNetCore.out.log
    #按ESC,输入命令保存配置文件
    :wq   (保存编辑操作退出)
    :wq!  (保存编辑强制退出)
    :w ! sudo tee %
    #通过配置文件来启动supervisor
    sudo supervisord -c /etc/supervisord.conf
    
    #启动supervisorctl
    sudo supervisorctl -c /etc/supervisord.conf
    
    #重新加载配置文件
    reload
    
    #查看运行的状态
    status
    #查看相关进行
    ps -aux | grep "TuoKeWeb.dll"
    
    #访问启动的站点
    curl http://localhost:5000/Home/Test

    如下图所示,Supervisor已经开启了dotnet进程,访问接口地址,返回数据成功

     5.配置Supervisor开机自启动

    #进入system目录
    cd /usr/lib/systemd/system
    
    #编辑supervisord.service文件
    sudo vim supervisord.service

    supervisord.service文件内容如下

    [Unit]
    Description=Process Monitoring and Control Daemon
    After=rc-local.service nss-user-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
    ExecStop=/usr/bin/supervisorctl shutdown
    ExecReload=/usr/bin/supervisorctl reload
    KillMode=process
    Restart=on-failure
    RestartSec=42
    
    [Install]
    WantedBy=multi-user.target

    编辑好后保存退出,然后执行命令,查看是否启动成功

    #启动服务
    systemctl enable supervisord
    
    #验证一下是否为开机启动
    systemctl is-enabled supervisord

     6.验证进程守护监控效果

    #查看dotnet进程
    ps -aux|grep dotnet
    
    #强制杀死dotnet进程
    kill -9 %PID
    
    #再次查看dotnet进程
    ps -aux|grep dotnet

    Supervisor常用命令

    # 启动所有
    supervisorctl start all
    
    # 重启所有
    supervisorctl restart all
    
    # 停止所有
    supervisorctl stop all
    
    #PS:要操作某个服务,把all换成服务名即可
    
    #查看服务状态
    supervisorctl status
  • 相关阅读:
    php中的imagettftext函数
    CMD命令
    Python基础学习笔记三
    java多线程中等待线程与被阻塞线程的区别
    转:hibernate中的N+1问题
    转:Mina2.0框架源码剖析(六)
    转:在Spring中配置Hibernate的事务
    转:Mina2.0框架源码剖析(八)
    转:Mina2.0框架源码剖析(五)
    转:JAVA集合框架思考
  • 原文地址:https://www.cnblogs.com/xiaoguli/p/15353782.html
Copyright © 2020-2023  润新知