.net core在Centos上docker部署并使用nginx转发kestrel

由于本次部署是连接centos本地sqlserver
先决条件,需具备以下sqlserver,nginx,docker
当然你也可以选择链接其它位置数据库

1. 安装库

1.1 安装sqlserver

在centos7.x安装Sqlserver
出处https://www.cnblogs.com/shapman/p/12347433.html

1.2 安装nginx

在centos7.x安装nginx
出处https://blog.csdn.net/qq_37345604/article/details/90034424
中途遇到yum错误,参考解决方案

1.3 安装docker

参考菜鸟教程
命令键入docker -v
出现docker版本安装成功

2. 部署教程

2.1 在项目中添加docker file

如下图所示,鼠标右键添加docker支持
在这里插入图片描述
docker文件改为如下

#开放5000端口,镜像默认80更改为5000
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
WORKDIR /app
EXPOSE 5000
EXPOSE 5001
COPY . .
ENV ASPNETCORE_URLS=http://+:5000
ENTRYPOINT ["dotnet", "Qiushui.Core.Blog.dll","--server.urls","http://*:5000"]

注意:

  • 第一行from需要改为你自己项目对应的.net core版本(生成的dockerfile默认有)
  • 开放5000以及5001端口
  • 设置urls为5000,更改默认镜像的80端口,缘由参考下面
  • 修改默认端口80为5000

2.2 设置launchSettings.json以及appsettings.json

例如:项目名字以及域名不一致,记得修改为自己的

"Qiushui.Core.Blog": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
      //"applicationUrl": "http://www.qiubb.com:5002;https://www.qiubb.com:5003"
    },

切记修改为自己的https证书文件,以及密码

 "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://www.qiubb.com:5000"
      },
      "HttpsInlineCertFile": {
        "Url": "https://www.qiubb.com:5001",
        "Certificate": {
          "Path": "xxx.pfx",
          "Password": "password"
        }
      }
    },
    "Certificates": {
      "Default": {
        "Path": "qiubb.com.pfx",
        "Password": "password"
      }
    }
  },

参考以下链接

2.3 生成发布版本文件,并上传至centos指定文件夹

发布配置如图
用到了FileZilla工具连接centos进行文件的上传等操作。
推荐使用windows terminal进行操作
cd到你的文件目录例如cd /filename
cd到文件目录
执行编译命令
镜像名字叫 blogcore-image,禁用缓存,否则迭代时会出问题

docker build --no-cache -t blogcore-image .  //注意这个点 . 表示当前目录

用镜像 blogcore-image 创建容器,指定容器名称是 blogcore-container,指定时区(默认是美国时间,相差8小时)
//修改默认时区到亚洲/北京,并且将容器里的 5000 端口映射到 linux 主机的 5000端口,最后每次运行失败后自动重启

docker run  --name=blogcore-container -dp  5000:5000 -p 5001:5001 --restart=always  -e LC_ALL="en_US.UTF-8" -e TZ="Asia/Beijing" blogcore-image 

执行命令docker ps -a会看到所有的运行容器,例如
dockre容器
此处可能出现WARNING: IPv4 forwarding is disabled. Networking will not work.将会请求不到本地centos的sqlserver数据库!!!!
参考docker容器无法访问宿主机端口
解决方案:转发ipv4,参考启动docker 端口映射时IPV4无法使用

docker rm ID //删除docker run 的镜像
docker stop ID //停止运行
docker start ID //开始运行
docker logs ID //查看日志,非常有用
docker images //查看所有镜像
docker rmi //删除镜像,需要先删除已经docker run的container

如果你想要查看刚刚创建的容器的时区是否成功,可以执行命令:

docker exec blogcore-container date //查询当前容器时区

2.4 修改host匹配

文件位置/etc/hosts,可以手动覆盖,也可以直接centos操作,参考修改host

127.0.0.1 www.qiubb.com
127.0.0.1 qiubb.com

此处我是将我需要的域名映射到127.0.0.1,以便kestrel请求

2.5 防火墙开放相应端口

开放端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
重载:firewall-cmd --reload
端口查看:firewall-cmd --list-ports
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld

2.6 nginx转发kestrl请求

docker logs Id出现以下说明我们完成了九成只差最后一步
在这里插入图片描述
上图中出现overriding xxx,解决方案点这

配置nginx中的config,参考配置如下

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
   
    keepalive_timeout  65;

    gzip  on;
	#nginx中的每个server就是一个反向代理配置,可以有多个server

    server {
        listen  443 ssl;
        server_name qiubb.com *.qiubb.com;
        client_max_body_size 1g;
        ssl_certificate   /usr/local/nginx/cert/1_qiubb.com_bundle.crt;#你的证书在centos存放地址
        ssl_certificate_key  /usr/local/nginx/cert/2_qiubb.com.key;#你的密钥
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    #按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #按照这个套件配置
        ssl_prefer_server_ciphers on;
        add_header X-Frame-Options "SAMEORIGIN";    #保护Nginx 免受点击劫持的侵害
        add_header X-Content-Type-Options "nosniff";    #阻止MIME 类型探查
       
        location /  {
            proxy_set_header Host $http_host;
            proxy_pass   https://www.qiubb.com:5001;#此处改为自己的kestrl监听地址,appsetting中的https
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection upgrade;
  
            proxy_connect_timeout 600;
			proxy_read_timeout 600;
			proxy_http_version 1.1;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    server {
        listen     80;
        return     301 https://$host$request_uri;
    }
}

上述配置参考官网配置,上文有链接。
nginx的配置文件存放请参考上文安装,一般默认在/usr/local/nginx/conf
执行nginx -t检查默认配置,此处可能出现未安装ssl。unknown directive ssl,解决方案点这
检查配置
执行nginx -s reload未出现问题,大功告成。
实例

3. 后文

折腾了好几天的linux部署也算是完成了,其实windows不香吗,香死了。有关supervisor守护进程的参考后续文章。遇到的问题上述文中链接应该都能找到解决方案。
懒得搬过来了,点这儿过去


版权声明:本文为qq_36479244原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。