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

尝试在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个:

  • 静态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<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又自动启动了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容