【转】Nginx反向代理和负载均衡
原文链接: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反向代理和负载均衡的更多相关文章
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...
- nginx反向代理与负载均衡
一:nginx反向代理与负载均衡配置思路与用法 1.nginx反向代理:就是你去相亲时,媒婆就是这里的代理,让媒婆带你去见姑娘 2.nginx负载均衡:就是有很多的媒婆经过商量给你选出最适合你的姑娘, ...
- 谁说前端不需要懂-Nginx反向代理与负载均衡
转:https://juejin.im/post/5b01336af265da0b8a67e5c9 学到老活到老 前端圈一直很新,一直要不停的学习,而且在进入大厂的路上,还要求熟悉一门后台语言等等.用 ...
- [转]Nginx反向代理和负载均衡部署指南
Nginx反向代理和负载均衡部署指南 1. 安装 1) 从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最 ...
- 基于Nginx反向代理及负载均衡
基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是 ...
- 使用nginx反向代理进行负载均衡
在这里简单记录一下,我使用Nginx反向代理进行负载均衡,将请求发送到两台tomcat上. 首先解压两个tomcat,解压Nginx,一台tomcat配置可以不用动,但是我为了更方便只是将它的端口改为 ...
- (二)Nginx反向代理与负载均衡的实现
引言:nginx正向代理与反向代理在上一篇文章中已经谈论过,这里狗尾草主要告诉大家Nginx对前端的小伙伴来说在工作中如何简单的使用. 1.0什么是反向代理 当我们有一个服务器集群,并且服务器集群中的 ...
- Nginx反向代理、负载均衡及日志
Nginx反向代理.负载均衡及日志 1.原理图 2.正向代理与反向代理 (1)代理服务器 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后 ...
- Nginx反向代理与负载均衡应用实践(二)
Nginx反向代理与负载均衡应用实践(二) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...
随机推荐
- Java基础总结--面向对象2
1.存在相关的多个方法就封装在一个类中,方法没调用到特有数据,需要静态化2.假如一个类所有方法都是静态方法,为了保证不被其他创建对象,可以将该类的构造方法私有化3.文档注释javadoc-按照规定注释 ...
- vue.js快速搭建图书管理平台
前 言 上一期简单讲解了vue的基本语法,这一次我们做一个小项目,搭建一个简单的图书管理平台,能够让我们更深刻的理解这门语言的妙用. 1.DEMO样式 首先我们需要搭建一个简单的demo样式 ...
- LeetCode 581. Shortest Unsorted Continuous Subarray (最短无序连续子数组)
Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...
- LeetCode 101. Symmetric Tree (对称树)
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- 关于git常见的一些问题
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 Mark一下,最近用的比较少,担心忘记了. 作为一个程序员,git或者SVN是必备技能,尤其是 ...
- angular控制器、服务和指令三者之间的关系
从总体来看,这三个组件的关系如下所示: 服务负责从远端服务器抓取和存储数据. 基于服务构建的控制器将为angular的作用域层次提供数据和功能. 基于服务和控制器构建的指令将直接与文档对象模型(DOM ...
- Java反射机制能够获取的信息,与应用
一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动 ...
- poj2689Prime Distance(大区间筛素数)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19635 Accepted: 5273 D ...
- Python中编码问题:u'\xe6\x97\xa0\xe5\x90\x8d' 类型的转为utf-8的解决办法
相信小伙伴们遇到过类似这样的问题,python2中各种头疼的转码,类似u'\xe6\x97\xa0\xe5\x90\x8d' 的编码,直接s.decode()是无法解决编码问题.尝试了无数办法,都无法 ...
- Icon font font face
font-face自定义字体,iconfont就是把各种图片做成字体.iconfont优势: 字体文件小,一般20-50kb: 容易编辑和维护,尺寸和颜色可以用css来控制: 透明完全兼容IE6: ...