• 部署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端口服务,刷新系统页面展示为:

  • 相关阅读:
    Android开源库
    银行卡的数字检測
    hdu4941 Magical Forest
    android之检測是否有网络
    在Oracle数据库中使用NFS,怎样调优?
    centos+nginx+php-fpm+php include fastcgi_params php页面能訪问但空白,被fastcgi_params与fastcgi.conf害慘了
    漫谈反射
    Android 四大组件学习之BroadcastReceiver二
    【LeetCode】two num 利用comparable接口 对对象进行排序
    扩展功能==继承?
  • 原文地址:https://www.cnblogs.com/jizhong/p/13725358.html
Copyright © 2020-2023  润新知