记录下在linux配置mongodb+nginx+node的过程

mongodb:

1、下载mongodb3.4版本,地址: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.5.tgz

2、通过Xftp把文件放到已经创建好的目录里面。

3、使用tar xxx 命令,将压缩解压到当前的工作路径。顺便cd到解压后的文件夹,把所有文件的移到上一层,并删掉这个文件夹。现在目录如下

未分类

4、在bin的外层级新建一个文件夹树:data/db,以后这个db就是放数据的地方了。

5、进入到bin,使用mongod –dbpath ../data/db,就可以启动mongodb,默认端口是27017。

6、访问curl localhost:27017,看是否有这段信息,有则代表已成功启动。

未分类

7 如果bin文件夹没有index.html,可以自己建一个,开启成功后会打开这个index。

nginx:

1、先使用命令 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装nginx的安装yum源。

2、安装成功后/etc/yum.repos.d会有nginx.repo文件。

3、使用yum install nginx -y,安装nginx,默认地址为/etc/nginx。我安装完后是没有html文件夹的,可以自己添加一个html文件夹,里面放一个index.html。

4、使用cd进nginx文件夹。使用nginx即可开启nginx服务。

5、如果想修改nginx.conf,修改完后使用nginx -s -reload即可重启nginx服务。

此时可以在window界面使用浏览器直接访问地址了。如,我的centos的ip是123.456.7.89,并在nginx上监听了80端口,如下:

listen       80;
server_name  localhost;
location / {
        proxy_pass  http://localhost:27017;  #被代理的服务器的域名
    proxy_redirect     off;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

6、打开浏览器,地址栏输入123.456.7.89,成功后提示

未分类

如果提示拒绝访问,可能是centos并没有开启80端口。

使用如下命令:

## 开放指定端口(永久)
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
## 查看已开放的端口
firewall-cmd --list-ports

未分类

则是再重复步骤6即可。

nodejs:

1、使用命令安装源

V8.x: 

#curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
V7.x:

#curl --silent --location https://rpm.nodesource.com/setup_7.x | bash -
V6.x:

#curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
V5.x:

#curl --silent --location https://rpm.nodesource.com/setup_5.x | bash -

2、 yum install -y nodejs

k8s master 节点和 node 节点 启动分析

Master 节点

  • coredns 2 个 ,对应的pause 容器 2 个
  • flannel 1 个 ,对应的pause 容器 1 个
  • proxy 1 个 ,对应的pause 容器 1 个
  • scheduler 1 个 ,对应的pause 容器 1 个
  • controller 1 个 ,对应的pause 容器 1 个
  • apiserver 1 个 ,对应的pause 容器 1 个
  • etcd 1 个 ,对应的pause 容器 1 个

未分类

master 节点 端口监听情况

kubelet TCP:10248
kubelet TCP: 42006
TCP6 10250

kube-proxy TCP 10249
TCP6 10256

kube-scheduler TCP: 10251

etcd TCP: 2379
etcd TCP: 2380

kube-controller TCP: 10252
TCP6 10257

kube-apiserver TCP6:6443

未分类

Node 节点

默认启动flannel ,proxy两个容器和它们对应的pause 容器,总共是四个

未分类

Node 节点 端口监听情况

kubelet TCP 41895
TCP 10248
TCP6 10250

kube-proxy TCP 10249
TCP6 10256

未分类

GitLab+Jenkins+Rsync+PM2实现Node项目的持续集成与自动部署

前言

最原始的软件开发流程是,在本地搭建好环境,进行开发测试,然后去服务器上搭建环境,手动上传代码,运行测试,然后启动服务。实际上,近些年来出现了很多的工具,使得这些步骤可以自动化,大大降低人工出错的概率,提高生产效率。下面,我就把GitLab+Jenkins+Rsync+PM2实现的Node项目的持续集成以及自动部署的实验过程记录下来。

搭建环境

需要两台服务器作为演示,A主要进行代码管理、构建和分发,B主要运行实际应用。我这边系统使用的是Debian系的。

服务器A

GitLab

准备工作:

apt-get update
apt-get install curl openssh-server ca-certificates postfix

安装postfix的时候,选internet site,之后的 system mail name 填写你的服务器的IP地址。

准备好后开始安装:

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
apt-get install gitlab-ee

如果 apt 下载很慢可以手动下载 https://packages.gitlab.com/gitlab/gitlab-ee/packages/ubuntu/trusty/gitlab-ee_10.2.2-ee.0_amd64.deb 然后用 dpkg -i 的方式安装。装了这个过后 NGINX, Postgres, Redis 就都装好了。

配置:

GitLab默认会占用80、8080和9090端口,Jenkins默认也会使用8080端口,所以将GitLab的默认端口为60200、60201、60202(你可以随意定制)

vim /etc/gitlab/gitlab.rb 修改

external_url 'http://<你的服务器ip>:60200'
unicorn['port'] = 60201
prometheus['listen_address'] = 'localhost:60202'

注意不能有多余空格。gitlab-ctl reconfigure生效配置,gitlab-ctl start启动。
如果要想发邮件的话还要配置第三方邮件 vim /etc/gitlab/gitlab.rb

gitlab_rails['smtp_enable'] = true 
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "***#**"
gitlab_rails['smtp_password'] = "**************"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = :login 
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = "***#**"
user["git_user_email"] = "***#**"

然后生效重启,打开http://<你的服务器IP>:60200访问,

Jenkins

准备工作:

wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.tar.gz"
tar xzvf jdk-8u151-linux-x64.tar.gz -C /usr/local/  
vim /etc/profile #(加入环境变量)
    export JAVA_HOME=/usr/local/jdk1.8.0_151
    export PATH=$JAVA_HOME/bin:$PATH

退出,source /etc/profile 生效,用 java -version 验证是否装好java。

开始安装:

curl -O http://mirrors.jenkins.io/war-stable/latest/jenkins.war 下载Jenkins,
nohup java -jar jenkins.war –httpPort=60203 & 后台启动并指定端口。
至此,Jenkins安装成功,可以用浏览器打开 http://<你的服务器ip>:60203
然后安装必要的插件(会提示你),依次点击 “系统管理” “管理插件”。
切换到“可选插件”,分别搜索“GitLab Plugin”和“Git Plugin”,然后点击“直接安装”。如果在“可选插件”里没有搜到,可能自带安装了

Node

apt-get update
apt-get install -y build-essential curl
curl -sL https://deb.nodesource.com/setup_8.x | bash 
apt-get install -y nodejs
node -v
v8.9.2
npm -v
5.5.1

Rsync

这个服务器主要使用Rsync来发布文件,所以不需要特殊配置,一般Linux都默认安装了,如果没有,则使用 apt-get install rsync。然后配置Rsync密码

echo "123" >> /etc/rsync.password
chmod -R 600 /etc/rsync.password

服务器B

Node

如A

PM2

npm install -g pm2
pm2 -v
2.8.0

Rsync

为了安全性不要直接使用ssh账号密码或者公钥私钥,而是构建Rsync服务。vim /etc/rsyncd.conf,修改配置,下面的配置只是一个示例,生产环境还要更安全的策略。

##rsyncd.conf start##
uid = root
gid = root
use chroot = yes
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = * 
hosts deny =10.0.8.9
auth users = backuser
secrets file = /etc/rsync.password
[webapp]
path = /var/webapp/

上面的的路径path不存在则需要创建 mkdir /var/webapp
echo “backuser:123” >> /etc/rsync.password 添加账号和密码,密码要与客户端(A)一直
chmod -R 600 /etc/rsync.password 修改权限
rsync –daemon 以守护进程方式来启动rsync服务
chkconfig rsync on将此服务设置成为开机自启动

应用开发

用express开发一个 hello world 作为演示,在本地工程目录

npm init #(按照提示输入参数)
npm install express --save  #(安装express)

然后创建app.js

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

node app.js 运行,然后http://localhost:3000/ 会得到 hello world

新建app.json

{
    "apps" : [
        {
            "name"        : "app",
            "script"      : "app.js",
            "log_date_format"  : "YYYY-MM-DD HH:mm:SS",
            "env": {
                "NODE_ENV": "production"
            },
            "watch" : [
                "app.js",
                "router",
                "util"
            ],
            "ignore_watch" : [
                "logs",
                "node_modules",
                "test"
            ]
        }
    ]
}

将代码上传至服务器B,然后 pm2 start app.json 运行 即可在浏览器访问 http://B-ip:3000 得到 hello world

持续集成和自动部署

配置 Gitlab

首次登陆的密码是会提示你去服务器找,用户是root,然后修改你的用户账号信息,添加你自己常用的电脑上的git公钥。
创建一个新项目 webapp ,创建好过后项目会显示该项目对应的用户信息(会提示你修改)

Git global setup

git config --global user.name "MageekChiu"
git config --global user.email "mageekchiu@mail.**.cn"

在本地项目目录下,新建 .gitignore 文件(window 要用 命令行 rename才可以)

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

node_modules/

然后执行

git init
git remote add origin git@A-ip:root/webapp.git
git add .
git commit -m "Initial commit"
git push -u origin master

即可提交服务器仓库,以后每次修改都要

git add .
git commit -m "修改备注"

配置 jenkins

首先配置GitLab插件:

打开GitLab,点击“setting”——“Account”,复制“Private token”,或者应该首先生成personal access token。
打开Jenkins,点击“系统管理”——“系统设置”,点击“配置”下拉框,点击“Gitlab”选项配置GitLab
Connection Name 随便,如 gitlab,“Git Host URL”填GitLab的访问地址,
然后Credentials点“Add”——“jenkins”,在弹出框里,“kind”选择“GitLab API Token”,将先前复制的“Private token”粘贴到“API token”输入框中,然后点击“Add”,添加后,Credentials选择刚刚新建的gitlab,
最后点击“test connection”,看到“Success”就成功了。然后点击页面底下的“apply”,再点击“save”

然后配置Git插件:

需要注意的是装Jenkins的机器上一定要装git: apt-get install git 这样Jenkins才能去 gitlab 拉取文件。
打开Jenkins,点击“系统管理”——“系统设置”,点击“配置”下拉框,选择“Git plugin”选项,设置Git插件的全局配置,填入上面的 global setting 如 global user.name等,然后点击“apply”——“save”

成访问Gitlab的ssh秘钥:

打开GitLab,点击右上角的“setting”—— SSH Keys,就可以进入到添加界面。
在jenkins所在服务器上生成密钥
ssh-keygen -t rsa -C “root@<你服务器的ip地址>” -b 4096
ssh-keygen -t rsa -C “root@” -b 4096
全部按 Enter 使用默认值,这会生成一对公钥和私钥。打开公钥复制到gitlab的添加界面,然后点击“add key”,并记住私钥的存放路径。

创建一个Jenkins Job:

直接点新建,“item name”可以随便起,然后点击“构建一个自由风格的软件项目”,点击“OK”,至此,创建一个Job成功了。然后配置这个job,选择“源码管理”,选择“Git”,然后去GitLab中复制项目地址,粘贴到“Repository URL”,然后点击“credentials”后面的“Add”按钮

在弹出页面里面:
● Kind 选择 SSH Username with private key
● Username 填 root
● PrivateKey 选择 From a file on jenkins master ,然后将服务器的 私钥的存放路径(/root/.ssh/id_rsa ) 粘贴进去
然后点击“Add”,在“credentials”里选择我们刚刚创建的认证方式。如果没报错,说明成功了,点击页面底部的“apply”。如果出错了,会在“Repository URL”和“Credentials”之间显示红色的错误信息。

选择 构建触发器:
选择 Build when a change is pushed to GitLab. 记住这个 GitLab CI Service URL ,点击高级
Secret token 那一行下面 点击 generate。记住这个token
选择 构建:
选择 execute shell

npm install 
WEB_SERVER_IP=B的ip
PROJECT=webapp/
rsync -arqz --delete-before $WORKSPACE/ $WEB_SERVER_IP::$PROJECT --exclude ".git" --password-file=/etc/rsync.password 

这一段代码的主要目的是构建,并分发代码,如果有多个应用服务器就要分发到多个服务器上。

配置gitab的webhook:

点击webapp 项目下面的setting的integrations 输入刚才的 GitLab CI Service URL 和 Secret Token
然后点击add webhook ,再测试一下选择 push events 如果显示Hook executed successfully: HTTP 200 即成功,然后在jenkins里面查看是有一次构建记录的。

这样jenkins就会在代码发生变化时自动拉取代码到本地,构建,然后用rsync分发给各个应用服务器,结合PM2的watch功能实现自动发现代码更新并重启的功能,达到自动部署的目的

最终效果测试

修改代码,把hello world改为hello gitlab+enkins然后 add、commit、push 。在A上面gitlab有提交记录,jenkins有构建记录,在B上面用 pm2 ls 发现项目是restart了,浏览器查看也变成hello gitlab+enkins 了。
尝试成功!
虽然这个配置比较麻烦,但是持续集成和自动部署的带来的好处是更大的:代码有版本管理,可以快速迭代、快速回滚,同时保持高质量、自动多机部署防止人工错误,每次构建都有记录,构建幂等……

后记

这个过程已经比较自动化了,但是还是有太多的环境搭建过程,比如webapp一般都会用到mysql、redis、MongoDB等等,一个更自动化的过程应该引入docker,这方面以后有机会再尝试。

node+mongodb建站攻略

如何利用node+mongodb来快速搭建一个电影网站?

一、后端部分

整个网站的后端是由node.js来驱动的,所以在后端需要安装node.js,以及在这个基础之上的框架express,它能够帮助我快速的搭建web应用,然后数据库选用的mongodb,以及对mongodb快速建模的工具mongoose。后端的模板引擎用的是jade关于时间个日期的格式化选用的是Moment.js底下的这四个模块都是通过npm安装的,npm是node自带的。

未分类

二、前端部分

前端部分会选用jQuery的类库以及boostrap的样式的框架,它们都是网站前端的静态资源,网站前端的静态资源都存在一个版本的依赖和版本的管理,所以我们需要通过Bower来安装它们,Bower本身也是一个npm模块,所以它也需要现有npm的安装方。

未分类

三、本地的开发环境

本地的开发环境后面的网站会用到less的编译,样式的合并,语法的检查,包括前后端单元测试的实现,以及服务的自动重启,这几个任务都是通过grunt来集成。

未分类

四、实战步骤

选择完这些框架以后,就可以来开始实战,项目开发分为九个步骤

未分类

1、需求分析:看一下开发一共有多少个页面,页面里都有什么样的内容和需求以及什么样的交互,这样做到心里有数。

2、项目依赖初始化:然后对项目所依赖的模块进行一个安装和 初始目录的创建。

3、入口文件编码:在后端开始创建一个入口文件并且进行编码。

4、创建试图:编码以后就可以来创建几个重要页面的视图了,也就是模板。

5、测试前端流程 :来跑通前后端的流程,也就是说,从浏览器发起一个请求到后端,后端接收到之后,返回一段数据。

6、样式开发,伪造模板数据  :跑通前后端之后,就可以对页面进行一个样式的开发和一些HTML的dom结构的填充,同时要伪造一些模板数据。

7、设计数据库模型:这时候页面都有了,我们开始基于页面里面的内容同时来设计数据库的模型。

8、开发后端逻辑:然后来开发后端的逻辑,到这一步为止,前后端的逻辑都已经实现掉了。

9、配置依赖文件,网站开发结束:对前端静态资源版本和后端模块版本进行一个配置文件的生成,然后整个网站就开发结束了。

五、详细开发

然后来看一下网站的页面 ,左边是首页,有一个电影列表,把存在数据库里面的电影全部都取出来展现在这里,每一个海报都有电影名称和播放按钮,点击海报或者播放按钮就会跳转到右边这个页面,也就是详情页,详情页就是这部电影所针对的更加详细的介绍字段之类的东西。

未分类

后台录入页:其实这里就是一个表单,在后端能够填写一些和电影有关的数据,点击最底下的录入按钮的时候,会将这张表上的数据提交到后台,后台就会存到数据库,也就是mongodb里面,右边是列表页,当存入一定数据的电影的时候,我们可以进行批量的管理,比如更新或者删除。

未分类

docker部署node应用

环境:centos7

docker的安装以及一些设置

安装docker

     yum install docker

启动docker服务

     systemctl start docker.service

设置开机启动

     systemctl enable docker.service

pull下nodejs镜像

说是docker hub 慢,就找到了一个国内的镜像去下载

     docker pull hub.c.163.com/nce2/nodejs:0.12.2

未分类

查看镜像

     docker images

未分类

创建node应用

然后在工作目录下创建package.json文件

     vi package.json

写入内容
未分类

创建server.js,也就是我们node应用的主文件

     vi server.js

写点内容
未分类

创建Dockerfile文件

在项目代码更目录创建Dockerfile文件

     vi Dockerfile

写入以下内容
未分类
下面简单解释下Dockerfile文件

FROM hub.c.163.com/nce2/nodejs:0.12.2

FROM是构建镜像的基础镜像源,后面的一串是我们刚才pull下来的那个Image,如果本地没有Docker,会自己pull镜像的。

#Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service

第一句RUN用于在Image里创建一个文件夹,将会用于保存我们的代码。
第二句WORKDIR是将我们创建的文件夹作为工作目录。

# Bundle app Source
COPY . /home/Service
RUN npm install

第一句的COPY是把本机当前目录下的所有文件拷贝到Image的 /home/Service目录下。
第二句的RUN是用npm 安装我们的node应用中的所有依赖包。

EXPOSE 8888

我们的node应用监听的是8888端口,我们可以把这个端口暴露给主机。这样我们就可以从外网访问我们的应用了。

CMD ["npm" , "start"]

用来启动我们的node应用。

构建Image

在我们的Dockerfile所在的目录下执行构建命令

docker build -t mynodeapp .

别忘了最后那个点,不久我们会看到成功构建的信息。
未分类

然后我们去查看一下我们构建的镜像

docker images

未分类

运行构建的Image

docker run -d -p 8888:8888 50550c

-d表示容器会在后台运行,-p表示端口映射,把本机的8888端口映射到container的8888端口,这样外网就可以通过本机访问我们的应用,
后面的50550c是我们Image的ID,没写后面的是因为根据这几个就能定位出来了。

竟然报错了,也不能访问8888端口。想了一下,应该是镜像的问题。
就跑去dochub找了官方镜像,修改Dockerfile里的基础镜像

FROM node:4-onbuild

然后再次构建我们的应用

docker build -t nodeapp .

然后开始从官网下载镜像,确实特别慢..等了好久才下载完1个。貌似需要下载9个文件..
在漫长的等待过程中。。。
未分类

算了,放弃。。找找国内镜像试试吧~~

然后去daocloud注册了帐号,在这拉镜像吧

未分类
很快,镜像pull下来了。然后查看下现在的镜像。

未分类
现在我们去改下Dockerfile的基础镜像吧。

FROM daocloud.io/library/node

现在我们再来构建下镜像试试

docker build -t nodeapp .

看到了构建成功的信息,接着查看一下imges

然后启动:

docker run -d -p 8888:8888 7b784

果然出现了问题… 启动不成功,最后才知道,镜像和Dockerfile都是对应的,不对应就可能会出现上面的所有问题。(切记)

最近还是选择了官网的镜像,等待了40分钟左右,全部pull下来了,开始干活~~

修改Dockerfile文件如下:

FROM node:4-onbuild
# replace this with your application's default port
EXPOSE 8888

重新构建:

docker build -t my-node-apps .

未分类

启动docker镜像:

docker run -d -p 8888:8888 8b

然后查看下container

docker ps

未分类

然后用浏览器访问下8888端口:

未分类
完美!!!!!!!!!这次终于成功了~

然后去删除没用的images和container…

若要删除所有的image, 使用命令:

docker rmi  $( docker  images -q )

删除container

docker rm id

总结

因为镜像的事情走了不少弯路,浪费了很多的时间,所以最好还是去官网下需要的东西,然后看官方给的文档,英文的也要尽力去看。
今后还要去做学习一些images的管理,container的管理,以及应用日志处理相关的东西。