Linux CentOS7 搭建 node 服务详细教程
前言
近期在准备搭建一个 vue.js+node.js 全栈开发的社区,之前由于没有云服务器搭建经验,这篇文章做一下相关的记录,后续再深入学习研究。本文不局限于只是流水账式的记录,会顺便说明一下 Linux 的相关内容。
登录 Linux 云服务器
至于购买云服务的过程在此不做赘述,各大云服务提供商都有相关的说明文档。当我们买好了云主机,可以通过控制面板登录,也可以使用密码从本地登录。
Linux 或 Mac OS 用户登录 Linux 云服务器,直接使用 SSH 命令进行连接,如:ssh root@Linux 云服务器公网 IP,然后输入 root 用户的初始密码,即可完成登录。
Window 系统上 Linux 远程登录客户端有 SecureCRT, Putty, SSH Secure Shell 等,本文以 Putty 为例来登录远程服务器。
下载远程链接软件 Putty,参考下载地址:http://www.chiark.greenend.org.uk/~sgtatham/putty/
打开 Putty 客户端,在 PuTTY Configuration 窗口中输入以下内容: Host Name:Linux 云服务器的公网 IP。 Port:云服务器的端口,必须填 22。(请确保云主机 22 端口已开放) Connect type:选择“SSH”。
全部输入完后,点击“Open”,创建一个新对话。

在 Putty 会话窗口中, 输入管理员帐号,按回车键。再输入初始密码,回车完成登录过程。

Linux 系统目录结构
登录系统后,在当前命令窗口下输入命令:
ls /结果如下:
[root@centos ~]# ls /
bin data etc lib lost+found mnt proc run srv tmp var
boot dev home lib64 media opt root sbin sys usr树状目录结构:

以下是对这些目录的解释: /bin:bin 是 Binary 的缩写, 这个目录存放着最经常使用的命令。 /boot:这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 /dev:dev 是 Device(设备)的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。 /etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录。 /home:用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。 /lib:这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。 /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。 /media:linux 系统会自动识别一些设备,例如 U 盘、光驱等等,当识别后,linux 会把识别的设备挂载到这个目录下。 /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。 /opt:这是给主机额外安装软件所摆放的目录。比如你安装一个 ORACLE 数据库则就可以放到这个目录下。默认是空的。 /proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的 ping 命令,使别人无法 ping 你的机器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all- /root:该目录为系统管理员,也称作超级权限者的用户主目录。
- /sbin:s 就是 Super User 的意思,这里存放的是系统管理员使用的系统管理程序。
- /selinux:这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放 selinux 相关的文件的。
- /srv:该目录存放一些服务启动之后需要提取的数据。
- /sys:这是 linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。sysfs 文件系统集成了下面 3 种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
- /tmp:这个目录是用来存放一些临时文件的。
- /usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与 windows 下的 program files 目录。
- /usr/bin:系统用户使用的应用程序。
- /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
- /usr/src:内核源代码默认的放置目录。
- /var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
在 linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。
- /etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
- /bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的。值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除 root 外的通用户),而/sbin, /usr/sbin 则是给 root 使用的指令。
- /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,另外 mail 的预设放置也是在这里。
了解系统目录结构,对于我们安装管理一些依赖包更加清晰。
Linux 文件基本属性
Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
在 Linux 中我们可以使用 ll 或者ls –l命令来显示一个文件的属性以及文件所属的用户和组,如:
[root@VM_195_14_centos ~]# ls -l
total 4
-rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg实例中,anaconda-ks.cfg 文件的第一个属性用"-"表示,"-"在 Linux 中代表该文件是一个文件。
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件,对应规则如下:
- 当为[d]则是目录
- 当为[-]则是文件;
- 若是[l]则表示为链接文档(link file);
- 若是[b]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
- 若是[c]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
每个文件的属性由左边第一部分的 10 个字符来确定,如下图:

Linux 文件与目录管理
Linux 的目录结构为树状结构,最顶级的目录为根目录 /。
绝对路径:从根目录 / 写起,如:/usr/share/applications 相对路径:使用../或~(/root 的简称)。
处理目录的常用命令:
- ls: 列出目录
- cd:切换目录
- pwd:显示目前的目录
- mkdir:创建一个新的目录
- rmdir:删除一个空的目录
- cp: 复制文件或目录
- rm: 移除文件或目录
注:可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp。
文件内容查看的命令:
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
Linux 磁盘管理
inux 磁盘管理常用三个命令为 df、du 和 fdisk。
- df:列出文件系统的整体磁盘使用量
- du:检查磁盘空间使用量
- fdisk:用于磁盘分区
df 命令 df 命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。语法:
df [-ahikHTm] [目录或文件名]选项与参数: -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统; -k :以 KBytes 的容量显示各文件系统; -m :以 MBytes 的容量显示各文件系统; -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示; -H :以 M=1000K 取代 M=1024K 的进位方式; -T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出; -i :不用硬盘容量,而以 inode 的数量来显示
du 命令 Linux du 命令也是查看使用空间的,但是与 df 命令不同的是 Linux du 命令是对文件和目录磁盘使用的空间的查看,还是和 df 命令有一些区别的,这里介绍 Linux du 命令。语法: du [-ahskm] 文件或目录名称选项与参数: -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。 -h :以人们较易读的容量格式 (G/M) 显示; -s :列出总量而已,而不列出每个各别的目录占用容量; -S :不包括子目录下的总计,与 -s 有点差别。 -k :以 KBytes 列出容量显示; -m :以 MBytes 列出容量显示;
Linux vim
Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。

打开文件的命令

基本上 vim 共分为三种模式,分别是命令模式(Command mode),插入模式(Insert mode)和末行模式(Last line mode)。 这三种模式的作用分别是:命令模式、输入模式、末行模式。
vi/vim 三种模式切换

命令模式 用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符。比如我们此时按下 i,并不会输入一个字符,i 被当作了一个命令。
以下是常用的几个命令: i 切换到插入模式,以输入字符。 x 删除当前光标所在处的字符。 : 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动 Vim,进入了命令模式,按下 i,切换到输入模式。命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
移动光标的位置:

字符串的复制、删除、粘贴:

输入模式 在命令模式下按下 i、I、a、A、o、O、r 和 R 中的某一个键就进入了输入模式。在输入模式中,可以使用以下按键:字符按键以及 Shift 组合,输入字符 ENTER,回车键,换行 BACK SPACE,退格键,删除光标前一个字符 DEL,删除键,删除光标后一个字符方向键,在文本中移动光标 HOME/END,移动光标到行首/行尾 Page Up/Page Down,上/下翻页 Insert,切换光标为输入/替换模式,光标将变成竖线/下划线 ESC,退出输入模式,切换到命令模式

末行模式 在命令模式下按下:(英文冒号)就进入了底线命令模式。末行模式可以输入单个或多个字符的命令,可用的命令非常多。在末行模式中,基本的命令有::q 退出程序:w 保存文件按 ESC 键可随时退出底线命令模式。

vim 的保存文件和退出命令
:w —— 保存编辑后的文件内容,但不退出 vim 编辑器。这个命令的作用是把内存缓冲区中的数据写到启动 vim 时指定的文件中。 :w! —— 强制写文件,即强制覆盖原有文件。如果原有文件的访问权限不允许写入文件,例如,原有的文件为只读文件,则可使用这个命令强制写入。但是,这种命令用法仅当用户是文件的属主时才适用,而超级用户则不受此限制。 :wq —— 保存文件内容后退出 vim 编辑器。这个命令的作用是把内存缓冲区中的数据写到启动 vim 时指定的文件中,然后退出 vim 编辑器。另外一种替代的方法是用 ZZ 命令。 :wq! —— 强制保存文件内容后退出 vim 编辑器。这个命令的作用是把内存缓冲区中的数据强制写到启动 vim 时指定的文件中,然后退出 vim 编辑器。 ZZ —— 使用 ZZ 命令时,如果文件已经做过编辑处理,则把内存缓冲区中的数据写到启动 vim 时指定的文件中,然后退出 vim 编辑器。否则只是退出 vim 而已。注意,ZZ 命令前面无需加冒号“:”,也无需按 Enter 键。 :q —— 在未做任何编辑处理而准备退出 vim 时,可以使用此命令。如果已做过编辑处理,则 vim 不允许用户使用“:q”命令退出,同时还会输出下列警告信息:No write since last change (:quit! overrides) :q! —— 强制退出 vim 编辑器,放弃编辑处理的结果。如果确实不需要保存修改后的文件内容,可输入“:q!”命令,强行退出 vim 编辑器。 :w filename —— 把编辑处理后的结果写到指定的文件中保存 :w! filename —— 把编辑处理后的结果强制保存到指定的文件中,如果文件已经存在,则覆盖现有的文件。 :wq! filename —— 把编辑处理后的结果强制保存到指定的文件中,如果文件已经存在,则覆盖现有文件,并退出 vim 编辑器。
Linux Yum 包管理器
Yum(全称为 Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 CentOS 中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
yum 语法
yum [options] [command] [package ...]- options:可选,选项包括-h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等等。
- command:要进行的操作。
- package 操作的对象。
yum 常用命令
- 1.列出所有可更新的软件清单命令:
yum check-update - 2.更新所有软件命令:
yum update - 3.仅安装指定的软件命令:
yum install <package_name> - 4.仅更新指定的软件命令:
yum update <package_name> - 5.列出所有可安裝的软件清单命令:
yum list - 6.删除软件包命令:
yum remove <package_name> - 7.查找软件包 命令:
yum search <keyword> - 8.清除缓存命令:
yum clean packages: 清除缓存目录下的软件包
yum clean headers: 清除缓存目录下的 headers
yum clean oldheaders: 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers安装及启动 nginx
Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。具有很有特性:
- 热部署:在 master 管理进程与 worker 工作进程的分离设计,使的 Nginx 具有热部署的功能,那么在 7×24 小时不间断服务的前提下,升级 Nginx 的可执行文件。也可以在不停止服务的情况下修改配置文件,更换日志文件等功能。
- 可以高并发连接:理论上,Nginx 支持的并发连接上限取决于你的内存,10 万远未封顶。
- 低的内存消耗:在一般的情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗 2.5M 的内存,这也是 Nginx 支持高并发连接的基础。
- 处理响应请求很快:在正常的情况下,单次请求会得到更快的响应。在高峰期,Nginx 可以比其他的 Web 服务器更快的响应请求。
- 具有很高的可靠性:高可靠性来自其核心框架代码的优秀设计、模块设计的简单性;并且这些模块都非常的稳定。
yum 安装:
yum install -y nginx启动 nginx 服务:
service nginx start测试 nginx 服务:
wget http://127.0.0.1若结果如下,说明 nginx 服务正常。
[root@VM_195_14_centos ~]# wget http://127.0.0.1
--2017-05-11 20:32:34-- http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3700 (3.6K) [text/html]
Saving to: 'index.html'
100%[======================================>] 3,700 --.-K/s in 0s
2017-05-11 20:32:34 (632 MB/s) - 'index.html' saved [3700/3700]在浏览器中,访问通过 CentOS 云服务器公网 IP 查看 nginx 服务是否正常运行。
nginx 服务器命令
- 启动 nginx:service nginx start
- 访问(nginx 默认是 80 端口):curl 127.0.0.1
- nginx 配置文件目录:nginx -t
- 重启 nginx:service nginx restart
- 停用 nginx:service nginx stop
Linux 源码编译安装 node.js
开篇说了我会尝试建立一个 vue.js+node.js 全栈开发的交流社区,自然这个站点会基于 node.js 构建后端。
Linux 下 node 有多种安装方式,这里我们手工安装官方最新版本。
1.安装编译环境
我的 CentOS 版本是 7.2,安装前先安装编译环境,如 gcc 编译器:
yum install -y gcc gcc-c++ openssl-devel然后执行gcc -v运行正常:
...
gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)2.检查和核对 Python 版本 Node.js 环境需要 Python2.6 以上,我们需要检查,如果不是则需要安装和升级最新版 Python。
python退出 python 命令行使用 exit() 命令或者 Ctrl-D 快捷键。
3.安装最新版本 Node.js
我们将我们的 node 下载到/usr/local/src 文件夹下进行安装:
cd /usr/local/src下载:
wget http://nodejs.org/dist/node-latest.tar.gz解压:
tar -zxvf node-latest.tar.gz进入当前版本进行编译,先通过 ls 查询解压的文件夹名:
[root@VM_195_14_centos src]# ls
node-latest.tar.gz node-v7.10.0然后进入 node-v7.10.0 文件夹进行安装:
cd node-v0.12.7
./configure
make && make install然后检查 node 是否正确安装:
node -v如果正确打印出版本则正确安装。
通过 Filezilla 实现本地 Windows 上传文件到 Linux 服务器/从 Linux 服务器下载文件
本方法仅适合本地为 Windows 系统的用户,可实现将本地文件上传至 Linux 服务器/下载 Linux 服务器上的文件。本地为 Linux 系统的用户可直接使用 SCP 命令进行上传下载。本地安装 Filezilla 客户端,参考下载地址:https://www.filezilla.cn/download/client
点击【文件】-【站点管理器】,点击【新站点】按钮,输入以下内容:
主机:Linux 云服务器的公网 IP 端口:远程连接端口,默认 22 协议:选择【SFTP】ssh 文件传输协议登录类型:选择正常用户:Linux 云服务器的登录用户,默认为 root/ubuntu 密码:Linux 云服务器的登录密码
点击【连接】按钮,等待连接 Linux 云服务器。
连接成功后,左侧为本地文件,右侧为服务器端文件。需要上传本地文件至服务器时,在左侧需要上传的文件上右键单击【上传】按钮,文件即可上传到右侧服务器文件目录下;需要下载服务器文件至本地时,在右侧需要下载的文件上右键单击【下载】按钮,文件即可下载到左侧本地文件目录下;
Linux Nginx ssl 证书部署
我是在腾讯云上部署的,在这里申请免费的 SSL 证书:申请免费证书。申请完了后下载证书然后可以利用上面说的 Filezilla 上传到服务器上,参考这里的文档Nginx 证书部署。
- 下载解压证书,Nginx 文件夹内获得 SSL 证书文件 1_www.domain.com_bundle.crt 和私钥文件 2_www.domain.com.key, 1_www.domain.com_bundle.crt 文件包括两段证书代码 “-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”, 2_www.domain.com.key 文件包括一段私钥代码“-----BEGIN RSA PRIVATE KEY-----”和“-----END RSA PRIVATE KEY-----”。
- 将域名 www.domain.com 的证书文件 1_www.domain.com_bundle.crt 、私钥文件 2_www.domain.com.key 保存到同一个目录,例如/usr/share/nginx/conf 目录下。
- 更新 Nginx 根目录下 conf/nginx.conf 文件。
这里重点说说更新 nginx.conf 文件,新手一般不知道 nginx.conf 的位置,这时候我们就需要使用 nginx -t 来查找 nginx 配置文件,并使用 vi 命令修改该配置文件,如下:
[root@VM_195_14_centos ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful打开 vim 修改 nginx.conf 文件:
vim /etc/nginx/nginx.conf主要修改 server:
server {
listen 443;
server_name www.domain.com; #填写绑定证书的域名
ssl on;
ssl_certificate /usr/share/nginx/conf/1_www.domain.com_bundle.crt;
ssl_certificate_key /usr/share/nginx/conf/2_www.domain.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
#其他不修改...
}配置完成后,正确无误的话,重启 nginx。就可以使 https://www.domain.com 来访问了。
注:(配置关键字段)
| 配置文件参数 | 说明 |
|---|---|
| listen 443 | SSL 访问端口号为 443 |
| ssl on | 启用 SSL 功能 |
| ssl_certificate | 证书文件 |
| ssl_certificate_key | 私钥文件 |
| ssl_protocols | 使用的协议 |
| ssl_ciphers | 配置加密套件,写法遵循 openssl 标准 |
Linux node 服务 nginx 配置
前面我们已经正确下载了 node 环境,这里我们写一个简单的 node 程序开启一个 node 服务。

使用vim /var/www/index.js在/var/www 文件夹下建立一个 index.js,起一个最简单的服务。
const http = require("http");
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
res.end("Hello World\n");
});
server.listen(3000, () => {
console.log(`node server is now running/`);
});nodejs 默认端口是 3000,需要配置 nginx 反向代理到 nodejs 的 3000 端口。
server {
listen 443;
server_name www.domain.com;
ssl on;
ssl_certificate /usr/share/nginx/conf/1_www.vuenode.com_bundle.crt;
ssl_certificate_key /usr/share/nginx/conf/2_www.vuenode.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection ‘upgrade’;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}然后重启 nginx 及打开 node 服务:
service nginx restart
node /var/www/index我们打开浏览器,页面页面会出现 hello world,至此我们的 node 服务已经搭建完成。这里需要说明的是我们容易产生一个误区的是 node 提供了 https 模块,我们在构建 node 服务的时候是使用 http 模块还是 https 模块,如果我们之间使用 node 做服务,不经过 nginx 反向代理,确实是可以使用 https 模块,不过这里我们使用了 nginx 对外部访问的时候是使用 https,服务器内部使用 http 模块即可。
nginx 配置一些常见问题
1.文件上传 413 请求实体太大错误
server {
...
client_max_body_size 200m;
}2.nginx配置多个服务
location / {
proxy_pass http://127.0.0.1:8080/;
}
location /aoss/ {
proxy_pass http://127.0.0.1:3000/;
}参考
写这些代码也许就一两个小时的事,写一篇大家好接受的文章需要几天的酝酿,如果文章对您有帮助请我喝杯咖啡吧!
