程序员net

Linux下安装Nginx并部署Net Core Web API

2018-02-26  本文已影响1615人  voxer

尝试在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运行情况:

image.png
Nginx有几个基本功能,我们这里主要是用到2个:

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<Startup>()
                .Build();

另外在Sample2的Controller简单改一下和Sample1区分开

public IEnumerable<string> 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节点,增加后:

image.png

修改完配置后,最好使用命令检查下配置是否正确,这样可以排除配置格式错误导致配置不生效,影响服务器的稳定运行。

$nginx -t

修改配置后执行reload使配置生效

$sudo nginx -s reload

我们用浏览器测试一下Sample1和Sample2,测试前记得在Linux服务器上启动dotnet Sample1.dlldotnet Sample2.dll 服务.

image.png image.png

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配置上


image.png

最后在浏览器上运行的效果如下


image.png

我们测试一下supervisor的作用,强行kill dotnet Sample1.dll对应的进程,马上dotnet又自动启动了。

上一篇下一篇

猜你喜欢

热点阅读