尝试在CentOS和Ubuntu二个Linux的版本下安装Nginx并部署Net Core程序,整理安装过程作为给团队的部署人员参考。
0. 查看Linux系统版本
$lsb_release -a #Ubuntu下执行
Distributor ID: Ubuntu
Description: Ubuntu 16.04.2 LTS
Release: 16.04
Codename: xenial
$cat /etc/redhat-release #CentOS下执行
CentOS Linux release 7.3.1611 (Core)
1. 下载安装Net Core
详细的安装步骤参考微软Net Core网址,不同的Linux选择不同的版本。
CentOS下第一次安装先得执行这二句注册一下,然后安装sdk。
$sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
$sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
$sudo yum install libunwind libicu
$sudo yum install dotnet-sdk-2.1.4
$dotnet --version
2.1.4
Ubuntu下第一次安装也得注册,执行语句根据不同的Ubuntu的版本还有些许差异,注册后执行安装sdk。
$curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
$sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
$sudo apt-get install apt-transport-https
$sudo apt-get update
$sudo apt-get install dotnet-sdk-2.1.4
$dotnet --version
2.1.4
2. 安装Nginx
CentOS下最简单的方法是从EPEL软件库源上下载安装
$sudo yum install epel-release
$yum install nginx
Ubuntu 下安装nginx
$sudo apt-get update
$sudo apt-get install nginx
安装中发现错误,查看错误,是因为端口80被占用了,继续查看端口被那个进程占用,发现是以前安装的apache2. 先kill进程,再次安装。
$systemctl status nginx.service
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
$sudo netstat -tunlp|grep 80
tcp6 0 0 :::80 :::* LISTEN 1192/apache2
$sudo kill 1192
$sudo apt-get install nginx
$sudo netstat -tunlp|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6827/nginx -g daemo
tcp6 0 0 :::80 :::* LISTEN 6827/nginx -g daemo
3. 启动Nginx
Ubuntu下安装nginx后会自动启动,无需再手动执行,可以把nginx加到系统启动服务
$systemctl enable nginx #设置开机启动
CentOS下需手动启动
$systemctl start nginx #启用Nginx
$systemctl enable nginx #设置开机启动
可以通过浏览器访问服务器地址http://ip:80来看看nginx运行情况:
Nginx有几个基本功能,我们这里主要是用到2个:
- 静态HTTP服务器
This is the default index.html page that is distributed with nginx on Fedora. It is located in /usr/share/nginx/html.
静态网页放在指定目录就可以了。 - 基于反向代理的虚拟主机功能
我们通常在一个Linux服务器上部署多个Net Core应用,每个应用用不同的端口,接下来我们准备2个ASP Net Core应用作为例子。
4. 创建2个ASP Net Core Web应用
在Visual Studio 2017下新建2个ASP Net Core WebAPI应用,新建完只需要改一个地方,2个应用一个是5555端口,一个是5556端口:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:5555")//.UseUrls("http://0.0.0.0:5556")
.UseStartup()
.Build();
另外在Sample2的Controller简单改一下和Sample1区分开
public IEnumerable Get()
{
return new string[] { "value3", "value4" };
}
执行dotnet publish
发布后,把bin\debug\netcoreapp2.0\publish下的文件上传到Linux服务器上,可以使用WinSCP工具或rz sz命令来传递文件。
我们在Linux上运行Sample1试试:
# dotnet Sample1.dll
Hosting environment: Production
Content root path: /root/netcoresamples/sample1
Now listening on: http://0.0.0.0:5555
Application started. Press Ctrl+C to shut down.
我们用浏览器访问http://外网地址:5555/api/values,并不能访问成功,原因是5555端口并没有放开。如果没有Nginx的话,我们就需要放开端口。接下来我们通过配置Nginx实现通过80端口来访问Sample1和Sample2.
5. 配置Nginx
参考首页:
You should now put your content in a location of your choice and edit the root configuration directive in the nginx configuration file /etc/nginx/nginx.conf.
编辑/etc/nginx/nginx.conf,目前我们只给sample1和sample2配置2个二级目录,只需要增加2个location节点,增加后:
修改完配置后,最好使用命令检查下配置是否正确,这样可以排除配置格式错误导致配置不生效,影响服务器的稳定运行。
$nginx -t
修改配置后执行reload使配置生效
$sudo nginx -s reload
我们用浏览器测试一下Sample1和Sample2,测试前记得在Linux服务器上启动dotnet Sample1.dll
和dotnet Sample2.dll
服务.
6. Supervisor守护进程
Supervisor的主要功能是用来管理dotnet进程,确保Web API服务即使闪退也会自动重启,它还附带web管理界面使用方便。而且是微软官方推荐值得尝试。
详细使用可以参考文档 ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)。我们这里结合前面准备的sample1和sample2来尝试一下。
在 linux 中使用以下命令进行安装:
ubuntu
$sudo apt-get install supervisor
centos
$yum install supervisor
验证是否安装成功,执行命令
$echo_supervisord_conf
如果有很多内容,说明安装成功,这些内容实际上是/etc/supervisord.conf
文件的内容,我们查看这个文件,看最后一行
[include]
files = supervisord.d/*.ini
说明我们需要在/etc/supervisord.d/下添加ini的配置文件就可以,我们添加一个sample.ini
[program:Sample1]
command=dotnet Sample1.dll #要执行的命令
directory=/root/netcoresamples/sample1 #命令执行的目录
environment=ASPNETCORE__ENVIRONMENT=Production #环境变量
user=root #进程执行的用户身份
stopsignal=INT
autostart=true #是否自动启动
autorestart=true #是否自动重启
startsecs=3 #自动重启间隔
stderr_logfile=/root/netcoresamples/sample1/log/Sample1.err.log #标准错误日志
stdout_logfile=/root/netcoresamples/sample1/log/Sample1.log #标准输出日志
[program:Sample2]
command=dotnet Sample2.dll #要执行的命令
directory=/root/netcoresamples/sample2 #命令执行的目录
environment=ASPNETCORE__ENVIRONMENT=Production #环境变量
user=root #进程执行的用户身份
stopsignal=INT
autostart=true #是否自动启动
autorestart=true #是否自动重启
startsecs=5 #自动重启间隔
stderr_logfile=/root/netcoresamples/sample2/log/Sample2.err.log #标准错误日志
stdout_logfile=/root/netcoresamples/sample2/log/Sample2.log #标准输出日志
这里要注意,提交到Linux之前必须把中文注释都删除,否则会有错误。
重新启动supervisord需执行
$supervisorctl shutdown
$supervisord -c /etc/supervisord.conf
Supervisor 默认给我们提供了一个图形界面来供我们管理进程和任务,只需要把supervisord.conf里一段注释去掉,并修改地址为0.0.0.0
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123321 ; (default is no password (open server))
还需重启supervisord。另外需把9001端口加到Nginx配置上
最后在浏览器上运行的效果如下
我们测试一下supervisor的作用,强行kill dotnet Sample1.dll对应的进程,马上dotnet又自动启动了。