Centos下使用ngxin+supervisor部署netcore服务

背景

小白菜最近在腾讯云购买了一台云主机,配置是单核1G,后来我升级到了单核2G,起初系统使用的Windows Server 2012,开机一看内存,我去,500多M没了,好吧,安装个MySql,服务跑起来,我又去,Mysql吃了400多M,这这这...可怜的配置容不起这个昂贵的开销呀,果断从装系统,这次拥抱了Centos,开机后舒服多了,90多M,安装个Nginx跑restful先。

既然服务器选择了Centos,后端的选择有Nodejs、java、php...等,当然还有net-core,于是乎小白菜也尝尝鲜,在Centos部署个net-core版本的restful Api玩玩。

环境准备

1. 本地环境

本地依然使用Windows开发,环境清单如下

  • .NET Core 2.1 SDK
  • Visual Studio Code
  • 用于Visual Studio Code的C#

下面是下载地址:

https://www.microsoft.com/net/download/archives
https://code.visualstudio.com/download
https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp

安装完成之后,测试一下是否安装成功

dotnet --info

2. 服务器环境

登录我们的云主机,如果没有云主机,也可以在虚拟机中创建一台Centos,我使用的是putty进行管理。

首先安装rpm

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

再安装.NET SDK

sudo yum update
sudo yum install dotnet-sdk-2.1

测试一下是否安装成功

dotnet --info

输出如下信息,可以看到版本号


2018-11-26_163953.jpg

接着我们在服务器做一个Hello World!的控制台应用

dotnet new console -o myApp
cd myApp
dotnet run

输出了Hello World!

2018-11-26_164318.jpg

nginx安装

Nginx (engine x)是C语言开发的一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

1.编译ngixn依赖gcc环境,首先安装编译环境

yum install gcc-c++

2.ngxin需要pcre来解析正则表达式,pcre-devel 是使用pcre开发的一个二次开发库

yum install -y pcre pcre-devel

3.安装zlib提供压缩和解压缩的方式,nginx使用 zlibhttp 包的内容进行 gzip

yum install -y zlib zlib-devel

4.安装OpenSSL,强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,nginx不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL库。

yum install -y openssl openssl-devel

5.下载nginx安装包

wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

6.解压并进入文件夹

tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1

7.配置,使用默认配置

./configure

8.编译安装

make
make install

9.查看ngxin安装路径

whereis nginx

10.nginx的相关命令

#进入安装目录的sbin文件夹
cd /usr/local/nginx/sbin/

./nginx #启动
./nginx -s stop  #停止
./nginx -s quit  #退出
./nginx -s reload  #重新加载,修改配置文件后

ngxin安装完毕,启动ngxin后,浏览器输入ip地址,可以看到如下画面证明安装成功!


2018-11-27_141123.jpg

本地编写api代码

首先进入到你的工作空间,创建空文件夹

mkdir dotnet-core-webapi-test
cd dotnet-core-webapi-test

创建一个webapi项目,名字就叫TodoApi

dotnet new webapi -o TodoApi

如下图,创建成功!


2018-11-26_162002.jpg

然后使用Visual Studio Code打开这个文件夹,像介样子

2018-11-26_162235.jpg

在根目录添加host.json文件,用于配置api启动的端口,内容如下:

{ "url": "http://*:5000" }

修改Program.cs文件,加入配置的url

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            var config = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("host.json").Build();
            var url = config["url"];
            return WebHost.CreateDefaultBuilder(args).UseUrls(url).UseStartup<Startup>();
        }
    }

F5运行调试

2018-11-26_170704.jpg

输入地址http://localhost:5000/api/values在浏览器中查看,输出了默认的值,暂时不做任何修改,我们本篇的目的是把它部署到生产环境Centos上。

2018-11-27_165136.jpg

到目前为止,api项目已经跑起来了,我们接下来编译发布它。
在vscode中选择 Terminal > New Terminal打开一个终端窗口,在底部,默认地址是我们的项目文件夹地址。

2018-11-26_171739.jpg

输入dotnet publish发布该项目,发布到哪里去了,在bin\Debug\netcoreapp2.1\publish下面,就是需要部署到服务器的内所有文件。我们使用psftp将文件上传到服务器的/home/wwwroot目录下,命令如下

#使用密钥登录 ppk是密钥文件
D:\putty\psftp -i D:\putty\opfree.ppk 
#输入账号和密钥密码,这里我使用root用户登录
login as: root
Passphrase for key "imported-openssh-key":
#使用put -r “本地目录” “服务器目录”命令,将文件夹上传到云主机上
put -r E:\WorkSpace.2018\dotnet-core-webapi-test\TodoApi\bin\Debug\netcoreapp2.1\publish /home/wwwroot

效果如下:

2018-11-27_144742.jpg

这时候,文件已经上传至服务器,我们去服务器进行部署。

服务器部署

修改nginx配置文件

#找到nginx的配置文件,在根目录搜索
cd /
find -name nginx.conf

如下图:

2018-11-27_152044.jpg

打开该文件,进行修改:

#编辑文件
vi /usr/local/nginx/conf/nginx.conf
#按i键进入修改模式
#修改完毕按ESC退出,按:进入底行模式,输入wq保存退出

修改内容如下,使得80端口的默认路径指向本机的5000端口

2018-11-27_141744.jpg

保存成功后,重启nginx

cd /usr/local/nginx/sbin
./nginx -s quit  #退出
./nginx #启动

现在访问http://45.40.193.247/api/values是会报错的,因为5000端口没有任何东西

2018-11-27_154256.jpg

启动webapi项目

dotnet /home/wwwroot/TodoApi.dll

此时再访问http://45.40.193.247/api/values就得到了api返回值了。

2018-11-27_141459.jpg

在chorme中查看Headers信息,发现果然是nginx

2018-11-27_154821.jpg

进程守护

如果我们此时,将dotnet /home/wwwroot/TodoApi.dll这个shell关掉的话,那么对应的api服务也就关掉了,部署一个网站,总不能打shell吧,所以我们需要它在后台进行运行,并且在服务器挂机、重启之后可以自动启动。

ngxin开机启动

在rc.local增加启动代码就可以了。

#编辑文件
vi /etc/rc.local
#最底部增加代码
/usr/local/nginx/sbin/nginx
#设置执行权限
chmod 755 /etc/rc.local
dotnet项目守护和开机启动

supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,我们使用supervisor来守护我们的todoapi

1.安装

yum install python-setuptools
easy_install supervisor

2.配置

#在etc下创建目录supervisor
mkdir /etc/supervisor
#在supervisor下创建目录conf.d
mkdir /etc/supervisor/conf.d
#拷贝配置文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
#指定配置文件
supervisord -c /etc/supervisor/supervisord.conf
#打开配置文件编辑
vi /etc/supervisor/supervisord.conf、
#将最后两行修改为
[include]
files=./conf.d/*.conf
#进入目录 /ect/supervisor/conf.d
cd /ect/supervisor/conf.d
#创建文件 todoapi.conf
vi todoapi.conf
#输入以下内容
[program:todoapi]
command=dotnet TodoApi.dll #要执行的命令
directory=/home/wwwroot #命令执行的目录
environment=ASPNETCORE__ENVIRONMENT=Production #环境变量
user=root #进程执行的用户身份
stopsignal=INT
autostart=true #是否自动启动
autorestart=true #是否自动重启
startsecs=1 #自动重启间隔
stderr_logfile=/var/log/common.err.log #标准错误日志
stdout_logfile=/var/log/common.out.log #标准输出日志
#保存后重新加载配置
supervisorctl shutdown
supervisord -c /etc/supervisor/supervisord.conf
#Supervisor的常用命令
supervisorctl shutdown #关闭所有任务
supervisorctl stop|start program_name #启动任务
supervisorctl status #查看所有任务状态
ps -ef | grep common #查看进程信息

退出shell,重启计算机,依然可以正常访问地址“http://45.40.193.247/api/values”。

至此,我们将netcore版本的api已经部署到了云主机上。小伙伴可能会问,为什么不使用5000端口直接访问呢,因为云主机为了安全期间,是会屏蔽一些端口的,比如web只开放了80、43,linux ssh登录的22等少量端口,大多数时候,一个服务器是不可能只有一个站点的,所以在最顶层使用nginx进行一个代理,后续随着域名的备案完成,ngxin届时需要更多的配置,我们会在这台服务器使用mysql、nginx域名与二级域名的配置、静态资源使用cdn(可能会牵扯到七牛之类的云服务)当然必不可少是一个前端的管理界面(使用vue进行构建)。


小白菜 - 程序猿
尘埃深处,清醒自持

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,778评论 6 342
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,914评论 2 89
  • 有一些城市 只因你曾经在哪里留下些许的记忆 它会一直依依停驻在你的血脉里 像红血球一样 为你输送一点浪漫的氧气 你...
    南歌子吟阅读 354评论 2 4
  • 我们的目标是让记录笔记成为一种文化,无论是用哪种形式,用键盘敲打出来也好,用速录机打出来也好,用讯飞输入法语音转文...
    麦风玄阅读 118评论 0 1