Nginx-从零开始使用nginx实现反向代理及负载均衡
文章目录
- 环境说明
- 安装Nginx
- 安装必须的依赖库 3个
- 源码安装
- yum安装
- 安装nginx
- 启动Nginx
- 常用操作命令
- 使用非root用户启动nginx
- 搭建应用
- Nginx 做反向代理 + 负载均衡
- upstream中使用的负载均衡算法
- weight(权重)
- ip_hash(访问ip)
- fair(需要下载upstream_fair模块)
- url_hash(需要使用Nginx的hash软件包)
- upstream模块中可设置的状态值
- 验证反向代理和负载均衡
- 使用keepalived实现Nginx的高可用
- 安装keepalived
- TODO
环境说明
- OS: Centos6
- Nginx:nginx-1.14.2
安装Nginx
安装必须的依赖库 3个
- gzip 模块需要 zlib 库 http://www.zlib.net/ (上不去了。。。可以从别的地方下载 ,比如 https://fossies.org/linux/misc/zlib-1.2.11.tar.gz/ )
- rewrite 模块需要 pcre http://www.pcre.org/
- ssl 功能需要 openssl http://www.openssl.org/
先约定统一安装到/usr/local
Centos上安装依赖无非就是两种形式
- 源码安装
- rpm包安装 (可单独rpm安装,自行管理依赖,或者使用yum安装)
下面分别来说下
为了方便使用,我上传到了CSDN上,https://download.csdn.net/download/yangshangwei/11015243 (积分真不是我设置的。。。自动生成的。。。这个有点尴尬)
源码安装
以下操作均为root用户
pcre
$ cd /usr/local/
$ wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.36/pcre-8.36.tar.gz
$ tar -zxvf pcre-8.36.tar.gz
$ cd pcre-8.36
$ ./configure
$ make
$ make install
$ make test
zlib
$ cd /usr/local/
# 网站无法访问了,请下载后上传到/usr/local再解压
# 可以从 https://fossies.org/linux/misc/zlib-1.2.11.tar.gz/ 下载
$ --wget http://zlib.net/zlib-1.2.11.tar.gz
$ tar -zxvf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure
$ make
$ make install
$ make test
openssl
$ cd /usr/local/
$ wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
$ tar -zxvf openssl-1.0.1j.tar.gz
$ cd openssl-1.0.1j
$ ./config
$ make
$ make install
$ make test
yum安装
$yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-deve
同样是可行的,我用这种方式在 192.168.31.56 安装的nginx ,OK。
安装nginx
$ cd /usr/local/
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar -zxvf nginx-1.8.0.tar.gz
$ cd nginx-1.8.0
$ ./configure --prefix=/usr/local/nginx
$ make
$ make install
启动Nginx
验证下启动文件是否正常
[root@artisan sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
启动nginx
[root@artisan sbin]# /usr/local/nginx/sbin/nginx
如果启动的时候碰到了如下错误
./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
参考: https://geekflare.com/nginx-error-while-loading-shared-libraries-libpcre-so-1/
执行: export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
再次启动nginx
[root@artisan sbin]# /usr/local/nginx/sbin/nginx
[root@artisan sbin]#
默认80端口,打开浏览器访问ip地址:
安装并启动成功。
常用操作命令
重启:
$ /usr/local/nginx/sbin/nginx -s reload停止:
$ /usr/local/nginx/sbin/nginx -s stop测试配置文件是否正常:
$ /usr/local/nginx/sbin/nginx -t强制关闭:
$ pkill nginx
使用非root用户启动nginx
比如我新建了个nginx用户,用户组也是nginx,后面想用nginx用户来启动nginx.
那么给nginx的安装目录使用chown更改下目录的所有者及用户组即可。
[root@artisan sbin]# chown -R nginx:nginx /usr/local/ngin
需要注意的是,如果使用了nginx普通用户启动,那么80端口是启动不了的,报错如下,需要将nginx的端口调整为1024以上的端口。
[nginx@artisan sbin]$ ./nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
修改 /usr/local/nginx/conf/nginx.conf中的listen对应的端口为8088
访问 http://192.168.31.66:8088/
搭建应用
Controller写个方法,供外部访问用作测试。
应用程序的启动,我下面是通过启动脚本指定端口号来进行启动的,当然了也可以写几个配置文件,在启动脚本中指定特定的配置文件也行,简单起见就直接指定端口吧
Nginx 做反向代理 + 负载均衡
nginx.conf配置如下,可简可繁,下面这个是比较简单的配置
切了个环境,换了IP地址
worker_processes 1; #启动进程,通常设置成和cpu的数量相等#全局错误日志及PID文件
error_log /usr/local/nginx/logs/error.log;
error_log /usr/local/nginx/logs/error.log notice;
error_log /usr/local/nginx/logs/error.log info;
pid /usr/local/nginx/logs/nginx.pid;# 工作模式及连接数上线
events
{use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能worker_connections 1024; #单个后台worker process进程的最大并发链接数
}#设定http服务器,反向代理+负载均衡
http
{#添加artisanPool列表 ,对应后台的serverupstream artisanPool{#server tomcat地址:端口号 weight表示权值,权值越大,被分配的几率越大; server 10.72.38.235:8080 weight=10 max_fails=3 fail_timeout=30s;server 10.72.38.235:8081 weight=10 max_fails=3 fail_timeout=30s;}#监听端口和域名server {listen 80; # 如果配置了这个,并且在hosts中配置了ip和域名的对应关系 # 就可以使用http://artisan/serverInfo访问 (windows的hosts文件配置了 10.72.38.235 artisan)# 可不配server_name artisan; #默认请求设置location / {proxy_pass http://artisanPool; #转向artisanPool处理}}
}
nginx配置tomcat8及以上的版本时反向代理upstream的名字 不能包含_ ,比如artisan_Pool 就会抛出如上异常
upstream中使用的负载均衡算法
upstream按照默认轮训(round-robin)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
虽然这种方式简便,但缺点也很明显:可靠性低和负载分配不均衡,比较适合适用于图片服务器集群和纯静态页面服务器集群。
除此之外,upstream支持的分配策略
weight(权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如下所示,8081节点的访问比率要比8080节点的访问比率高一倍。
upstream artisanPool{server 10.72.38.235:8080 weight=5;server 10.72.38.235:8081 weight=10;}
ip_hash(访问ip)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream artisanPool{ip_hash;server 10.72.38.235:8080;server 10.72.38.235:8080;}
fair(需要下载upstream_fair模块)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
upstream artisanPool{server 10.72.38.235:8080;server 10.72.38.235:8080;fair;}
url_hash(需要使用Nginx的hash软件包)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream artisanPool{server 10.72.38.235:7777;server 10.72.38.235:8888;hash $request_uri;hash_method crc32;}
upstream模块中可设置的状态值
upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:
down 表示单前的server暂时不参与负载.
weight 默认为1.weight越大,负载的权重就越大。
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
fail_timeout : max_fails次失败后,暂停的时间。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
举例
#定义负载均衡设备的Ip及设备状态
upstream artisanPool{ ip_hash;server 10.72.38.235:9090 down;server 10.72.38.235:8080 weight=2;server 10.72.38.235:6060;server 10.72.38.235:7070 backup;}
验证反向代理和负载均衡
将artisan4Nginx 使用maven打包,上传到服务器上,使用如下命令启动两个进程
java -jar artisan4Nginx-0.0.1-SNAPSHOT.jar --server.port=8080 --logging.file=8080.log > /root/8080.log & tail -f /root/8080.log
java -jar artisan4Nginx-0.0.1-SNAPSHOT.jar --server.port=8081 --logging.file=8081.log > /root/8081.log & tail -f /root/8081.log
启动nginx后,访问 http://10.72.38.235/serverInfo
如果hosts文件配置了 10.72.38.235 artisan ,那么也可以使用 http://artisan/serverInfo 访问
观察两个进程的日志,因为在nginx中的策略
server 10.72.38.235:8080 weight=10 max_fails=3 fail_timeout=30s;server 10.72.38.235:8081 weight=10 max_fails=3 fail_timeout=30s;
weight=10相等,所以1 3 5… 次是落在8080上,2 4 6 …次请求是落在8081上
说明反向代理+负载均衡是OK的。
使用keepalived实现Nginx的高可用
安装keepalived
下载地址: http://www.keepalived.org/download.html
TODO
Nginx-从零开始使用nginx实现反向代理及负载均衡相关推荐
- 学完Nginx/OpenResty详解,反向代理与负载均衡配置,能涨薪多少
反向代理与负载均衡配置 接下来介绍Nginx的重要功能:反向代理+负载均衡.单体Nginx的性能虽然不错,但也是有瓶颈的.打个比方:用户请求发起一个请求,网站显示的图片量比较大,如果这个时候有大量用户 ...
- nginx配置域名转发、反向代理、负载均衡
[Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...
- Nginx整合tomcat,实现反向代理和负载均衡
1.Nginx与Tomcat整合,通过Nginx反向代理Tomcat. Nginx安装路径为:/usr/local//nginx 首先切换路径到:/usr/local//nginx/conf通过命令 ...
- nginx反向代理相关 负载均衡及优化
一.反向代理 1.1.upstream简介 nginx的upstream可以同时实现反向代理和负载均衡,目前upstream支持5种方式的分配 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端 ...
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
本站点停止更新,请访问:blog.coocap.com 相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tom ...
- 懂点 Nginx 反向代理与负载均衡,是面试加分项没有之一
点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 学到老活到老 前端圈一直很新,一直要不停的学习,而且在进入大厂的路上,还要求熟悉一门后台语言等等 ...
- 使用Nginx实现服务器反向代理和负载均衡
前言 同事总问我Nginx做反向代理负载均衡的问题,因此特意留下一篇扫盲贴! 直接部署服务器的风险 假设,我开发了一个网站,然后买了一台Web服务器和一台数据库服务器,直接部署到公共网络上.如下图,网 ...
- Nginx之反向代理与负载均衡实现动静分离实战
Nginx之反向代理与负载均衡实现动静分离实战 什么是反向代理与负载均衡 Nginx仅仅作为Nginx proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果. 负载均衡指的是 ...
- nginx的反向代理及负载均衡
查看内核版本号: uname -r 查看Linux发行版本 :cat /etc/issue 或cat /etc/release 查看bash 版本 : bash --version <?xm ...
- nginx的反向代理以及负载均衡模块的使用
内容: 1.何为代理 2.nginx的反向代理模块以及使用 3.nginx的负载均衡模块以及使用 一.何为代理 代理,由字面意思可以理解为代为服务的是意思. 代理服务技术是一门很古老的技术,是在互联网 ...
最新文章
- Vue状态管理之Vuex
- 不借助vue-cli,自行构建一个vue项目
- 四则运算(可怜的二柱子)2
- 为什么CRM WebClient UI每次点了回车都会触发到后台的roundtrip
- 【开源项目】向Nginx-RTMP服务器推流
- 基于 HTML5 WebGL 的 3D 场景中的灯光效果
- 【mysql】扩展-变量_存储过程_函数
- 【机器人学习】机器人轨迹规划A※算法代码
- ISO50001认证咨询,企业申请ISO50001认证前要先进行哪些初始能源评审
- JS导出Excel文件的方式
- android控制wifi,基于 Android 手机操作和控制的 Wifi 小车程序设计
- linux 命令无法Tab补全,命令参数无法补全
- 使用md5进行密码的加密和验证
- 查询是否有公网IP的方法
- dmesg的详细用法
- 基于Python的Flask框架实现的寻宝通关游戏 课程论文+项目源码
- 面试题(19)今日头条Java后台研发三面题目
- maven项目搭建常见故障
- python异常处理结构的关键字_以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( )...
- ubuntu系统下安卓源码的下载
热门文章
- python long_python long函数是什么?如何使用?
- c++ 纯虚函数和抽象类那些事(三)
- C++ this指针详解(精辟)
- ORB_SLAM安装问题error: ‘std::chrono::monotonic_clock’ has not been declared
- 循环神经网络的数据预处理
- python读取连接数据库文件_python 读取配置文件 pandas连接数据库
- translucent可以设置中文吗_物联卡可以作无线网卡使用吗?物联卡笔记本上网设置流程...
- 两个多精度十进制数加法程序设计_翁恺老师的程序设计入门——C语言 第四周习题...
- 54. Leetcode 113. 路径总和 II (二叉树-二叉树路径和)
- Leetcode 125. 验证回文串 (每日一题 20210816)