总结一下初入Linux踩过的坑

706 阅读5分钟

前段时间在阿里云买了个轻量应用服务器,要把项目部署到服务器上,初入Linux,踩了不少坑。下面总结一下踩过的这些坑。

声明:作者使用的服务器系统是CentOS 7。

下面开始我们的部署过程。

具体安装步骤网上很多参考资料,在此不再赘述,重点总结一下踩的坑。我们不生产水,我们只是大自然的搬运工!!!

1、安装Nodejs

搬个写的比较详细的博客:blog.csdn.net/xerysherryx… 我是按照文章中编译部署的方式安装的,这里会有一个坑,后面我会提到。

2、安装MongoDB

这篇文章写的超详细:www.linuxidc.com/Linux/2016-…

我在安装配置的时候出现这个错误:

ERROR:child process failed, exited with error number 48

以修复模式运行,这样可以查看具体错误:

./mongod --repair -f mongodb.conf

通过查看日志文件也可以查看具体错误:

tail -200f /usr/local/mongodb/mongodb3.2.4/bin/data/test/logs/mongodb.log

查看MongoDB进程:

ps aux |grep mongodb

杀死MongoDB进程:

kill -15 PID

PID在上面的日志文件中可以找到,然后删除日志文件,再次运行mongod:

rm -f /usr/local/mongodb/mongodb3.2.4/bin/data/test/logs/mongodb.log
./mongod --config mongodb.conf

这篇文章对错误排查写的很详细:www.cnblogs.com/dunitian/p/…

3、安装redis

我参考这篇博客安装配置redis,然后以后台进程方式启动redis,并设置开机启动。

参考资料:www.cnblogs.com/zuidongfeng…

4、安装git

参考资料:www.cnblogs.com/oufeng/p/66…

这里因为我比较懒,也没配置Nginx做反向代理,感兴趣的同学可以参考网上资料。

至此,我们的运行环境基本配置好了,从git上将我的项目下载到服务器上运行,这里我把项目扔到home根目录底下的。

5、运行项目

获取root权限,进入项目目录,npm start,同学们注意了,坑来了,不过办法总比困难多。

报错如下:

bash: npm: command not found

查了很多资料,该错误的主要原因是环境变量没设置好,我们可以使用ln命令将node和npm 加入到/usr/bin文件夹下,具体解决办法如下:

1、cd命令进入到nodejs安装目录,使用find命令查找node及npm:

find ./ -name node
find ./ -name npm

2、cd /usr/bin 进入到该文件夹

3、使用ln命令将npm在该文件夹建立一个同步的链接

ln -s /usr/local/nodejs/node-v9.3.0/node  /usr/bin/node
ln -s /usr/local/nodejs/node-v9.3.0/deps/npm/bin/npm  /usr/bin/node

连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。

ln命令语法:

ln -s sourceFile targetFile         //将一个源文件链到目标文件上
ln -s sourceFile ... targetFile     //将多个源文件链到目标文件上

还有以下选项:

  • -b或--backup:删除,覆盖目标文件之前的备份;
  • -d或-F或——directory:建立目录的硬连接;
  • -f或——force:强行建立文件或目录的连接,不论文件或目录是否存在;
  • -i或——interactive:覆盖既有文件之前先询问用户;
  • -n或--no-dereference:把符号连接的目的目录视为一般文件;
  • -s或——symbolic:对源文件建立符号连接,而非硬连接;
  • -S<字尾备份字符串>或--suffix=<字尾备份字符串>:用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它;
  • -v或——verbose:显示指令执行过程;
  • -V<备份方式>或--version-control=<备份方式>:用“-b”参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用“-S”参数变更,当使用“-V”参数<备份方式>指定不同备份方式时,也会产生不同字尾的备份字符串;
  • --help:在线帮助;
  • --version:显示版本信息。

关于Linux系统下文件夹的补充说明:

  • 所有用户皆可用的系统程序放在/bin;
  • 超级用户才能使用的系统程序放在/sbin;
  • 所有用户都可用的应用程序放在/usr/bin;
  • 超级用户才能使用的应用程序放在/usr/sbin;
  • 所有用户都可用的与本地机器无关的程序存放在/usr/local/bin;
  • 超级用户才能使用的与本地机器无关的程序存放在/usr/local/sbin。

所以我们将node和npm链到该文件夹,就可以全局使用npm为所欲为了。

开始测试项目,完全OK。

然鹅,在我和终端断开连接之后,就无法访问这个IP地址了,怎么肥四???简单来说我的程序进程是ssh的子进程,当父进程退出的时候子进程也会随之退出,所以终端关闭之后,所有属于它的进程就结束了。这里我的解决办法是用nohup。

nohup是由两个字组成的命令:no-hup,hup是指SIGHUP信号,nohup就是忽略SIGHUP这个信号。当我们从一个连线登出的时候,每个process都会收到一个SIGHUP信号,通过nohup所下达的命令就可以不受该信号的影响,从而继续执行。

在项目根目录执行以下代码:

nohup npm start &

至此,我的项目已经部署完毕。

如果要终止执行的话,先使用命令ps -ef | grep 查看进程id,然后kill -9 PID杀死该进程就OK了

nohup参考资料奉上:blog.csdn.net/liuyanfeier…

另外,再奉上几个Linux常用命令

  • netstat -anp|grep 80 查看某个端口是否被占用
  • kill -9 pid 如果被占用可以kill掉这个端口(pid 是端口pid)
  • rz –be 命令 上传数据到远程
  • firewall-cmd –list-ports 查看已经开放的端口
  • systemctl status firewalld 查看firewalld状态
  • systemctl start firewalld 开启防火墙,没有任何提示即开启成功
  • vim 命令使用,i//输入模式,输入完成之后按Esc退出输入模式并切换到命令模式,:wq保存并退出vi程序
  • rm -rf fileName 递归删除一个文件夹

此外,推荐两个辅助软件xftp和SecureCRT。