在CentOS 7(腾讯云)部署node+mongodb项目全过程(上)

太长了......为了不影响阅读体验决定分上下两篇,下篇链接:在CentOS 7(腾讯云)部署node+mongodb服务器全过程(下)

前提是你已经购买了服务器。
我电脑的操作系统是MacOS的,Windows下我没有实际操作,所以这边的步骤以MacOS为准。

一、首先在终端登录服务器

也可以在腾讯云-控制台-云服务器的实例里直接登录(官方有视频教程我这里不赘述了),但官方的网页版在线终端不是很方便,还是建议用自己电脑上的,我的是iTerm2,之后都是在这个上面操作的。十分推荐把默认端口修改一下(默认是22),防止黑客攻击。官方文档贴在这里:修改云服务器远程默认端口

ssh root@188.131.142.151   
// 修改过默认端口需要加上端口号
ssh root@188.131.142.151 -p 1234
// root 是腾讯云服务器默认的账号名,
// @后面是你的服务器公网 ip,比如 188.131.142.151 
登录成功截图

之后输入腾讯云站内信给我们的默认密码即可。

但每次输密码太麻烦了,这里推荐ssh用密钥登录结合配置终端Profile的方式。
关于Profiles配置,不清楚的直接看这里:iTerm2 Profiles 实现 ssh 自动登录远程服务器
密钥相关,也贴上链接🔗:腾讯云官方文档-管理 SSH 密钥
使用 SSH 登录 Linux 实例

二、在服务器上安装所需环境

我搭建的项目基于NodeJS+Express+MongoDB,所以安装配置的是Node和Mongodb所需的相关环境。

1. 首先腾讯云默认提供的CentOS不是最新的,目前是7.6,我们一般都先升级一下CentOS
yum -y update

这里提一嘴,用yum指令升级有两个参数:updateupgrade,其实它们的功能基本都=是一样的,都是将需要更新的package更新到源中的最新版。唯一不同的是,yum upgrade会删除旧版本的package,而yum update则会保留(obsoletes=0)。

生产环境中建议使用yum update,防止因为被替换,导致旧的软件包依赖出现问题。
升级完毕后,你可以查看下现在的版本,或者再执行下升级操作试试,它会告诉你已经No packages marked for update

cat /etc/redhat-release
2. 紧跟着一定要安装新版本的gcc

我这边安装node到预编译的时候报了个警告WARNING: C++ compiler (CXX=g++, 4.8.5) too old, need g++ 6.3.0 or clang++ 8.0.0,没有处理,再执行make就会报错。CentOS7自带的最高版本就是4.8.5,无法用yum升级得我们自己安装。

2.1 完美升级gcc版本方法(万分推荐这个,2.2手动编译gcc真的可以跳过)

在某些应用场景中,需要特定的gcc版本支持,但是轻易不要去编译gcc,这里推荐使用红帽提供的开发工具包来管理gcc版本,这样做的好处是随时切换版本,并且可以并存多个版本,不破坏原有gcc环境。

# 安装 centos-release-scl
yum install centos-release-scl
# 安装devtoolset-9包 对应gcc9.x.x
yum install devtoolset-9
# 启用激活gcc 9,这是临时切换,退出shell或重启就会恢复原系统gcc版本
scl enable devtoolset-9 bash
# 要长期使用的话执行:
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile

至此就大功告成啦。

2.2 手动编译安装gcc
其实不推荐手动下载编译,容易各种坑和报错,最最主要的是非常耗时。我第一次用的是这个方法(真的虐你千百遍),加上已经写了还写了这么多所以还是记录在这里,以下是步骤:

(1)选择需要升级的版本

gcc ftp 下载地址列表
(比如我选择gcc-7.5.0)

(2)获取安装包并解压

# 切换到/usr/local/src,这个目录通常放软件源码
cd /usr/local/src
# 下载
wget https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz
# 解压
tar -zxvf gcc-7.5.0.tar.gz

(3)进入解压后的gcc文件夹,下载供编译需求的依赖项

cd gcc-7.5.0
# 下面这个命令会自动去下载所需的4个依赖包,这个过程会稍微有点费时间
./contrib/download_prerequisites

(4)新建一个编译目录,用来存放编译文件

mkdir gcc-build-7.5.0
cd gcc-build-7.5.0

(5)执行预编译

/usr/local/gcc-7.5.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

(6)生成 Makefile 文件
在gcc-build-7.5.0目录下执行

make

这一步我又报错了,g++: fatal error:Killed signal terminated program cc1plus,百度后得知原来腾讯云服务器默认没有分配虚拟内存,要自己分配一下。这边直接上干货:

#选择swap文件要放置的位置,这边我直接放在根目录
cd / 
#获取要增加的2G的swap文件块
dd if=/dev/zero of=/swapfile bs=1k count=2048000
#创建swap文件
mkswap /swapfile 
#激活swap文件
swapon /swapfile   
# 执行完这一步会报“不安全的权限 0644,建议使用 0600。”的警告,其实已经激活了,可以忽略,如果要修改权限可以执行下面这一命令:
chmod -R 0600 /swapfile
#查看swap信息是否正确
swapon -s  或者 free -m
#添加到fstab文件,让系统启动时自动启用swap分区
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab

如果不再需要swap,可以清理该分区:swapoff /swapfile,删除rm -rf /swapfile
内存分配完毕,继续执行make,这次不报错了。但时间非常emmmmmm(以小时记),需要耐心,注意不要让电脑进入休眠。。。
(7)终于能安装gcc了

make install

(8)重启服务器,检查下我们有没有安装成功

gcc -v
版本更新了

折腾了这么久,欢欣鼓舞有木有!
然而,革命刚刚开始。。。不知道是不是版本太高(我自己尝试的时候装的最新版10.2.0),后面NodeJS安装make又报错,所以我想是不是CentOS默认的包都较低,兼容性不好,自定义编译安装时不要一味去找最高版本。

3. 安装NodeJS(其实直接看3.2即可,比心❤️)
3.1手动编译安装(仍然不推荐)

虽然CentOS出于保证稳定的目的,yum源的包版本都很低(低到和世界脱节的程度),但是我们有很多方式可解决,实现能不手动编译make就不手动。只是我一开始没找到其他好办法,就如此操作了一遍.....爱折腾爱自虐的同学可以试试,不然直接跳过,谢谢🙏

cd /usr/local/src
#下载源码版node
wget https://nodejs.org/dist/v14.15.1/node-v14.15.1.tar.gz
#下载完成后解压
tar -xzvf node-v14.15.1.tar.gz
#编译安装,make过程稍长,稍作等待
cd node-v14.15.1
./configure --prefix=/usr/local/node/14.15.1
# -j4可以同时运行4个编译,可以帮助减少编译时间
make -j4
make install

prefix参数是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr/local/share,比较凌乱。
以上配置把node所有资源文件放在/usr/local/node/14.15.1的路径中,方便统一查看管理。

谁能想到,到make这一步又报错了。。。
/usr/local/src/node-v14.15.1/out/Release/icupkg: /lib64/libstdc++.so.6: versionCXXABI_1.3.9' not found (required by /usr/local/src/node-v14.15.1/out/Release/icupkg)
直接上解决方案:将gcc最新版本的动态库替换系统中老版本的动态库

#查找编译gcc时生成的最新动态库
find / -name "libstdc++.so*"
#将找到的动态库libstdc++.so.6.0.28复制到/usr/lib64
cp /usr/local/src/gcc-build-10.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28 /usr/lib64
#切换工作目录至/usr/lib64,删除原来的软连接, 将默认库的软连接指向最新动态库。
cd /usr/lib64
rm -rf libstdc++.so.6
ln -s libstdc++.so.6.0.28 libstdc++.so.6

make -j4 make install就可以了

3.2 推荐安装NodeJS的方式

在有epel源的前提下,可以直接直接指定nodejs版本安装。没有就先安装下yum install epel-release 安装后用yum repolist查看源仓库,可以看到epel有1万多软件包源。
不清楚版本和安装指令可以查看这个node源码(二进制发行版)文档,它对应不同的平台都有具体说明https://github.com/nodesource/distributions`

# 先设置要安装的版本
curl -sL https://rpm.nodesource.com/setup_14.x | bash -
# 安装
yum install nodejs -y
# 完成后查看下node版本
node -v
# 显示是v14.15.1,成功!

我们还可以通过n安装/切换nodejs版本,后续使用也极为方便。
n是nodeJS管理工具,是TJ写的,Github: https://github.com/tj/n

# 清除下node缓存
npm cache clean -f # -f 等于 --force

# 安装n
npm install -g n

# 安装nodejs版本

# 安装最新稳定版
n stable

# 安装最新版
n latest

# 安装指定版本
n 14.15.1  

# 切换nodejs版本
n

# 选择已安装的版本

ο  node/14.15.1
   node/10.4.1

# 查看当前版本,查看是否切换成功
node -v

但问题来了,切换后发现还是原来的v6.16.0,别着急,紧跟着是 使用n切换NodeJS版本失效的解决办法

# 查看 node 当前安装路径
which node
# /usr/local/bin/node # 举个例子

n 默认安装路径是 /usr/local,若你的 node 不是在此路径下,n 切换版本就不能把bin、lib、include、share 复制该路径中,所以我们必须通过在环境变量添加/usr/local(node的实际安装位置)。

# 编辑环境配置文件:
vim ~/.bash_profile
# 原来的
export PATH=$PATH:$HOME/bin
# 修改成
export PATH=$PATH:$HOME/bin:/usr/local/bin
# :wq保存退出后,执行source使修改生效
source ~/.bash_profile

这时候再node -v就发现版本切换成功了。npm -v也是最新的了。

4. 安装mongodb

官方推荐通过yum包管理器安装,我基本是官网能找到相关文档都尽量参考官网,这样比较靠谱,步骤如下:
(1)新建一个mongodb-org-4.2.repo文件,用vim打开编辑

vim /etc/yum.repos.d/mongodb-org-4.2.repo

复制如下内容粘贴在里面,然后保存退出

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

(2)这样配置完就可以用yum来安装mongoDB了
安装最新的稳定版MongoDB

sudo yum install -y mongodb-org

或者,要安装特定版本的MongoDB,请分别指定每个组件包,并将版本号附加到包名中,比如我装的是4.2.11(最新的稳定版)

sudo yum install -y mongodb-org-4.2.11 mongodb-org-server-4.2.11 mongodb-org-shell-4.2.11 mongodb-org-mongos-4.2.11 mongodb-org-tools-4.2.11

yum当有新版本可用时会升级软件包。为防止意外升级,可以通过exclude参数在/etc/yum.conf文件中添加以下指令来固定包的版本:

exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

(3)也可以自行下载.rpm文件来安装
去mongoDB官网软件下载中心找到MongoDB Community Server,根据自己的平台(CentOS版本)选择,复制下载链接

image.png

然后下载到某个文件夹,当然还有shell和tools等包,这里不一一示例了。

cd /usr/local
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-server-4.2.11-1.el7.x86_64.rpm

通过rpm指令安装

rpm -ivh mongodb-org-server-4.2.11-1.el7.x86_64.rpm

(4)配置
默认情况下,MongoDB使用mongod用户帐户运行,并自动设定以下目录存放指定文件:
/var/lib/mongo (数据目录)
/var/log/mongodb (日志目录)

要自定义配置可以编辑mongod.conf,比如修改默认的数据/日志目录和端口号(强烈建议修改默认端口)等等。

vim /etc/mongod.conf

(5)启动服务

/# 启动mongoDB服务
sudo systemctl start mongod
# 验证mongoDB是否成功启动
sudo systemctl status mongod
# 确保mongoDB在系统开机后自动启动
sudo systemctl enable mongod
# 停止服务
sudo systemctl stop mongod
# 重启服务,修改完mongod.conf一定要重启
sudo systemctl restart mongod

(6)使用mongo shell创建管理员/普通用户账户后,在/etc/mongod.conf配置开启安全验证

security:
  authorization: enabled

未完待续,下篇地址在此~ 在CentOS 7(腾讯云)部署node+mongodb服务器全过程(下)

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

推荐阅读更多精彩内容