使用pm2+nginx部署koa2(https)

7,390 阅读3分钟

这段时间空余的时候一直在重新写自己的博客,之前是采用的 hexo 生成的博客然后跑在 git page 上的。这次重写是选择的 koa2 这个框架。
今天先来写一下关于 koa2 网站运行部署以及 https 配置。
目前网站的大致结构是: koa2 的应用跑在 1113 端口,然后 nginx 反向代理到 443 (https) 端口, 同时 nginx 将 80 (http) 端口转发到 443 (https) 端口。

pm2 配置

pm2 是开源的基于Nodejs的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是一般的脚本的程序它同样可以胜任。

pm2 是一个带有负载均衡功能的 Node 应用的进程管理器。使用 pm2 可以保持我们的node应用进程永远运行在后台。此外 pm2 还有个非常强大的deploy功能,可以从本地直接部署线上网站。下面我来说一下具体的操作。

  1. 服务端安装软件
    在服务端需要安装的有 git 、node 、pm2 、nginx 等。
    安装完这些之后需要在服务端生成 ssh key ,然后将生成的 pub key 添加到相应的 git 仓库里的 setting 里的 Deploy Keys 里。

  2. 本地安装软件
    本地需要安装的有 git 、node 、pm2 等。

  3. pm2 deploy 配置
    使用 pm2 ecosystem 生成配置示例文件,然后打开配置生成的配置文件,下面是生成的示例配置文件。

    module.exports = {
     /**
      * Application configuration section
      * http://pm2.keymetrics.io/docs/usage/application-declaration/
      */
     apps: [
    
         // First application
         {
             name: 'API',
             script: 'app.js',
             env: {
                 COMMON_VARIABLE: 'true'
             },
             env_production: {
                 NODE_ENV: 'production'
             }
         },
    
         // Second application
         {
             name: 'WEB',
             script: 'web.js'
         }
     ],
    
     /**
      * Deployment section
      * http://pm2.keymetrics.io/docs/usage/deployment/
      */
     deploy: {
         production: {
             user: 'node',
             host: '212.83.163.1',
             ref: 'origin/master',
             repo: 'git@github.com:repo.git',
             path: '/var/www/production',
             'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production'
         },
         dev: {
             user: 'node',
             host: '212.83.163.1',
             ref: 'origin/master',
             repo: 'git@github.com:repo.git',
             path: '/var/www/development',
             'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env dev',
             env: {
                 NODE_ENV: 'dev'
             }
         }
     }
    };
    

    在 apps 里可以配置多个应用,然后deploy是配置不同的环境所用的配置,有了示例而配置之后,你可以根据自己的真实情况进行相应的修改。
    有了配置文件之后执行 pm2 deploy ecosystem.config.js production setup 命令进行初始化设置,运行完成之后,再运行 pm2 deploy ecosystem.config.js production 这个命令,以后更新部署应用都可以通过这个命令。(为了方便可以将这两条命令配置到 package.json 里的 scripts 里)。
    命令运行完之后,如果没出意外,出现 Success 字样就表示部署成功。这时候在浏览器输入相应的服务器 ip以及你设置的端口号就可以打开你部署的网站。同时在服务器上,可以通过 pm2 list 查看当前运行的应用。

nginx 配置

  1. 配置 http
    在服务端安装完nginx之后,打开/etc/nginx/sites-enabled 目录(默认的配置文件目录),在该目录下新建一个配置文件比如 blog.conf ,然后就可以打开该配置文件进行配置,将已经运行的 node 服务反向代理到 80 端口下。我的配置如下:

    server {
         listen 80;
         server_name blog.zhaofinger.com zhaofinger.com www.zhaofinger.com;
         access_log /var/www/log/blog-access.log;
         error_log  /var/www/log/blog-error.log;
    
         location / {
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 proxy_set_header Host $http_host;
                 proxy_set_header X-NginX-Proxy true;
                 proxy_pass http://127.0.0.1:1113/;
                 proxy_redirect off;
         }
    }
    

    proxy_pass 对应的就是 node 服务所运行的端口。文件写好之后保存退出,然后重启 nginx 服务,service nginx restart,重服务成功(如果错误可以打开 nginx 的日志查看相应的错误)之后就可以打开对应的域名访问网站。

  2. 配置 https
    配置 https ,首先需要购买 https 证书,我是在阿里云上买的免费的证书,打开网站点击购买证书,然后选择‘免费型DV SSL’,然后点击 ‘立即购买’。购买证书之后打开证书控制台补全信息。
    根据提示将两个证书文件下载下来上传到服务器上。然后打开刚才的 blog.conf 进行 https 配置。我的配置如下:

    server {
         listen 443;
         server_name blog.zhaofinger.com zhaofinger.com www.zhaofinger.com;
         access_log /var/www/log/blog-access.log;
         error_log  /var/www/log/blog-error.log;
         ssl on;
         ssl_certificate   /etc/nginx/cert/214259593710649.pem;
         ssl_certificate_key /etc/nginx/cert/214259593710649.key;
         ssl_session_timeout 5m;
         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         ssl_prefer_server_ciphers on;
    
         location / {
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 proxy_set_header Host $http_host;
                 proxy_set_header X-NginX-Proxy true;
                 proxy_pass http://127.0.0.1:1113/;
                 proxy_redirect off;
         }
    }
    

    ssl_certificatessl_certificate_key 就是刚刚上传的文件的位置。配置完成之后保存配置文件,退出重启 nginx 服务。然后打开 xxx.com 就可以访问到网站。
    配置完 https 之后还需要将 80 端口对应的 http 服务转到 https 下,增加配置如下:

    server {
         listen 80;
         server_name www.zhaofinger.com;
         rewrite ^/(.*) https://$server_name$1 permanent;    #跳转到Https
    }
    

到这里使用 pm2 + nginx 配置 https 服务就 ok 了。

最后本博客的源码托管在 github,欢迎使用,欢迎star。

文章中如有错误欢迎指正。