最近在uBuntu 16.04上部署了asp.net core程序,在这里把部署的全过程分享给需要的.net 码农们,有如错误之处欢迎拍砖指正。
目录
net core程序发布配置
linux安装nginx
linux安装 net core
创建服务文件
配制nginx
Nginx access.log配制
目录权限配制
在项目文件(.csproj)中添加引入强制发布依耐的申明,如果不加入下面这段申请,发布的文件里只有项目的dll,nuget引用包的dll不会生成的。
<PublishWithAspNetCoreTargetManifest>falsePublishWithAspNetCoreTargetManifest>
Views文件是否要打包成dll( 默认是打包成dll),建议Views打包成dll 。如果Views不想打包成dll添加如下申明即可。不打包为dll的好处就是view文件动态编译,直接扔到服务器就生效了,不需要重启 net core 服务。
<MvcRazorCompileOnPublish>falseMvcRazorCompileOnPublish>
使用 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
以下两个方式选一个即可,方式一简单,只要运行命令即可。
方式一:源包安装
注册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
在/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
如有反向代理,配制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。
精彩回顾
♡ 互联网公司各岗位真实工作内容起底
♡ 一次尴尬的采访和程序员的传奇脑洞!
♡ 天一冷,程序员都穿上格子衫
♡ 史上最真实的行业鄙视链曝光
♡ IT公司老板落水,各部门员工怎么救
♡ 宿命之战:程序员VS产品经理
♡ 作为一个前端,可以如何机智地弄坏一台电脑?
♡ 程序员跟产品经理打起来了,这是一个需求引发的血案...
♡ 后端说,你个前端不会用 headers吧,我怒了!
♡ 有个厉害的程序员女朋友是什么体验?
♡ 多年来,程序员经常加班的真相终于揭开了…
♡ 如果编程替换成中文就会怎样? 程序员看了表示头疼