centerOS部署nginx+node+pm2

一、服务器环境部署

1.node

(1)安装node

wget http://nodejs.org/dist/v9.9.0/node-v9.9.0-linux-x64.tar.gz #下载
tar xvzf node-v9.9.0-linux-x64.tar.gz #解压
cd node-v9.9.0-linux-x64 #进入解压文件目录

(2)安装必要的文件

sudo yum install gcc gcc-c++

(3)配置node、npm软连接

ln -s /root/node-v9.9.0-linux-x64/bin/node /usr/local/bin/node  
ln -s /root/node-v9.9.0-linux-x64/bin/npm /usr/local/bin/npm

(4)安装查看

node -v #查看版本

2.pm2

(1)pm2的安装

npm i pm2 -g

(2)配置pm2的软链接

ln -s /root/node-v9.9.0-linux-x64/bin/pm2 /usr/local/bin/pm2

3.Nginx

(1)nginx的安装

yum install nginx

二、项目的安装配置

1.项目拷贝

git clone git@xxxxxxx/xxxxx.git  #或者直接上传项目文件夹

2.项目配置打包

cd xxx #进入项目目录
npm i #安装npm包
npm run build #打包项目,命令根据自己设定的

三、启动项目

1.配置必要文件(重要)

(1)pm2启动文件配置(可在项目文件夹根目录下)

方式1:yml配置

apps:
  - script: /root/projects/VUE-SSR-TECH/server/server.js
    name: vue-todo
    env_production:
      NODE_ENV: production
      HOST: localhost
      PORT: 8888

ym2.yml

方式2:json配置

{
  "apps":
    {
      "name": "todo", 
      "cwd": "/root/projects/VUE-SSR-TECH",
      "script": "/root/projects/VUE-SSR-TECH/server/server.js",
      "exec_interpreter": "bash",
      "min_uptime": "60s",
      "max_restarts": 30,
      "exec_mode" : "cluster_mode",
      "error_file" : "./test-err.log",
      "out_file": "./test-out.log",
      "pid_file": "./test.pid",
      "watch": true,
      "env": {
        "NODE_ENV": "production",
        "HOST": "127.0.0.1",
        "PORT": "8888"
      }
    }
}

app.json

(2)nginx配置(可在项目文件夹根目录下)

upstream todo {
  server 127.0.0.1:8888; #这里要和启动项目的PORT端口一致
  keepalive 64;
}
server {
  listen 80;
  server_name www.helpping.top; #填写必须是已备案的域名,不然解析会出错。没有域名可填写服务器ip
  root         /root/projects/VUE-SSR-TECH; #项目favicon.ico所在文件夹
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwardered-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Nginx-Proxy true;
    proxy_set_header Connection '';
    proxy_pass http://todo; #这里要和最上面upstream后的应用名一致,可以自定义
  }
  location ~ \.(txt)$ {
    root /var/www/jnode/;
  }
}

todo.conf

说明:在centos里nginx有默认启动配置在etc/nginx/nginx.conf文件中

一般不修改这个文件,但有时因为权限需要,可以修改第5行的用户

修改用户为nginx用户

2.项目启动

# 启动nginx
sudo ln -s /root/projects/VUE-SSR-TECH/todo.conf /etc/nginx/conf.d/  #nginx启动文件的软链接
service nginx start #启动nginx服务
cd xxx #进入项目根目录

# 启动pm2(选择其中一条命令)
pm2 start pm2.yml #启动,启动端口为项目默认端口
pm2 start app.json #启动,启动端口为项目默认端口
pm2 start pm2.yml --env production  # 启动,启动端口为pm2.yml中env_production下指定端口
pm2 start app.json --env production  # 启动,启动端口为app.json中env_production下指定端口

此时输入浏览器中输入域名(本案例为: www.helpping.top),即可看到页面

关键

很多次设置域名后,启动不是跳nginx默认页面就是502,实质上都是nginx启动成功后找不到pm2页面的启动端口所致。很多时候我们查看pm2 list发现项目启动运行了,ps -ef | grep  nginx发现nginx也启动了,但就是找不到网关,很大原因就是这个端口设置和启动方式不匹配的原因(花了很久才发现问题所在TVT)

jtodo.conf中的upstream todo {server 127.0.0.1:8888}端口设置和启动命令选择的端口要一致。

我这里设置的todo.conf和ym2.yml(或者app.json)设置都是8888的端口,所以启动的时候命令要使用yml/json中新设置的

pm2 start pm2.yml --env production  # 启动,启动端口为pm2.yml中env_production下指定端口
pm2 start app.json --env production  # 启动,启动端口为app.json中env_production下指定端口

这样才能找到

如果不想带env的参数,就要在项目的server.js文件中查找启动端口

我这里很明显是端口号是3333

upstream todo {
  server 127.0.0.1:3333; #这里要和启动项目的PORT端口一致
  keepalive 64;
}

那么,设置todo.conf的端口就要为3333

启动命令可以简化(2选1)

pm2 start pm2.yml #启动,启动端口为项目默认端口
pm2 start app.json #启动,启动端口为项目默认端口

四、更新配置生效

1.pm2更新启动

pm2 -i /root/projects/VUE-SSR-TECH/pm2.yml & #添加pm2软链接
pm2 start pm2.yml #启动pm2

2.conf更新启动

rm /etc/nginx/conf.d/todo.conf -rf #强制删除之前已存在的nginx启动软链接文件
sudo ln -s /root/projects/VUE-SSR-TECH/todo.conf /etc/nginx/conf.d/ #重新添加nginx启动软链接
lsof -i tcp:80 #查看服务器域名(端口默认80)所在进程
kill 12344 #杀死nginx的进程
sudo /usr/sbin/nginx  #启动nginx(service nginx start)

五、nginx部署多个node站点示例

server {
    listen 80;
    server_name a.com;
 
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:8082;
    }
}
 
server {
    listen 80;
    server_name b.com;
 
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:8083;
    }

conf文件配置

参考文档

1.在CentOS 7上安装Node.js的4种方法(包含npm):https://blog.csdn.net/xuaa/article/details/52262586

2.nginx学习-超详细nginx配置文件:https://www.cnblogs.com/2nao/p/8031866.html

3.Nginx配置文件nginx.conf详解:https://www.cnblogs.com/xuey/p/7631690.html

4.nginx部署多个node站点:https://blog.csdn.net/ziwoods/article/details/77164927

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏建站达人秀

如何搭建 Typecho 博客

Typecho是一个基于PHP的简洁的开源博客程序。它使用多种数据库(MySQL,PostgreSQL,SQLite)储存数据,在GNU GPLv2许可证下发行...

3.4K60
来自专栏cloudskyme

vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化)

环境准备 软件:vmware workstation 9.0      ubuntu-12.04.2-server-amd64(官方下载) 硬件:确认CPU支持...

34450
来自专栏FreeBuf

让木马病毒DNS数据传输成为历史:看我如何让XShell病毒失效

基础词汇解释: DnsA记录传输: 利用dns解析过程,在请求解析的域名中包含需外传的数据,如xxxxxx.hack.com。则最终hack.com的dns服务...

25670
来自专栏Java后端技术

解决【无法启动此程序,因为计算机中丢失MSVCP71.dll。尝试重新安装该程序以解决此问题】问题

  今日电脑偶然出现:【无法启动此程序,因为计算机中丢失MSVCP71.dll。尝试重新安装该程序以解决此问题。】的不断地弹窗报错。

16220
来自专栏ascii0x03的安全笔记

小记Linux下对mac80211内核模块修改

mac80211内核模块实现了对802.11协议的处理过程。其中mlme.c文件中的内容实现了对Deauth管理帧的处理。考虑到Deauth攻击至今仍没有好的防...

30260
来自专栏测试驿栈

AutoMagic-开源自动化平台构建思路

最近在github上看到AutoMagic自动化平台开源了,一时手痒,就试着搭了一套环境,现在把思路和大家说一说。

26430
来自专栏醉生梦死

Windows服务器主网卡绑定多ip实践演示

查询内网dns:https://cloud.tencent.com/document/product/213/5225

2.3K90
来自专栏GA小站

Launch上的Extensions(插件)

Extensions在英文上的意思就是扩展,但实际这个中文意思并不能很好的代表这个功能,我觉得用“插件”这个词会比较合适,后面我所有的介绍都会用插件来表示Ext...

14940
来自专栏实战docker

docker下载镜像慢怎么办?daocloud加速器来帮你

使用docker pull命令下载镜像的时候,常遇到连接超时或者下载很慢的情况,例如docker pull bolingcavalry/bolingcavalr...

38980
来自专栏乐沙弥的世界

实验一:SQL server 2005高可用性之----日志传送

如转载,请注明出处:http://blog.csdn.net/robinson_0612/archive/2009/10/31/4751070.aspx

13820

扫码关注云+社区

领取腾讯云代金券