SAAS云平台搭建札记: (二) Linux Ubutu下.Net Core整套运行环境的搭建
最近做的项目,由于预算有限,公司决定不采购Windows服务器,而采购基于Linux的服务器。
一般的VPS服务器,如果使用Windows系统,那么Windows Server2012\2016安装好后,就占用1GB的内存了;只要运行起来,2G的内存就用掉了;装上SqlServer、跑个.net,4G内存是标配,用户数量稍微多些4G内存也捉襟见肘了;分配2个VCpu,在桌面状态下不运行任何程序,每个核心的占用率在15%~20%左右。
大家知道64位的CentOS7装好后内存占用是多少吗,用free看了下,不到150兆;
64位的Ubutu16.04装好后内存占用多少?40MB
用过Linux Server,不禁赞叹其系统的精简和高效,没有一点浪费内存和CPU的地方,所有的资源都用在刀刃上;难怪微软在《.NET 微服务:适用于容器化 .NET 应用程序的体系结构》一书上说,基于.Net Core的ASP.net比传统ASP.net要快10倍以上。开发和运维.NET Core,首推Linux下的Container环境。Windows Server不停的在做Server-Core和Nano-Server,也是在不断地做减法,以适应形势。多年以来.net一直干不过java,操作系统也是个很大原因。
好了,先不扯开发,买了X里云的VPS,默认用root SSH远程登录上去的,这跟我们平时自己装的很不一样,没有第二个用户,上去也不用su,也用不着sudo。
这里把整个流程记录下来,方便大家配置和部署(如果自己找资料估计要配个一、两天)
- 安装Mysql
apt-get update apt-get install mysql-server apt-get install mysql-client apt-get install libmysqlclient-dev 安全选项:mysql_secure_installation 测试状态:systemctl status mysql.service
以root登录后,添加mysql远程访问用户:
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; flush privileges;
退出mysql命令行,编辑启动文件
vi /etc/mysql/mysql.conf.d/mysqld.cnf
linux下可以用vi,可以用vim,也可以用nano(估计有数十种编辑器)
注释 bind-address = 127.0.0.1
重启服务或系统
登录mysql,建库
CREATE DATABASE `数据库名` /*!40100 COLLATE 'utf8_unicode_ci' */;
开发的同学注意了,在Windows下,Mysql不管是是5.7还是8.0,数据库表名默认都是不区分大小写的,而Linux下数据库表名都是区分大小写的,会导致用脚本导出的数据库在Linux无法正常使用。需要改Windows下Mysql的配置。
- 安装Postgresql
为什么要用Postgresql?Linux下可以安装SqlServer2017/2019嘛,但是SqlServer On Linux的系统需求是内存大于3.25G。而且非商业授权的Express版本只能用到1G内存多一点,可想而知用户数量多了后会是怎样一个状况。安装多个实例?
Postgresql是最接近Oracle框架的Sql,不管从表空间、语法、Schema、函数都无比类似Oracle,据说还有个特别的企业版本完全兼容Oracle,可以无缝的把Oracle应用迁移过来,帮企业省数十万$;它的性能、事务、扩展支持等都十分强大(支持几乎所有语言的扩展但是不支持.net的扩展),采用比较奇葩的多进程工作方式。开发社区里有不少中国人。最新版本11,我们觉得9、10的版本也够了。
wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' apt update apt install postgresql-10 -y
装好后使用postgres管理用户登录
sudo -u postgres psql
配置pgsql可以远程访问
修改/etc/postgresql/11/main/postgresql.conf,将文件中的 listen_addresses=’localhost’ 替换成 listen_addresses=’*’;
修改 /etc/postgresql/11/main/pg_hba.conf,配置允许哪些IP可以访问,我配置的是允许所有ip
# ipv4 remote connections:
host all all 0.0.0.0/0 md5
保存以上配置之后重启数据库生效
修改默认用户密码:
alter user postgres with password 'new password';
使用Mysql还是Postgresql根据自己的业务需要,如果是一般的互联网项目,单表读/写比较多的,开发人员水平参差不齐的,建议使用Mysql;如果是企级项目、云平台管理项目,使用Postgresql,里面有大量的扩展和特性以及事务属性供使用,以后招OracleDBA方便维护。关于Postgresql里面的一些特殊使用技巧我另外还有文章来描述。
- 安装Redis
apt-get install redis-server
查看状态
/etc/init.d/redis-server status
编辑redis配置文件
vi /etc/redis/redis.conf
注释以下绑定的主机地址
# bind 127.0.0.1 protected-mode no
设置远程连接密码,取消注释 requirepass foobared,将 foobared 改成任意密码,用于验证登录。
使用 redis-cli -h xxx.xxx.xxx.xxx 进行远程登录,登录后进行操作如果出现如下错误:
可以输入 auth xxx 进行解锁,xxx为配置文件中设置的密码。
Redis和Postgreql在Linux下的安装包只有几MB,SqlServerOnLinux的实际安装包也就一百多兆。
- 安装.Net Core
apt-get install curl wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb dpkg -i packages-microsoft-prod.deb sudo apt-get install apt-transport-https sudo apt-get update sudo apt-get install dotnet-sdk-2.2
安装.net 5
wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y aspnetcore-runtime-5.0
这里 展示了微软官方在不同linux版本上对.net的支持以及安装.net运行时的方法。( https://docs.microsoft.com/zh-cn/dotnet/core/install/linux )
- 安装VsFtp
建立一个只能通过ftp登录的用户,固定目录,其他用户不能登录
apt-get install vsftpd useradd FTP用户名 -g ftp -d /var/www passwd FTP用户名 cd / mkdir www chmod 777 -R /var/www usermod -s /sbin/nologin FTP用户名
编辑vi vsftpd.conf,需要启用名单用户
nano /etc/vsftpd.conf
取消注释vsftpd.chroot_list
取消注释write_enable=YES”
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
nano /etc/vsftpd.chroot_list
只写入FTP用户名
在有些版本上还需要进行如下修改
nano /etc/pam.d/vsftpd
将vsftpd文件中的pam_shells.so改为pam_nologin.so
安装Iptables
apt-get install iptables-persistent iptables -A INPUT -p tcp --dport 端口号 -j ACCEPT netfilter-persistent save netfilter-persistent reload
- 运行.NET Core程序
用FTP用户上传你的代码,运行
dotnet xxx.dll
网站能打开,说明一切OK
curl http://xxxxxxxxx:xx
把你的ASP.net程序配置成服务启动:
nano /etc/systemd/system/kestrel-xxx.service
内容如下:
[Unit] Description=Example .NET Web API App running on Ubuntu [Service] WorkingDirectory=/var/www ExecStart=/usr/bin/dotnet /var/www/WebApplication3.dll Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 KillSignal=SIGINT SyslogIdentifier=dotnet-example User=www-data Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
检测这个服务的状态:
systemctl enable kestrel-xxx.service systemctl start kestrel-xxx.service systemctl stop kestrel-xxx.service systemctl status kestrelel-xxx.service
- 安装MongoDb
sudo apt-get install mongodb
mongo use admin db.createUser( {user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
SAAS云平台搭建札记系列文章:
SAAS云平台搭建札记: (一)浅论SAAS多租户自助云服务平台的产品、服务和订单
SAAS云平台搭建札记: (二)Linux Unbutu下.Net Core整套运行环境的搭建
SAAS云平台搭建札记: (三) AntDesign + .Net Core WebAPI权限控制、动态菜单的生成
SAAS云平台搭建札记: (四) AntD For React使用react-router-dom路由接收不同参数页面不刷新的问题