Centos下使用ngxin+supervisor部署netco

2018-11-27  本文已影响0人  长安小白菜

背景

小白菜最近在腾讯云购买了一台云主机,配置是单核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开发,环境清单如下

下面是下载地址:

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进行构建)。


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

上一篇下一篇

猜你喜欢

热点阅读