NodeJS项目首次发布流程

流程

Linux环境变量配置NODEJS环境:

1
2
3
4
5
需要配置负载均衡的若干台服务器
从 https://nodejs.org/dist/v8.9.3/node-v8.9.3-linux-x64.tar.xz 下载安装包,解压到/usr/local目录下,步骤如下
$ xz -d node-v8.9.3-linux-x64.tar.xz //解压xz文件
$ tar xvf node-v8.9.3-linux-x64.tar //解压tar文件
$ mv node-v8.9.3-linux-x64 /usr/local/node //移动node目录,并修改名称

配置环境变量

修改/etc/profile文件,在末尾添加以下内容

1
2
3
4
$ vim /etc/rpofile
$ export NODE_HOME=/usr/local/node
$ export PATH=$NODE_HOME/bin:$PATH

执行source /etc/profile 生效环境变量配置

1
2
$ source /etc/profile

测试node环境是否安装成功

1
2
3
$ node -v
$ npm -v

修改npm镜像源

1
2
$ npm config set registry https://registry.npm.taobao.org/

设置完成后,可以通过 查看是否修改镜像源成功

1
$ npm config list 

安装PM2作为NODEJS的服务器,执行以下命令

1
2
3
4
需要配置负载均衡的若干台服务器
$ npm install pm2 -g //安装pm2到全局环境
$ pm2 -v //测试是否安装成功,安装成功则会显示相应版本号

创建jenkins

1
2
3
4
5
项目名称:project_name_on_the_jenkins
Repository URL:svn://x.x.x.x:port/gitlab/xxx/master
同步到服务器:x.x.x.x , x.x.x.x, ....
Source files:**
Remote directory:/var/www/ai/stockrate

同步jenkins

1
project_name_on_the_jenkins

修改nginx配置

修改相关服务器的 /usr/local/nginx/conf/ai.conf 配置

1、在文件顶部新增upstream:

1
2
3
4
5
upstream stockrate {
# Nodejs app upstream
server 127.0.0.1:3000;
keepalive 64;
}

2、在location ~* ^/(transfer|reference|idxvisual).*.(html)$ 这一行上面新增如下nginx配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
location /stockrate/ {
# Proxy_pass configuration
root /var/www/ai/stockrate;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
# support websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_pass http://stockrate/;
proxy_redirect off;
proxy_read_timeout 240s;
}

3、重新加载nginx配置:

1
2
/usr/local/openresty/nginx/sbin/nginx -t
/usr/local/openresty/nginx/sbin/nginx -s reload

SQL执行

数据库服务器:x.x.x.x
将SQL语句整理成一个xxx.sql文件,发送给运维执行。
注:sql文件中需要包含建库和赋权限的功能,例:

1
2
3
CREATE DATABASE database_name default CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'db_username'@'%' IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE ON database_name.* TO db_username;

安装NPM包

1
2
操作的服务器:涉及的若干台服务器
进入/var/www/ai/stockrate目录,执行 npm install 命令,会自动下载所有的nodejs依赖包
1
2
3
4
$ cd /var/www/ai/stockrate
$ npm install


执行nodejs脚本

1
node path/to/your/script.js 

添加2个定时脚本

1
2
#2017-12-20 脚本说明信息 author@mail.com
0 17 * * 1-5 root /usr/local/node/bin/node path/to/your/script.js > /root/cront_log/log_file_name.txt 2>&1

开启PM2服务

1
pm2 start /var/www/ai/stockrate/server/pm2.json

将pm2加入开机启动

将如下内容加入/etc/rc.local

1
pm2 start /var/www/ai/stockrate/server/pm2.json

Nginx相关配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,
如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,
需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute("X-Forwarded-For")获取不到用户的ip,
如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
意思是增加一个$proxy_add_x_forwarded_forX-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,
实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip。

那么$proxy_add_x_forwarded_for又是什么?
$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。
举个例子,有一个web应用,在它之前通过了两个nginx转发,即用户访问该web通过两台nginx。
在第一台nginx中,使用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。


$http_host

1
2
nginx官方并没有对其的解释, 不过测试发现$host 与 $http_host的区别在于当使用非80/443端口的时候,$http_host = $host:$port

proxy_max_temp_file_size 0;

1
2
3
可以参考这篇文章:http://www.qmailer.net/archives/148.html
设置为0表示不向硬盘写入缓冲文件,防止在高并发的时候频繁写入磁盘影响转发性能

proxy_redirect off;

1
2
可以参考这篇文章:http://xstarcd.github.io/wiki/sysadmin/nginx_proxy_redirect.html

proxy_read_timeout

1
2
连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

Nginx支持WebSocket反向代理

1
2
3
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";