asp.net core 程序在nginx上部署 完整教程

最近在uBuntu 16.04上部署了asp.net core程序,在这里把部署的全过程分享给需要的.net 码农们,有如错误之处欢迎拍砖指正。

目录

  • net core程序发布配置

  • linux安装nginx

  • linux安装 net core

  • 创建服务文件

  • 配制nginx

  • Nginx access.log配制

  • 目录权限配制



net core程序发布配置

  1. 在项目文件(.csproj)中添加引入强制发布依耐的申明,如果不加入下面这段申请,发布的文件里只有项目的dll,nuget引用包的dll不会生成的。

    <PublishWithAspNetCoreTargetManifest>falsePublishWithAspNetCoreTargetManifest>

asp.net core 程序在nginx上部署 完整教程_第1张图片

  1. Views文件是否要打包成dll( 默认是打包成dll),建议Views打包成dll 。如果Views不想打包成dll添加如下申明即可。不打包为dll的好处就是view文件动态编译,直接扔到服务器就生效了,不需要重启 net core 服务。

     <MvcRazorCompileOnPublish>falseMvcRazorCompileOnPublish>


linux安装nginx

       使用 apt-get 安装 Nginx。 安装程序将创建一个 systemd init 脚本,该脚本运行 Nginx,作为系统启动时        的守护程序。  

sudo -s
nginx=stable # use nginx=development for latest development version
add-apt-repository ppa:nginx/$nginx
apt-get update
apt-get install nginx

运行以下命令显式启动:

sudo service nginx start

检查nginx是否安装成功,如果出现版本号,则说明安装成功。

nginx -v


limux安装 net core 环境

以下两个方式选一个即可,方式一简单,只要运行命令即可。

  • 方式一:源包安装

    注册Microsoft key和依耐

    wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb

    安装.net core sdk

    sudo apt-get install apt-transport-https
    sudo apt-get update
    sudo apt-get install dotnet-sdk-2.1

    注意,我的linux是Ubuntu 16.04,如果你的linux是其他版本可以下面的链接页面找到对应的命令。

        https://www.microsoft.com/net/download/linux-package-manager/ubuntu16-04/sdk-current


    验证是否安装成功

    dotnet --version


  • 方式二: 安装包方式安装

    包装包的方式安装,我没有实际操作。直接把包下载地址贴下面,感兴趣的同学可以尝试安装下

       https://www.microsoft.com/net/download/dotnet-core/2.1


创建服务文件

程序发布后,压缩为zip 通过ftp上传到服务器 。服务器通过unzip命令解压。 解压后可先直接运行看是否成功

Dotnet  /目录/项目.dll

如果是成功的,就可以创建服务文件了。

vi /etc/systemd/system/kestrel-hellomvc.service

示例服务文件:

[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
WorkingDirectory=/var/aspnetcore/hellomvc
ExecStart=/usr/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

WorkingDirectory 和ExecStart根据你程序所在目录调整。

注意:如果系统没有 www-data用户,则必须先创建 www-data用户,并在程序所在目录为www-data分配适当的权限。  Cenos默认没有www-data用户。当然这里可以指定用其他用户启动,如root。


保存该文件并启用该服务。

systemctl enable kestrel-hellomvc.service

启动该服务,并确认它正在运行。

  systemctl start kestrel-hellomvc.service

检查服务是否启动成功

systemctl status kestrel-hellomvc.service

当更新程序时上传dll后需要restart后才生效

 systemctl restart kestrel-hellomvc.service  

用curl看下net core网站是否生效。

curl -I localhost:5000



配制nginx

在/etc/nginx/sites-enabled中新增配置文件

 vi /etc/nginx/sites-enabled/www.test.com
 server {
   listen        80;
   server_name   example.com *.example.com;
   location / {
       proxy_pass         http://localhost:5000;
       proxy_http_version 1.1;
       proxy_set_header   Upgrade $http_upgrade;
       proxy_set_header   Connection keep-alive;
       proxy_set_header   Host $host;
       proxy_cache_bypass $http_upgrade;
       proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header   X-Forwarded-Proto $scheme;
   }
}

检查nginx是否有错误

Nginx –t  

重启nginx

Nginx  -s reload



Nginx access.log配制

  • 如有反向代理,配制access.log获取真实访客ip 。

    step1:修改nginx默认配置文件,增加一条access log格式  

vi /etc/nginx/nginx.conf

 找到log_format,添加如下格式,http_x_forwarded_for 就是真实访客ip字段。

    log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"  $request_time';

       step2:指定access log格式

 server {
   listen        80;
   server_name   example.com *.example.com;
   access_log    /var/log/nginx/example.com/access.log main;  # 指定access.log格式
   error_log     /var/log/nginx/example.com/error.log;        #
   location / {
       proxy_pass         http://localhost:5000;
       proxy_http_version 1.1;
       proxy_set_header   Upgrade $http_upgrade;
       proxy_set_header   Connection keep-alive;
       proxy_set_header   Host $host;
       proxy_cache_bypass $http_upgrade;
       proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header   X-Forwarded-Proto $scheme;
   }
}

  • Access  log 日志的分割

  nginx的access.log 默认是不会分文件存储。我们希望access.log按日期存储每天一个文件,便于我们分析log。要达到此目的可利用limux自带的 Logrotate工具进行access.log 按每天切割 。

vi   /etc/logrotate.d/nginx
/usr/local/nginx/logs/nginx.access.log {
   monthly
   rotate 5
   compress
   delaycompress
   missingok
   notifempty
   create 644 root root
   postrotate
       /usr/bin/killall -HUP rsyslogd
   endscript
}

 

  • monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。

  • rotate 5: 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。

  • compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。

  • delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。

  • missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。

  • notifempty: 如果日志文件为空,轮循不会进行。

  • create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。

  • postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。

上面的模板是通用的,而配置参数则根据你的需求进行调整,不是所有的参数都是必要的。

更多Logrotate内容:http://blog.51cto.com/liqingbiao/1714992  


目录权限配制

给程序需要写入权限的目录配制权限。如upload上传目录

 Chown  www-data  upload   #文件所属用户指定为www-data
 Chmod  600  Log       # 加写入权限 

OK,到此asp.net core在nginx上就部署完成了。如果上述操作步骤碰到什么问题,欢迎识别下方二维码加我微信一起交流,请备注net core。


asp.net core 程序在nginx上部署 完整教程_第2张图片



精彩回顾

♡ 互联网公司各岗位真实工作内容起底

♡ 一次尴尬的采访和程序员的传奇脑洞!

♡ 天一冷,程序员都穿上格子衫

♡ 史上最真实的行业鄙视链曝光

♡ IT公司老板落水,各部门员工怎么救

♡ 宿命之战:程序员VS产品经理

♡ 作为一个前端,可以如何机智地弄坏一台电脑?

♡ 程序员跟产品经理打起来了,这是一个需求引发的血案...

 后端说,你个前端不会用 headers吧,我怒了!

♡ 有个厉害的程序员女朋友是什么体验?

 多年来,程序员经常加班的真相终于揭开了…

 如果编程替换成中文就会怎样? 程序员看了表示头疼


640?wx_fmt=gif

你可能感兴趣的:(asp.net core 程序在nginx上部署 完整教程)