背景
小白菜最近在腾讯云购买了一台云主机,配置是单核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!
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
使用 zlib
对 http
包的内容进行 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
打开这个文件夹,像介样子
在根目录添加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
运行调试
输入地址http://localhost:5000/api/values
在浏览器中查看,输出了默认的值,暂时不做任何修改,我们本篇的目的是把它部署到生产环境Centos
上。
到目前为止,api项目已经跑起来了,我们接下来编译发布它。
在vscode中选择 Terminal > New Terminal打开一个终端窗口,在底部,默认地址是我们的项目文件夹地址。
输入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端口没有任何东西
启动webapi项目
dotnet /home/wwwroot/TodoApi.dll
此时再访问http://45.40.193.247/api/values
就得到了api返回值了。
在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进行构建)。
小白菜 - 程序猿
尘埃深处,清醒自持
网友评论