本文介绍了怎么样在生产环境上运行 Node.js 应用。生产环境一般就是一台或一群 Linux 类型操作系统的服务器,当然你也可以把应用装到容器里运行,但不管怎么样,你需要先了解最基本的操作流程。
纲要
- 在本地创建一台 CentOS 系统的虚拟机来模拟应用的生产环境。
- 安装与配置 Node.js。
- 使用 PM2 运行 Node.js 应用。
- 为 Node.js 应用安装并配置一个 Nginx 代理。
订阅宁皓网,可以在线学习更多关于 Node.js 应用开发。
我们会在一台 CentOS 系统的服务器上,使用 Nginx 反向代理 + PM2 的方式运行 Node.js 应用。应用的服务器一般都是 Linux 类型的操作系统,CentOS 是其中的一种。下面可以先在本地可以创建一台 CentOS 7.x 操作系统的虚拟机,然后在上面去运行一个 Node.js 应用。这个应用我会使用 Adonis.js 应用框架创建一个。
虚拟机
生产环境的服务器你可以选择一些云服务商提供的服务,比如阿里云、腾讯云等等。你可以购买一台真正的 CentOS 系统的服务器。或者也可以在本地电脑上创建一台 CentOS 系统的虚拟机,这种方法更方便一些,比较适合学习。
首先在电脑上安装一下 Virtualbox(虚拟机软件) 还有 Vagrant(管理虚拟机用的一种命令行工具)。然后再添加一个 CentOS 7 类型的 Box(系统镜像,这样就可以基于这个镜像去创建这种操作系统的虚拟机)。准备好以后,执行下面这些任务:
创建目录
使用电脑上的命令行界面,Windows 可以使用 Cmder(需要单独下载并安装),macOS 可以用系统自带的终端(Terminal)。先去为项目创建一个目录并进入到这个目录的下面。
cd ~/desktop mkdir ninghao-node cd ninghao-node
创建虚拟机
执行下面的命令会在当前目录下创建一个虚拟机配置文件(Vagrantfile),centos/7 是我们要使用的 Box 的名字。你可以在 Vagrant 的官方找到很多不同类型的 Box。
vagrant init centos/7
打开创建的虚拟机配置文件 Vagrantfile,先配置一下虚拟机使用的网络,可以使用私有网络(private_network),就是在虚拟机与你的电脑之间创建的一个网络,也就是你的电脑可以访问到电脑上的这台虚拟机,虚拟机也可以访问到你的电脑。如果配置使用公有网络(public_network),虚拟机的 IP 地址是你选择的路由器分配的,也就是路由器所管理的这个网络里面的所有的设备都可以访问到创建的这台虚拟机。
配置使用私有网络,并为虚拟机配置一个 IP 地址,这样我们在电脑上可以通过这个 IP 地址访问到在虚拟机上运行的服务。在配置文件里添加一行配置:
config.vm.network "private_network", ip: "192.168.33.10"
启动并连接到虚拟机:
vagrant up vagrant ssh
必备工具
登录到虚拟机以后,可以先在这台 CentOS 系统的虚拟机上安装两个必备的东西,一个是 epel-release 软件仓库,后面要安装 Nginx 服务器的时候会用到。还需要再安装一下源代码管理工具 Git 。
安装 epel-release 仓库
sudo yum install epel-release - y
安装 Git
sudo yum install git -y
Node.js
下面在创建的 CentOS 系统的虚拟机上安装一下 Node.js,这个过程跟你在一般的 CentOS 系统的服务器上是一样的。有几种方法可以在 CentOS 上安装 Node.js,可以直接安装,也可以通过 NVM 来管理在系统上安装的 Node.js。
直接安装 Node.js
curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash - sudo yum install nodejs -y
上面的方法很容易安装好 Node.js,不过安装好以后,如果你用 npm 安装全局包的话可能会遇到权限问题,需要额外去做一些配置,或者在命令的前面加上 sudo 获得管理员的权限。更好的方法是可以使用 NVM 管理在系统上的 Node.js。
使用 NVM 管理系统上的 Node.js
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
参考:https://github.com/creationix/nvm/blob/master/README.md#installation
安装好了 NVM 以后,需要配置一下,编辑一下用户主目录(~)下的 .bash_profile 这个文件,执行:
vi ~/.bash_profile
在这个 .bash_profile 文件里,添加:
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
有了 NVM 你可以在系统上安装多个版本的 Node.js,并且可以配置当前系统或者项目要使用哪个版本的 Node.js。用 NVM 安装最新版本的 Node.js,执行:
nvm install node
会提示:
Downloading and installing node v11.1.0... Downloading https://nodejs.org/dist/v11.1.0/node-v11.1.0-linux-x64.tar.xz... ######################################################################## 100.0% Computing checksum with sha256sum Checksums matched!
安装完成以后执行:
nvm use node
可能会提示:
nvm is not compatible with the npm config "prefix" option: currently set to "/home/vagrant/nvm/versions/node/v11.1.0" Run `nvm use --delete-prefix v11.1.0` to unset it.
如果有上面的提示,执行一下:
nvm use --delete-prefix v11.1.0
然后检查当前 Node.js 的版本,执行:
[vagrant@localhost ~]$ node -v v11.1.0
修改 Node.js 包的安装源
使用 npm 安装的 Node.js 包,默认的来源是 http://registry.npmjs.org,国内的下载速度可能会比较慢,所以我们可以更改一下这个安装源。使用 nrm 这个小工具可以很容易修改这个安装源。
安装 nrm:
npm install nrm --global
切换成 taobao 安装源:
nrm use taobao
这样在国内安装 Node.js 包的时候速度会快很多。
创建 Node.js 应用
你应该在本地电脑上已经开发好了一个 Node.js 应用,应用的代码会在一个远程仓库上。你可以把应用代码克隆到服务器上,并且可以配置一些自动化的脚本,自动从远程仓库那里拉取最新的代码。为了简单,我们可以直接在这台 CentOS 服务器上创建一个 Node.js 项目。我会创建一个基于 Adonis.js 应用框架的 Node.js 应用。先安装一下这个框架的命令行工具:
npm install @adonisjs/cli --global
创建一个 Adonis.js 项目:
cd ~ adonis new ninghao
运行 Node.js 应用
一般在生产环境上运行 Node.js 应用,可以使用 PM2 这个工具去管理 Node.js 进程。
安装 PM2
npm install pm2@latest --global
如果你想直接通过服务器的 IP 地址访问到创建的 Node.js 应用,可以修改一下这个应用里面的 .env 文件。编辑一下项目下面的 .env 文件,修改一下 HOST(主机) 的值:
HOST=0.0.0.0 PORT=3333 ...
HOST 默认的值是 127.0.0.1,这样应用服务只能在本机上访问到,如果修改成 0.0.0.0,应用服务就可以通过服务器的 IP 地址访问到了。
运行应用
pm2 start server.js
返回:
[PM2] Spawning PM2 daemon with pm2_home=/home/vagrant/.pm2 [PM2] PM2 Successfully daemonized [PM2] Starting /home/vagrant/ninghao/server.js in fork_mode (1 instance) [PM2] Done.
在浏览器访问 服务器IP地址:端口:
Nginx 代理
一般我们会给 Node.js 应用添加一个 Nginx 反向代理,也就是请求会先到 Nginx 服务器上,然后由这个 Nginx 服务器把请求转发给我们的 Node.js 应用。这种做是因为 Nginx 更擅长处理网络请求。
安装 Nginx
sudo yum install nginx -y
启动 Nginx
sudo systemctl start nginx
配置 Nginx
在 /etc/nginx/conf.d 下面创建一个配置文件叫 default.conf,内容如下:
server { listen 80; location / { proxy_pass http://127.0.0.1:3333; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache_bypass $http_upgrade; } }
然后修改 Nginx 的主配置文件(/etc/nginx/nginx.conf),去掉配置文件里面默认添加的服务器。打开这个主配置文件,删除掉里面定义的 server 。这样做是想让 Nginx 使用我们自己创建的这个默认的配置。也就是直接访问服务器的 IP 地址,就会使用我们创建的 default.conf 这个配置文件里的配置,这个配置里面创建了一个代理 ,请求会转发到 127.0.0.1:3333,就是我们的 Node.js 应用服务。
关掉 Selinux
先检查一下系统的 Selinux 的状态:
getenforce
返回:
Enforcing
说明启用了 Selinux,执行命令关掉 Selinux:
sudo setenforce 0
再次执行 getenforce 会返回 Permissive。
.env
因为请求是用 Nginx 服务器接待的,所以我们的 Node.js 应用没有必要通过 IP 地址访问到,所以可以再修改一下 .env 文件,把里面的 host 的值修改成 127.0.0.1。然后重新再运行一下应用:
pm2 stop server.js pm2 start server.js
现在,直接访问服务器的 IP 地址,就可以访问到 Node.js 应用了。
相关资源
- Vagrant 官方网站
- Virtualbox 官方网站
- centos/7 Box
- PM2 官方网站
- 《Nginx》免费视频课程
- 《Vagrant 虚拟机管理》免费视频课程
- 《Node.js 应用开发》付费会员视频课程
- 《CentOS》付费会员视频课程
评论
皓哥,能否再来一片再docker上部署Node应用的教程,探讨下实际可用于与正式项目的最优方案有哪些,如何实现~ 谢谢~
6 年 2 周 以前
好地
6 年 2 周 以前
我只学其中的某个课程,却要订阅课程。哪有精力来学习那么多的课程?
5 年 6 个月 以前
嘿嘿,您可以订一季,正好可以学完一个课程,刚刚调整了一下订阅价格,比年付要便宜,而且也可以学习所有课程。
5 年 6 个月 以前