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