/ 服务和运维

记录一次完整的Web项目部署过程

记录一次完整的Web项目部署过程

最近在找工作,由于简历上需要填写所做过项目的地址,但之前所做的项目基本都是内网的应用,因此必须自己将所做项目的demo部署发布出来,这里顺便记录一下整个过程,方便以后再次查看。因为要部署多个项目,这里我选择的是一台便宜的OVZ架构的美国VPS作为主服务器,然后通过另一台网络较好的VPS进行反向代理来优化国内的访问速度。

前期准备

  • Debian8简化版的VPS一台
  • 要部署项目的git源
  • 杂乱的便宜域名一个(可选,如不用域名就直接通过IP访问)
  • 反向代理小内存VPS一台(可选,用于优化访问速度)

完整过程

  1. 安装git以及下载要部署的项目到服务器
  2. 安装Node.js,安装项目依赖
  3. 安装守护程序pm2,通过脚本启动项目并添加进守护进程列表
  4. 安装Nginx,配置反向代理
  5. 添加域名解析

1.安装git以及下载要部署的项目到服务器

安装git:

apt-get install git

将项目集中下载到/var/www/web目录:

mkdir /var/www/web
cd /var/www/web
git clone ... # 把所有项目clone到此目录

2.安装Node.js,安装项目依赖

首先安装curl:

apt-get install curl

按照Installing Node.js via package manager的说明(因为直接用的root账户,所以和文档略有不同):

curl -sL https://deb.nodesource.com/setup_6.x | bash -
apt-get install nodejs

之后进入各项目的目录npm install安装好各项目需要的依赖

3.安装守护程序pm2,通过脚本启动项目并添加进守护进程列表

接下来就要启动各个项目了,并且要为每个项目进程加上守护进程防止它们崩掉。

先安装pm2,它是一个比较高级的Node.js守护程序,可以守护各种脚本的运行,比如shell脚本,JS脚本:

npm install -g pm2

由于我的项目是开发环境的demo,没有生产环境的demo,所以通过命令行来启动项目会比较方便,因此编写好项目启动的shell脚本,然后用pm2来启动并守护这些进程。以下是一个简单的项目启动shell脚本:

#!/bin/bash
cd /var/www/web/project1
npm start

另存为project1.sh,之后把每个项目都编写一个shell脚本来启动,全部编写完后:

pm2 start project1.sh project2.sh ...

这样每个项目就启动并添加进守护进程了,之后可以用pm2 list命令查看服务运行状态,pm2 stop停止服务等操作来管理守护的进程。

4.安装Nginx,配置反向代理

本地部署的服务,如果没有设置host,可能只能通过localhost还有127.0.0.1来访问Web服务,因此需要使用Nginx的反向代理来将项目代理到公网地址中。

通过官网的教程Pre-Built Packages for Stable version安装Nginx:

wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key

# 之后编辑debian源
vi /etc/apt/sources.list

# 添加两行后保存并退出
deb http://nginx.org/packages/debian/ jessie nginx
deb-src http://nginx.org/packages/debian/ jessie nginx

apt-get update
apt-get install nginx

nginx默认的配置文件在/etc/nginx/nginx.conf,"http"配置项里include了/etc/nginx/conf.d/里面的所有配置,因此可以直接将"server"卸载conf.d文件夹里,便于管理。现在要实现的是请求公网地址时代理到本地的服务端口,这里新建一个web.conf放在conf.d目录下:

# 其中的一个 server 示例
server {
    listen 80;
    server_name xxx:xxx:xxx:xxx; # 公网地址
    location / {
        proxy_pass http://localhost:8080;
        proxy_redirect default;
    }
}

再执行命令重载nginx配置就可以通过公网地址访问部署的Web服务了:

service nginx reload

做完这些以后,如果还要再用一台线路好的小内存VPS来做反向代理,就按上面的方法再装一次Nginx,然后配置也大致相同,只是需要把"server_name"变成域名地址,例如a.host.com,然后把"proxy_pass"变成http://xxx:xxx:xxx:xxx/即可,也就是主要服务器的公网地址,做完这些,服务器上的操作就完成了,接下来,再去设置一下域名解析就好了。

5.添加域名解析

推荐域名在国外注册,因为可以避免一些不必要的麻烦,之后利用国内的DNS解析服务,添加A记录,"主机记录"为二级域名,以a.host.com为例,即是"a",记录值是反向代理服务器的公网IP,至此,所有步骤就完成了,当再访问a.host.com的时候,就可以访问到主要服务器上部署的Web服务了。

总结

在做这些事情的过程中,其实还遇到了各种问题,比如服务跑不起来了,就要去看错误日志,里面会提供很有价值的东西,如果看不懂再去找关键字搜索;又比如项目依赖有误,特别是一些没有发布在npm里,而是直接git源作为下载源的依赖,有可能就是作者更新了,所以需要去找更新了哪些地方,然后去手动修正。这些都能让人想到更多解决问题的方法和锻炼耐心去找问题所在。其实这些东西都不复杂,只是以我目前作为一个前端的水平,平时接触不到pm2, Nginx这些东西,所以久而久之就会忘掉,在这里记录一下,既能帮助自己加深记忆,又能方便以后回忆。