NetCore在Centos7上部署和Nginx集群部署访问

时间:2022-06-27 06:59:03

NetCore在Linux上部署

工具:WMWare虚拟机,Wmware12,CentOS7ISO镜像,VS2017

1、安装虚拟机,过程略,网上一搜一大把

2、用VS2017建一个NetCore的Web项目,用命令行生成也可以,然后发布

3、搭建Linux下的NetCore运行环境

  Linux下访问这个网站:https://www.microsoft.com/net/download/windows

  NetCore在Centos7上部署和Nginx集群部署访问

  点击红色的部分,然后跳转到另一个页面,同时下载文件

  NetCore在Centos7上部署和Nginx集群部署访问

  按照上面的步骤配置好NetCore SDK。(个人认为使用Binaries方式简单些,如果你想换另一种方式,我没有异议)

4、windows下的发布包直接复制到主文件夹里面(home目录),然后进入复制过来的发布目录下,直接dotnet 项目名称.dll就可以访问5000端口了。

5、如果出现错误,请自己排查,大部分都是NetCore版本问题,也就是你VS生成的项目的NetCore版本和Linux上NetCore的版本不匹配

Nginx集群部署

1、这就需要在Home/Index文件上动手脚了,下面是我的代码

 1 using Cluster.Models;
 2 using Microsoft.AspNetCore.Mvc;
 3 using System.Diagnostics;
 4 
 5 namespace Cluster.Controllers
 6 {
 7     public class HomeController : Controller
 8     {
 9         public IActionResult Index()
10         {
11             ViewBag.RemoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;
12             ViewBag.Header = Request.Headers["X-Forwarded-For"];
13             ViewBag.LocalIpAddress = HttpContext.GetClientUserIp();
14             ViewBag.RequestHeaders = Request.Headers;
15             return View();
16         }
17 
18         public IActionResult About()
19         {
20             ViewData["Message"] = "Your application description page.";
21 
22             return View();
23         }
24 
25         public IActionResult Contact()
26         {
27             ViewData["Message"] = "Your contact page.";
28 
29             return View();
30         }
31 
32         public IActionResult Error()
33         {
34             return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
35         }
36     }
37 }
 1 using Microsoft.AspNetCore.Http;
 2 using System.Linq;
 3 
 4 namespace Cluster.Models
 5 {
 6     public static class IPExtension
 7     {
 8         public static string GetClientUserIp(this HttpContext context)
 9         {
10             var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
11             if (string.IsNullOrEmpty(ip))
12             {
13                 ip = context.Connection.LocalIpAddress.ToString();
14             }
15 
16             return ip;
17         }
18     }
19 }
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Threading.Tasks;
 5 using Microsoft.AspNetCore.Builder;
 6 using Microsoft.AspNetCore.Hosting;
 7 using Microsoft.Extensions.Configuration;
 8 using Microsoft.Extensions.DependencyInjection;
 9 
10 namespace Cluster
11 {
12     public class Startup
13     {
14         public Startup(IConfiguration configuration)
15         {
16             Configuration = configuration;
17         }
18 
19         public IConfiguration Configuration { get; }
20 
21         // This method gets called by the runtime. Use this method to add services to the container.
22         public void ConfigureServices(IServiceCollection services)
23         {
24             services.AddMvc();
25         }
26 
27         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
28         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
29         {
30             if (env.IsDevelopment())
31             {
32                 app.UseBrowserLink();
33                 app.UseDeveloperExceptionPage();
34             }
35             else
36             {
37                 app.UseExceptionHandler("/Home/Error");
38             }
39             //添加转发设置
40             app.UseForwardedHeaders(new ForwardedHeadersOptions {
41                 ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto
42             });
43             app.UseStaticFiles();
44 
45             app.UseMvc(routes =>
46             {
47                 routes.MapRoute(
48                     name: "default",
49                     template: "{controller=Home}/{action=Index}/{id?}");
50             });
51         }
52     }
53 }
 1 @{
 2     ViewData["Title"] = "Home Page";
 3 }
 4 
 5 客户端:<br />
 6 Request.HttpContext获取访问ip: @ViewBag.RemoteIpAddress
 7 <br />
 8 Request.Headers获取访问ip:@ViewBag.Header
 9 <br />
10 服务端:<br />
11 Request.HttpContext获取响应服务所在服务器的ip:@ViewBag.LocalIpAddress
12 <table class="table">
13     <thead>
14         <tr>
15             <th>key</th>
16             <th>value</th>
17         </tr>
18     </thead>
19     <tbody>
20         @foreach (var item in ViewBag.RequestHeaders)
21         {
22             <tr>
23                 <td>@item.Key</td>
24                 <td>@item.Value</td>
25             </tr>
26         }
27     </tbody>
28 </table>

我的是:Windows下把发布包挂到了IIS上,然后有个访问地址,Linux下直接dotnet命令启动,还是本地访问,所以上面的代码,对我来说没啥用

2、Linux安装Nginx,Nginx作为反向代理服务器会把接受的请求转发给对应的Server,不过是随机的,Nginx安装过程略

3、修改Nginx配置文件

 1 #集群站点配置
 2 upstream xxx.services{
 3     server IP地址1:端口1 fail_timeout=60s;
 4     server IP地址2:端口2 fail_timeout=60s;
 5 }
 6 
 7 server {
 8     #代理监听端口
 9     listen 80 default_server;
10     listen [::]:80 default_server;
11 
12     root /var/www/html;
13 
14     server_name _;   #_默认ip+端口访问,_可以替换成访问域名如:shenniu.core.com
15     #缓存文件路由
16     location ~ .*(\.(js|css|jpg|svg)).* {
17 
18         proxy_pass http://shenniu.services;
19         proxy_cache_valid 200;
20         proxy_cache my_cache;
21         expires 3d;
22     }
23     #集群站点路由
24     location / {
25 
26         proxy_pass http://xxx.services;  
27         #对应upstream后面的名称
28         proxy_http_version 1.1;
29         proxy_set_header Upgrade $http_upgrade; 
30         proxy_set_header Connection keep-alive;
31         proxy_set_header Host $host;
32         proxy_set_header X-Real-IP $remote_addr;
33         proxy_cache_bypass $http_upgrade;
34 
35         proxy_set_header X-Forwarded-For 
36         $proxy_add_x_forwarded_for;
37     }
38 }

注意用Root用户修改,有的Nginx.Conf文件是只读的,修改完之后 Nginx -r reload一下

然后访问Nginx吧,不出意外的话你就可以看到效果了

备注:部署集群是为了提高性能的,Nginx作为一个反向代理服务器在集群部署方面还是很不错的