zoukankan      html  css  js  c++  java
  • 部署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端口服务,刷新系统页面展示为:

  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/jizhong/p/13725358.html
Copyright © 2011-2022 走看看