原文链接:http://www.cnblogs.com/shuoer/p/7820899.html

Nginx反向代理和负载均衡

环境说明

由于我使用的是windows系统,所以我用虚拟机虚拟出来了3台linux系统

  • 虚拟机一:192.168.1.20 (Nginx反向代理和负载均衡服务器,系统kali linux)
  • 虚拟机二:192.168.1.19 (node服务器一,系统ubuntu 17.10)
  • 虚拟机三:192.168.1.22(node服务器二,系统ubuntu 17.10)

环境需要的程序

  • git
  • Node
  • Nginx
  • pm2

首先环境的搭建,由于这三台电脑都是我刚刚虚拟出来的,所以什么环境都没有!

虚拟机一的环境搭建

由于我们的虚拟机一主要是用来做Nginx的反向代理和负载均衡的,那么我们只需要安装Nginx就可以

$ sudo apt-get install nginx -y

ok我们访问下Nginx反向代理服务器是否正常启动

虚拟机二和虚拟机三的环境搭建

我比较喜欢使用nvm去安装node,因为nvm能让我自由的去切换node的版本(两台node服务器环境必须一致哦!)

//安装git工具
$ sudo apt-get install git //从github网站把nvm的源码下载下来放到当前登录用户的.nvm目录下(以后方便我们找)
$ git clone https://github.com/creationix/nvm.git ~/.nvm //让nvm命令在每次打开shell窗口的时候生效
$ echo "source ~/.nvm/nvm.sh" >> ~/.bashrc //让nvm的命令立即生效(关闭shell窗口重新打开也可以生效)
$ source ~/.nvm/nvm.sh //查看nvm是否安装成功和查看当前的node版本信息
$ nvm ls

我们安装下node,此处直接安装stable最新的稳定版本

//这个时间会比较长,稍微有点耐心
$ nvm install stable

安装pm2

$ npm install pm2 -g

编写我们的项目代码

初始化项目创建package.json

$ mkdir nodeapp && cd $_
$ npm init
$ npm install koa --save

创建我们的node主程序入口文件app.js(由于我们只关注与上线发布和负载均衡所以node项目只是一个Hello Koa)

const Koa = require('koa');
const app = new Koa(); app.use(ctx => {
ctx.body = 'Hello Koa';
}); app.listen(3000);

编写pm2的配置文件pm2.json

pm2 是一个带有负载均衡功能的Node应用的进程管理器.
当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载。pm2官网
pm2重用的命令

  • pm2 start app.js : 启动服务,入口文件是app.js。
  • pm2 start app.js -i [n] --name [name] : 启动n个进程,名字命名为name。
  • npm stop [name or id] : 停止服务。
  • npm stop all : 停止所有服务。
  • npm delete [name or id] : 删除服务。
  • npm delete all : 删除所有服务。
  • npm restart [name or id] : 重启服务。
  • npm reload [name or id] : 和rastart功能相同,但是可以实现0s的无缝衔接;如果有nginx的使用经验,可以对比nginx reload指令。
  • pm2 monit : 对服务进行监控。
  • pm2 start **.json : 启动制定配置文件的服务

ok知道pm2怎么用了,我们采用配置文件的方式启动,接下来编写我们的pm2.json配置文件

{
"name" : "nodeApp",
//max_memory_restart: "300M",//设置node单个进程可占用最大的内存,如果内存使用率超过300M,pm2自动重启该进程
"script" : "app.js",//node主入口文件
"out_file" : "logs/out.log",
"error_file" : "logs/error.log",
"instances" : "max",//让node程序占满你的cpu,发挥cpu最大的功效
"exec_mode" : "cluster",//以主进程的方式启动
"watch":true
}

那pm2的配置文件和node程序写好了我们在本地测试下pm2和node程序能不能正常的启动(有点小尴尬,自己本机I7的6700K的CPU居然被这个小程序给占满了~~~)

上线部署到我们的两台node服务器中

其实说到上线部署呢,我们应该有自己的git服务器,所有的代码都应该从git服务器上去拉取,部署呢?应该有一个统一部署的方式通常使用的是jenkins,编写好我们统一部署的shell脚本(在这里体现出来为什么所有的服务器环境必须一致了,方便管理啊),用jenkins一键部署,但是.....本次只是做个小实验,没必要这么大动干戈,所以呢,我们还是手动的上传下代码手动起下服务吧!(下次介绍如何搭建自己的git服务器和jenkins的使用)
我们把项目中的node_moudles文件夹删除然后给项目打个包准备上传服务器,项目结构应该是这样的

我们使用scp命令用于将一个文件从本地上传至服务器,或者从服务器上把一个文件下载至本地
郑重说明:由于我本地用的windows系统,为了演示我把项目文件拽进了另一个linux虚拟机中进行的上传

//scp 本地文件 远程服务器用户名@远程服务器地址:/home/shuoer

//把项目文件上传至虚拟机一
scp nodeapp.zip shuoer@192.168.1.19/home/shuoer //把项目文件上传至虚拟机二
scp nodeapp.zip shuoer@192.168.1.22/home/shuoer

额.....报错了!

额...好像ssh服务没起来,好像也没有安装

//安装ssh
$ sudo apt-get install ssh -y //不管ssh启动没有直接重启ssh
$ sudo service ssh restart

ok,好不容易上传成功了,我们分别进入这两台服务器进行项目解压和安装依赖最后启动服务

为了明显我们在两台服务器上分别让页面输出自己的ip地址

重头戏来了,Nginx的反向代理和负载均衡

进入我们的虚拟机一,配置nginx.conf
温馨提示:

  • nginx的配置文件默认在/etc/nginx/nginx.conf
  • 网站根目录默认在/var/www/html

upstream模块

负载均衡模块用于从”upstream”指令定义的后端主机列表中选取一台主机。nginx先使用负载均衡模块找到一台主机,再使用upstream模块实现与这台主机的交互。

nginx 的两种负载均衡方式

  • 轮训加权(也可以不加权,就是1:1负载)
    我们可以根据两台服务器的性能进行分配权重,比如192.168.1.19服务器比较牛逼,另外一个比较差我们可以这么配置,按照4:1分配,比如5次访问有4次访问的是192.168.1.19服务器

    upstream test {
    server 192.168.1.19:3000 weight=4;
    server 192.168.1.22:3000 weight=1;
    }
  • ip_hash(同一ip会被分配给固定的后端服务器,解决session问题)

    #”ip_hash”只能在upstream {}中使用。这条指令用于通知nginx使用ip hash负载均衡算法。
    #如果没加这条指令,nginx会使用默认的round robin负载均衡模块。
    upstream test {
    ip_hash;
    server 192.168.1.19:3000;
    server 192.168.1.22:3000;
    }

打开nginx.conf我的可能和你们的都不一样(我把所有的注释都删除了,是不是整洁了很多?)
填入如下代码,这里我没有采用负载均衡的任何算法

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf; events {
worker_connections 768;
} http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
#include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;
#用于设置负载的服务器列表
upstream test {
#虚拟机二
server 192.168.1.19:3000;
#虚拟机三
server 192.168.1.22:3000;
}
server {
#监听80端口
listen 80;
location / {
#转发的地址,此处为upstream模块
proxy_pass http://test;
}
}
}

ok,将配置文件保存好之后重启我们的nginx

$ sudo service nginx restart

打开浏览器检验下我们的成果

【转】Nginx反向代理和负载均衡的更多相关文章

  1. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  2. nginx反向代理与负载均衡

    一:nginx反向代理与负载均衡配置思路与用法 1.nginx反向代理:就是你去相亲时,媒婆就是这里的代理,让媒婆带你去见姑娘 2.nginx负载均衡:就是有很多的媒婆经过商量给你选出最适合你的姑娘, ...

  3. 谁说前端不需要懂-Nginx反向代理与负载均衡

    转:https://juejin.im/post/5b01336af265da0b8a67e5c9 学到老活到老 前端圈一直很新,一直要不停的学习,而且在进入大厂的路上,还要求熟悉一门后台语言等等.用 ...

  4. [转]Nginx反向代理和负载均衡部署指南

    Nginx反向代理和负载均衡部署指南   1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最 ...

  5. 基于Nginx反向代理及负载均衡

    基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是 ...

  6. 使用nginx反向代理进行负载均衡

    在这里简单记录一下,我使用Nginx反向代理进行负载均衡,将请求发送到两台tomcat上. 首先解压两个tomcat,解压Nginx,一台tomcat配置可以不用动,但是我为了更方便只是将它的端口改为 ...

  7. (二)Nginx反向代理与负载均衡的实现

    引言:nginx正向代理与反向代理在上一篇文章中已经谈论过,这里狗尾草主要告诉大家Nginx对前端的小伙伴来说在工作中如何简单的使用. 1.0什么是反向代理 当我们有一个服务器集群,并且服务器集群中的 ...

  8. Nginx反向代理、负载均衡及日志

    Nginx反向代理.负载均衡及日志 1.原理图   2.正向代理与反向代理 (1)代理服务器 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后 ...

  9. Nginx反向代理与负载均衡应用实践(二)

    Nginx反向代理与负载均衡应用实践(二) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...

随机推荐

  1. Java基础总结--面向对象2

    1.存在相关的多个方法就封装在一个类中,方法没调用到特有数据,需要静态化2.假如一个类所有方法都是静态方法,为了保证不被其他创建对象,可以将该类的构造方法私有化3.文档注释javadoc-按照规定注释 ...

  2. vue.js快速搭建图书管理平台

      前  言 上一期简单讲解了vue的基本语法,这一次我们做一个小项目,搭建一个简单的图书管理平台,能够让我们更深刻的理解这门语言的妙用.   1.DEMO样式 首先我们需要搭建一个简单的demo样式 ...

  3. LeetCode 581. Shortest Unsorted Continuous Subarray (最短无序连续子数组)

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  4. LeetCode 101. Symmetric Tree (对称树)

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  5. 关于git常见的一些问题

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 Mark一下,最近用的比较少,担心忘记了. 作为一个程序员,git或者SVN是必备技能,尤其是 ...

  6. angular控制器、服务和指令三者之间的关系

    从总体来看,这三个组件的关系如下所示: 服务负责从远端服务器抓取和存储数据. 基于服务构建的控制器将为angular的作用域层次提供数据和功能. 基于服务和控制器构建的指令将直接与文档对象模型(DOM ...

  7. Java反射机制能够获取的信息,与应用

    一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动 ...

  8. poj2689Prime Distance(大区间筛素数)

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19635   Accepted: 5273 D ...

  9. Python中编码问题:u'\xe6\x97\xa0\xe5\x90\x8d' 类型的转为utf-8的解决办法

    相信小伙伴们遇到过类似这样的问题,python2中各种头疼的转码,类似u'\xe6\x97\xa0\xe5\x90\x8d' 的编码,直接s.decode()是无法解决编码问题.尝试了无数办法,都无法 ...

  10. Icon font font face

    font-face自定义字体,iconfont就是把各种图片做成字体.iconfont优势: 字体文件小,一般20-50kb: 容易编辑和维护,尺寸和颜色可以用css来控制: 透明完全兼容IE6:   ...