docker-compose编排nginx+tomcat+fastdfs+mysql
[docker compose 部署nginx-tomcat平台}(https://blog.51cto.com/1014810/2114707
)
svn,git分支版本发布
Jenkins+svn设置分支和版本号部署
jenkins选择分支构建
svn://****/$branch@$revision
配置git
用ssh拉取git源码 先在gitlab上配置好生成的公钥,然后在jenkin站点的凭据-系统-添加域 配置域的凭据,配置好凭据用户 ,选择SSH Username with private key 然后设置与公钥对应的私钥 Private Key 然后保存即可
配置与jenkins在同一台服务器上tomcat
### 用于tomcat7自动部署的管理用户必须具有manager-script角色,manager-gui角色是不够的,不然会有错误出现:
The username you provided is not allowed to use the text-based Tomcat Manager (error 403)
在/etc/tomcat7/tomcat-users.xml文件中为管理用户添加manager-script角色即可。
<role rolename="tomcat"/>
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<role rolename="manager-script"/>
<role rolename="admin-script"/>
<user username="tomcat" password="pwd" roles="tomcat,manager-gui,admin-gui,admin-script,manager-script"/>
username 和 password 则是登陆tomcat管理界面需要的账号密码。
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-gui" />
<role rolename="manager-script" />
<role rolename="manager-status" />
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="deploy" password="tomcat" roles="manager-gui,manager-script,manager-status" />
### 如果还不行
/webapps/manager/META_INF/context.xml文件,将文件中对访问的来源受限设置注释
<Context antiResourceLocking="false" privileged="true" > <!--注释这里,去除对访问权限的设置 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> --></Context>
# deploy war to a container配置
WAR/EAR files : target/***.war
Context path : projectname (在tomcat的webapp下的目录)
Containers : Tomcat URL 请求路径带端口
原文地址:https://blog.csdn.net/jay_1989/article/details/52861620
参考:
GitLab配置ssh key
Linux配置SSH公钥认证与Jenkins远程登录进行自动发布
jenkins SSH登录 Git配置(通过eclipse生成SSH 密钥)
根据版本更新发布
安装gitlab-plugin ( gitlab hook plugin这个不行)
在 构建触发器中 先择Build when a change is pushed to GitLab. GitLab webhook URL: http://ip/jenkins/project/name
在gitlab该project界面点击side bar最下面的settings图标 * Integrations Settings 然后再点击侧边栏中的“web Hooks”,在“URL”一栏输入在第5步骤中的(3)中的URL,还要点开右下角的 高级:随后点击右下角的 Generate 按钮,生成 Secret token; 在 Secret Token 一栏中输入生成的 Secret token;然后测试成功就说明gitlab和jenkins关联成功
在高级里面的Allowed branches 选择Filter branches by name Include master 允许master分支上的变化触发构建
shell发布tomcat
#!/bin/bash
export BUILD_ID=dontkillme #随便写
export JAVA_HOME=/usr/java/jdk1.7.0_80 #tomcat需要的jdk
#
# __auther__: zhan
# __ time __: 2018年08月16日 22:00:00
# __ 作用 __: 用于jenkins build完成之后的最后操作shell脚本
# __ 使用 __: 定义jenkins
#
#---------------------------------- 文件路径配置 ----------------------------------
#tomcat服务器获取系统时间以 2018-08-16 显示
timedate=$(date +%Y-%m-%d)
#client服务器tomcat安装路径
TOMCAT_HOME=/web/tomcat-jih-8080
#tomcat服务器备份文件存放路径
BACKUP_HOME=$TOMCAT_HOME/bak
#tomcat服务器war包服务器更新包名称
WAR__NAME=yk
#tomcat服务器最新版本文件存放路径
PUBLISHVERSION_HOME=/web/appwar/yk
#client服务器以时间的方式备份发布前的项目文件目录名称
BACK_TIME=`date +%Y%m%d%H%M`
#tomcat服务器项目发布后的路径
PUBLISHED_PATH=$TOMCAT_HOME/webapps/$WAR__NAME
#war包远程jenkins服务器项目配置文件
PROJECT_CONFIG_FILE=/web/appwar/yk/classes
#war包远程jenkins服务器地址
WAR_SERVER_IP='192.168.2.20'
#war包远程jenkins服务器存放路径
WAR_SERVER_HOME='/web/appwar/yk'
#---------------------- 远程复制war包 [需要SSH免密码登陆设置]-------------------
#复制远程jenkins服务器war包到tomcat服务器上最新版本文件存放路径
scp -r $WAR_SERVER_IP:/$WAR_SERVER_HOME/$WAR__NAME.war $PUBLISHVERSION_HOME
#--------------------------------- tomcat服务器备份文件 -------------------------------------
echo go to $BACKUP_HOME
cd $BACKUP_HOME
echo backup time $BACK_TIME
/bin/mkdir $BACK_TIME
echo go to $BACK_TIME
cd $BACK_TIME
echo "backup path"
pwd
echo "start copy project files"
#复制项目文件
cp $PUBLISHED_PATH . -R
#------------------------------- tomcat服务器解压war包 ---------------------------------------
#进入要发布版本的文件夹
cd $PUBLISHVERSION_HOME
echo "go to $PUBLISHVERSION_HOME"
#解压前先删除旧解压后的文件
rm -rf $WAR__NAME
echo "rm successfull"
#解压项目war包
/bin/unzip $WAR__NAME.war -d $WAR__NAME/ &>/dev/null
echo "unzip successfull"
#复制远程服务器war包最新配置文件到本地服务器配置文件存放路径
scp -r $WAR_SERVER_IP:/$PROJECT_CONFIG_FILE/* $PUBLISHVERSION_HOME/$WAR__NAME/WEB-INF/classes
#最后删除war包,以便下次更新下载最新war包
rm -rf $WAR__NAME.war
echo "$WAR__NAME.war rm successfull"
-------------------------------------------- 说明 ----------------------------------------------------------------------------------
#下面的命令会将【PROJECT_CONFIG_FILE=/web/appwar/yj/classes】classes目录给拷贝到本地文件的properties目录的
#scp -r $WAR_SERVER_IP:/$PROJECT_CONFIG_FILE/ $PUBLISHVERSION_HOME/$WAR__NAME/WEB-INF/classes/properties
#将远程【PROJECT_CONFIG_FILE=/web/appwar/yj/classes】classes目录下的所有文件(不包含classes目录)拷贝本地properties目录下
#scp -r $WAR_SERVER_IP:/$PROJECT_CONFIG_FILE/* $PUBLISHVERSION_HOME/$WAR__NAME/WEB-INF/classes/properties
#将远程classes目录下的文件拷贝本地classes目录下
#scp -r $WAR_SERVER_IP:/$PROJECT_CONFIG_FILE/* $PUBLISHVERSION_HOME/$WAR__NAME/WEB-INF/classes
#或者用scp -r $WAR_SERVER_IP:/$PROJECT_CONFIG_FILE/ $PUBLISHVERSION_HOME/$WAR__NAME/WEB-INF到这里即可,就直接将classes目录放到WEB-INF下面了
-------------------------------------------- 说明 ----------------------------------------------------------------------------------
#------------------------------- tomcat服务器部署文件 ---------------------------------------
#关闭tomcat
#/sbin/service tomcat stop
#$TOMCAT_HOME/bin/shutdown.sh
cd $TOMCAT_HOME/bin
#查看进程
ps -ef|grep $TOMCAT_HOME|grep -v grep|grep -v kill
#上一个命令退出后就执行kill进程号,否则是执行下一个语句说明
#【if [ $? -eq 0 ]:代表上一个命令执行后的退出状态:0为成功,非0为失败】
if [ $? -eq 0 ];then
kill -9 `ps -ef|grep $TOMCAT_HOME|grep -v grep|grep -v kill|awk '{print $2}'`
sleep 3
echo "停止tomcat服务成功"
else
echo $TOMCAT_HOME ' 该目录进程已KILL或项目未启动'
fi
#删除项目文件
rm -rf $PUBLISHED_PATH/*
#删除临时文件、log日志
rm -rf $TOMCAT_HOME/temp/*
rm -rf $TOMCAT_HOME/conf/Catalina/*
rm -rf $TOMCAT_HOME/work/*
#拷贝最新版本更新文件到项目发布路径下
cp $PUBLISHVERSION_HOME/$WAR__NAME/* $PUBLISHED_PATH/ -R
#复制配置文件
# cp $PUBLISHVERSION_HOME/classes/* $PUBLISHED_PATH/WEB-INF/classes -R
#启动tomcat,使用service命令时,使用普通用户需要输入密码,所以直接暂不采用service的方式启动和关闭tomcat
#/sbin/service tomcat start
$TOMCAT_HOME/bin/startup.sh
#tail -f $TOMCAT_HOME/logs/catalina.$timedate.out
#------------------------------- tnew ---------------------------------------
#!/bin/bash
echo "==================start deploy project========================="
ps -aux | grep /usr/local/tomcat/ | grep -v grep > tomcat_info.txt
sed 's/ / /g' tomcat_info.txt > tomcat_info1.txt
sed 's/ / /g' tomcat_info1.txt > tomcat_info.txt
sed 's/ / /g' tomcat_info.txt > tomcat_info1.txt
cat tomcat_info1.txt | cut -d' ' -f 2 > tomcat_info.txt
for line in `cat tomcat_info.txt`
do
kill -9 $line
done
cd /usr/local/tomcat/webapps
rm -rf youxuan_api*
mv /usr/local/jenkinsTempFolder/youxuan_api /usr/local/tomcat/webapps
/etc/init.d/tomcat start
sync
echo 3 > /proc/sys/vm/drop_caches
echo "==================deploy project success========================="
本地 tomcat部署项目脚本
#/bin/bash
export BUILD_ID=dontkillme
echo "stop tomcat..."
/usr/local/tomcat/bin/catalina.sh stop
pidlist=`ps -ef | grep tomcat_name | grep -v "grep" | grep -v "tail" |awk '{print $2}' `
kill -9 $pidlist
warDir = /war/projectname
warName = `ls -t $warDir | head -1`
appDir = "/usr/local/tomcat/webapps"
if rm -rf $appDir/*
then
mv $warDir/$warName $appDir/ROOT.war && echo "build success!"
sleep 10s
echo "start tomcat..."
/usr/local/tomcat/bin/catalina.sh start
fi
---------
rm -rf /usr/local/tomcat8/webapps/hua.war
\cp -f target/***.war /usr/local/tomcat8/webapps/hua.war
unzip -oqhua.war -d hua
rm -rf /usr/local/tomcat-admin/mywebapps/app/*
\cp -rf /home/zyy/wars/bulls-admin/target/$adminwar /usr/local/tomcat-admin/mywebapps/app.war
unzip -oq /usr/local/tomcat-admin/mywebapps/app.war -d /usr/local/tomcat-admin/mywebapps/app
----------------------------
#/bin/bash
export BUILD_ID=dontkillme
echo "stop tomcat..."
/usr/local/tomcat8/bin/catalina.sh stop
pidlist=`ps -ef | grep tomcat8 | grep -v "grep" | grep -v "tail" |awk '{print $2}' `
kill -9 $pidlist
if rm -rf /usr/local/tomcat/webapps/*****.war
then
\cp -f target/***.war /usr/local/tomcat8/webapps/*****.war && echo "build success!"
sleep 1s
echo "start tomcat..."
/usr/local/tomcat8/bin/catalina.sh start
fi
https://blog.csdn.net/weixin_39483907/article/details/80840948
https://blog.csdn.net/cx118118/article/details/82461966
https://blog.csdn.net/u013887008/article/details/83003665
shell远程部署tomcat
#安装 Publish over SSH插件
1.先在系统设置里设置ssh 可以创建一个用户,用用户和密码登录也可以用证书登录,证书在jenkins服务器上生成,然后将公钥发给应用服务器上,之后在jenkins上配置私钥后就可以访问应用服务器了。
2.设置send build artifacts over ssh 插件
Source files target/*.war or **/*.war
Remove prefix target war包前面的目录
Remote directory /opt/war/ (远程服务器的临时存放路径,配置好后会自动上传到这里,也可以直接放到tomcat目录下)
Exec command
export JAVA_HOME=/usr/local/jdk
cd /opt/apache-tomcat-7.0.63/bin/
./deploy.sh
deploy.sh内容
#desc:在jenkins构建完成后,ROOT.war已经是最新的
#重启tomcat
bash /opt/apache-tomcat-7.0.63/bin/catalina.sh stop
#确保进程正常结束
sleep 2 #具体时间就看你得webapp在调用shutdown.sh后多久后处于僵死状态
ps -ef | grep ‘tomcat’ | grep -v grep| awk ‘{print $2}’ | xargs kill -9
#删除webapps下的weixin工程
rm -rf /opt/apache-tomcat-7.0.63/webapps/ROOT
#备份
#mv /opt/apache-tomcat-7.0.63/webapps/ROOT.war /opt/apache-tomcat-7.0.63/bak/ROOT.war.date +%Y%m%d%H%M%S.bak
#重启并打印日志
nohup bash /opt/apache-tomcat-7.0.63/bin/catalina.sh start & tailf /opt/apache-tomcat-7.0.63/logs/catalina.out
#!/bin/sh
warName=`ls -t /home/wars/ | head -1`x
echo $warName
\mv -f /home/wars/$warName /usr/local/tomcat8/webapps/xxxx.war
chmod -777 /usr/local/tomcat8/webapps/xxxx.war
特别注意的地方:应用服务器上的tomcat应用目录对上传war包的用户要有所有权,最好是同一用户,不然上传完war包后,因为没有权限导致解压不了。或者也可以修改文件的权限即可
https://blog.csdn.net/u011277123/article/details/77865741
https://www.cnblogs.com/cheng95/p/6542036.html
https://blog.csdn.net/weixin_39483907/article/details/80840948
https://www.jianshu.com/p/b3717d4679b6
https://www.cnblogs.com/YatHo/p/6739814.html
https://www.jianshu.com/p/3c6473755773
https://www.cnblogs.com/linjiqin/p/7776691.html
https://blog.csdn.net/tototuzuoquan/article/details/78568655
https://www.cnblogs.com/Dev0ps/p/9045762.html
http://www.mamicode.com/info-detail-1264849.html
tomcat部署到docker
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/data/paywallet/accounting
#端口(与Dockerfile中的EXPOSE相同)
PORT=8003
#docker 容器中jar目录(与Dockerfile中的CMD的jar目录相同)
DOCKER_PATH=/app
#docker 镜像/容器名字或者jar名字 这里都命名为这个(建议与Dockerfile中的MAINTAINER相同)
SERVER_NAME=paywallet-accounting
LOG_PATH=/data/canteen/app/logs
#容器id
CID=$(docker ps -a | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
DATE=`date +%Y%m%d%H%M`
# 构建docker镜像
function build(){
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
else
echo "不存在$SERVER_NAME镜像,开始构建镜像"
cd $BASE_PATH
docker build -t $SERVER_NAME .
fi
}
# 运行docker容器
function run(){
build
if [ -n "$CID" ]; then
echo "存在$SERVER_NAME容器,CID=$CID,重启docker容器 ..."
docker restart $SERVER_NAME
echo "$SERVER_NAME容器重启完成"
else
echo "不存在$SERVER_NAME容器,docker run创建容器..."
docker run --name $SERVER_NAME -v $BASE_PATH:$DOCKER_PATH -v $LOG_PATH:/logs -d -p $PORT:$PORT $SERVER_NAME
echo "$SERVER_NAME容器创建完成"
fi
}
#入口
run
---------
vim docker.sh
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/usr/ms_backend
# 源jar路径 即jenkins构建后存放的路径(
)
SOURCE_PATH=/var/lib/jenkins/workspace
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=ms_backend
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
echo "最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/ms_backend.jar 迁移至 $BASE_PATH ...."
#把项目从jenkins构建后的目录移动到我们的项目目录下同时重命名下
mv $SOURCE_PATH/$SERVER_NAME/target/ms_backend-0.0.1-SNAPSHOT.jar $BASE_PATH/ms_backend.jar
#修改文件的权限
chmod 777 /usr/ms_backend/ms_backend.jar
echo "迁移完成"
# 构建docker镜像
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
else
echo "不存在$SERVER_NAME镜像,开始构建镜像"
cd $BASE_PATH
docker build -t $SERVER_NAME .
fi
# 运行docker容器
docker rm $SERVER_NAME //删除原来的容器
# --name docker-test 容器的名字为docker-test
# -d 容器后台运行
# -p 3636:3636 指定容器映射的端口和主机对应的端口都为3636
# -v /usr/ms_backend/:/usr/ms_backend/ 将主机的/usr/ms_backend/目录挂载到容器的/usr/ms_backend/ 目录中(不可少每次本地更新jar包重启容器即可,不用重新构建镜像
docker run --name $SERVER_NAME -v $BASE_PATH:$BASE_PATH -d -p 8040:8040 $SERVER_NAME
echo "$SERVER_NAME容器创建完成"
----
# Jenkins机器:编译完成后,build生成一个新版本的镜像,push到远程docker仓库
# Variables
JENKINS_WAR_HOME='/home/jenkins/.jenkins/workspace/godseyeBranchForNov/godseye-container/target'
DOCKERFILE_HOME='/home/jenkins/docker-file/godseye_war'
HARBOR_IP='172.16.206.32'
REPOSITORIES='godseye_war/godseye'
HARBOR_USER='jkzhao'
HARBOR_USER_PASSWD='Wisedu123'
HARBOR_USER_EMAIL='01115004@wisedu.com'
# Copy the newest war to docker-file directory.
\cp -f ${JENKINS_WAR_HOME}/godseye-container-wisedu.war ${DOCKERFILE_HOME}/godseye.war
# Delete image early version.
sudo docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} -e ${HARBOR_USER_EMAIL} ${HARBOR_IP}
IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ];then
sudo docker rmi ${IMAGE_ID}
fi
# Build image.
cd ${DOCKERFILE_HOME}
TAG=`date +%Y%m%d-%H%M%S`
sudo docker build -t ${HARBOR_IP}/${REPOSITORIES}:${TAG} . &>/dev/null
# Push to the harbor registry.
sudo docker push ${HARBOR_IP}/${REPOSITORIES}:${TAG} &>/dev/null
-----
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/data2/dockerFile
# 源jar路径
SOURCE_PATH=/app/soft/docker-config/jenkins/workspace/lfeel
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=lfeel-admin
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
DATE=`date +%Y%m%d%H%M`
# 最新构建代码 移动到项目环境
function transfer(){
echo "最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 迁移至 $BASE_PATH/$SERVER_NAME ...."
cp $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar $BASE_PATH/$SERVER_NAME
cp $SOURCE_PATH/$SERVER_NAME/docker/Dockerfile $BASE_PATH/$SERVER_NAME
echo "迁移完成"
}
# 备份
function backup(){
if [ -f "$BASE_PATH/$SERVER_NAME/$SERVER_NAME.jar" ]; then
echo "$SERVER_NAME.jar 备份..."
cp $BASE_PATH/$SERVER_NAME/$SERVER_NAME.jar $BASE_PATH/$SERVER_NAME/backup/$SERVER_NAME-$DATE.jar
echo "备份 $SERVER_NAME.jar 完成"
else
echo "$BASE_PATH/$SERVER_NAME/$SERVER_NAME.jar不存在,跳过备份"
fi
}
# 构建docker镜像
function build(){
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
else
echo "不存在$SERVER_NAME镜像,开始构建镜像"
cd $BASE_PATH/$SERVER_NAME
docker build -t $SERVER_NAME .
fi
}
# 运行docker容器
function run(){
backup
transfer
build
if [ -n "$CID" ]; then
echo "存在$SERVER_NAME容器,CID=$CID,重启docker容器 ..."
docker restart $SERVER_NAME
echo "$SERVER_NAME容器重启完成"
else
echo "不存在$SERVER_NAME容器,docker run创建容器..."
docker run --name $SERVER_NAME -v /data2/upload:/data2/upload -v /data2/logs/lfeel/lfeel-admin:/data2/logs/lfeel/lfeel-admin -d -p 8080:8080 $SERVER_NAME
echo "$SERVER_NAME容器创建完成"
fi
}
#入口
run
https://blog.csdn.net/w531128724/article/details/90672944
https://www.cnblogs.com/wang-yaz/p/10437377.html
https://www.cnblogs.com/wang-yaz/p/10437377.html
https://www.cnblogs.com/zhaojiankai/p/7828181.html
使用 Jenkins 和 Docker 实现持续集成和自动化部署
docker安装与使用
使用Jenkins pipeline流水线构建docker镜像和发布
https://segmentfault.com/a/1190000007837054
部署vue前端项目
安装 NodeJS插件
npm install -g cnpm --registry=https://registry.npm.taobao.org # 添加镜像
https://nodejs.org/en/download/
# 下载源码包
wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz
tar xvJf ***.tar.xz -C /usr/local
cd /usr/local
ln -s node-v10.15.3/ nodejs
vi /etc/profile 添加以下内容
PATH=$PATH:/usr/local/node-v10.15.3-linux-x64/bin
source /etc/profile
node -v
# Provide Node & npm bin/ folder to PATH
选择系统工具里设置的nodejs安装的配置
# 构建 执行shell 填写node shell内容
npm install --registry https://registry.npm.taobao.org
cnpm install
npm run build
cd dist
rm -rf ****.tar.gz #删除上次打包生成的文件
tar -zcvf ****.tar.gz * #把生成的项目文件打包方便传输到远程服务器 解压后也是里面的文件
-- tar zcvf dist.tar.gz dist/ #解压后会有dist目录
cd ../
# 构建后操作 send build artifacts over ssh
source files dist/***.tar.gz
remove prefix dist
remote directory /vue/packages/
exec commond 如下:
cp /vue/packages/dist/***.tar.gz /usr/local/nginx/packages/
cd /usr/local/nginx/packages/
tar -zxvf ***.tar.gz
rm -rf ***.tar.gz
chmod -R 777 /usr/local/nginx/packages/dist
------------
npm install --registry https://registry.npm.taobao.org
npm run dev
tar zcvf dist.tar.gz dist/
rm -rf /usr/local/nginx/html/dist
cp dist.tar.gz /usr/local/nginx/web_flower/
cd /usr/local/nginx/html/
tar -zxvf dist.tar.gz
rm -rf dist.tar.gz
chmod -R 777 /usr/local/nginx/html/dist
----------
npm install --registry https://registry.npm.taobao.org
npm run test
tar zcvf dist.tar.gz dist/
pwd
rm -rf /usr/local/nginx/web_flower/dist.tar.gz
cp /home/flower/dist/dist.tar.gz /usr/local/nginx/html/
cd /usr/local/nginx/html/
tar -zxvf dist.tar.gz
chmod -R 777 /usr/local/nginx/html/dist/
https://blog.csdn.net/jonsonler/article/details/81317352
https://blog.csdn.net/wangzl1163/article/details/83018630
http://www.cnblogs.com/jingrf/p/10382509.html
npm install -g cnpm --registry=https://registry.npm.taobao.org
首先我们安装webpack-dev-server
在CMD中安装执行npm intall webpack-dev-server -g
在项目目录执行安装依赖命令: npm install --save-dev webpack-dev-server
npm install webpack -g
npm install webpack --save-dev