部署dotnet到centos并启用nginx(含负载均衡与热备)

1.安装dotnet sdk

命令如下:

rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
yum install dotnet-sdk-3.1

安装完成后,通过命令:dotnet --version来验证。

2.安装部署dotnet程序

打包时,请注意IP配置,如果使用默认配置,那么只能通过localhost而非IP:端口方式访问,具体解决办法请参照:

https://www.cnblogs.com/huangxincheng/p/9569133.html

本文在appsettings.json文件中添加urls项目:"urls": "http://*:5000"来指定所有IP均可访问,配置文件的调用代码在Program.cs文件中,如下所示:

  public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseConfiguration(new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
                            .AddJsonFile("appsettings.json")
                            .Build()).UseStartup<Startup>();
                });

安装完成后,打开IP:5000端口验证。

3.安装nginx

yum install epel-release
yum install nginx

安装完成后,可以通过命令:

which nginx

来查看nginx的主文件所在目录,如果想查看nginx的配置文件,则可以通过以下命令查看:

nginx -t

nginx配置过程:

打开 /etc/nginx/nginx.conf,修改如下:

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

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

        location / {
                proxy_pass http://localhost:5000;
        }

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

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

配置完成后,使用命令启动nginx:/usr/sbin/nginx,发现报错:

问题排除过程如下:

打开配置文件nginx.conf,找到记录错误的日志文件位置,然后打开错误日志文件,如下:

可以根据错误日志的展示,然后配置upstreams部分,然后运行/usr/sbin/nginx命令,一切正常。但是——如果用systemctl start nginix.service命令运行,发现通过http请求,服务器还报相同错误,通过systemctl status nginx.service查看错误详情为:

然后一顿搜索,查找原因为:系统创建进程前就找进程文件,解决方法为:先新建目录:

mkdir -p /etc/systemd/system/nginx.service.d

然后新建一个文件:override.conf,内容如下(或者使用命令:printf "[Service] ExecStartPost=/bin/sleep 0.1 " > /etc/systemd/system/nginx.service.d/override.conf):

[Service]
ExecStartPost=/bin/sleep 0.1

完成后,运行systemctl daemon-reload使之生效。此时,前端调用服务器,发现还报502错误,打开error.log文件,发现错误如下:

2020/09/25 15:16:17 [crit] 9663#0: *15 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 192.168.102.1, server: _, request: "GET / HTTP/1.1", 
upstream: "http://127.0.0.1:5000/", host: "192.168.102.128"

然后查找原因,发现是SeLinux阻止所致,解决办法有:1.关闭SeLinux。2,使用命令增加权限(参考:http://www.osheep.cn/827.html):

setsebool -P httpd_can_network_connect 1

之后再次发出http请求,发现服务端一切正常。

nginx.conf最终配置配置为:

    upstream backend {
        server localhost:5000;
    }
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

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

        location / {
                proxy_pass http://localhost:5000;

        }

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

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

nginx.service的最终配置为:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

注意:如果仅仅修改完配置文件重新运行nginx是无法重新加载的,正确的步骤为:

  • 首先,nginx不用停机,让nginx继续运行。
  • 其次,修改配置文件。
  • 再次,运行命令:/usr/sbin/nginx -s reload来使nginx来重新加载配置文件。
  • nginx的运行命令为:/usr/sbin/nginx,停止命令为:/usr/sbin/nginx -s stop.

通过nginx代理,http请求页面展示如下:

nginx负载均衡&热备

nginx负载策略:

  1.轮询方式(默认) 

  2.权重weight方式,在轮询的基础上设置权重,权重越高,该服务器获得的访问越高,默认weight=1.

  3.ip_hash方式,基于ip地址策略,保证特定的ip请求分到固定的服务器上,适合于session不能跨服务器情况。

  4.基于最少连接,将请求转发至后台连接较少、负载较少的服务器上。

  5.基于第三方插件,有:

    5.1 fair,基于响应时间,响应时间短的服务器将会获得更多的请求。

    5.2 url_hash将固定的url请求分到特定的服务器上,使服务器的缓存更加有效地响应请求。

实际配置:

upstream backend {
        server localhost:5000;
        server localhost:4000 backup;
    }
    server {
        #listen       80 default_server;
        listen       80;
        server_name  localhost;
        root         /usr/share/nginx/html;

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

        location /{
             proxy_pass http://backend;
        }

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

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

配置结论:

  • 如果upstream部分写了backup,那么访问以非backup的服务为主,如果该服务停止,那么会自动切换到backup服务。
  • 如果没有写backup,那么nginx会以轮询方式平均分配请求到2台服务器上(如果其中一台服务宕机,则nginx会切换到另一服务上,这算是一种默认热备)。
  • proxy_pass名称要与upstream部分名称保持一致。

按以上配置,2个服务均正常时系统页面展示为:

手动停止5000端口服务,刷新系统页面展示为:

原文地址:https://www.cnblogs.com/jizhong/p/13725358.html