前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx-从零开始使用nginx实现反向代理及负载均衡

Nginx-从零开始使用nginx实现反向代理及负载均衡

作者头像
小小工匠
发布2021-08-17 16:01:18
4350
发布2021-08-17 16:01:18
举报
文章被收录于专栏:小工匠聊架构

文章目录

环境说明

  • OS: Centos6
  • Nginx:nginx-1.14.2

安装Nginx

安装必须的依赖库 3个

  1. gzip 模块需要 zlib 库 http://www.zlib.net/ (上不去了。。。可以从别的地方下载 ,比如 https://fossies.org/linux/misc/zlib-1.2.11.tar.gz/ )
  2. rewrite 模块需要 pcre http://www.pcre.org/
  3. ssl 功能需要 openssl http://www.openssl.org/

先约定统一安装到/usr/local

Centos上安装依赖无非就是两种形式

  • 源码安装
  • rpm包安装 (可单独rpm安装,自行管理依赖,或者使用yum安装)

下面分别来说下

为了方便使用,我上传到了CSDN上,https://download.csdn.net/download/yangshangwei/11015243 (积分真不是我设置的。。。自动生成的。。。这个有点尴尬)


源码安装

以下操作均为root用户

pcre

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ 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安装

代码语言:javascript
复制
$yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-deve

同样是可行的,我用这种方式在 192.168.31.56 安装的nginx ,OK。


安装nginx

代码语言:javascript
复制
$ 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

验证下启动文件是否正常

代码语言:javascript
复制
[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

代码语言:javascript
复制
[root@artisan sbin]# /usr/local/nginx/sbin/nginx

如果启动的时候碰到了如下错误

代码语言:javascript
复制
./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

代码语言:javascript
复制
[root@artisan sbin]# /usr/local/nginx/sbin/nginx 
[root@artisan sbin]# 

默认80端口,打开浏览器访问ip地址:

安装并启动成功。


常用操作命令

代码语言:javascript
复制
重启:
$ /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更改下目录的所有者及用户组即可。

代码语言:javascript
复制
[root@artisan sbin]# chown -R  nginx:nginx  /usr/local/ngin

需要注意的是,如果使用了nginx普通用户启动,那么80端口是启动不了的,报错如下,需要将nginx的端口调整为1024以上的端口。

代码语言:javascript
复制
[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地址

代码语言:javascript
复制
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列表 ,对应后台的server
    upstream 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节点的访问比率高一倍。

代码语言:javascript
复制
upstream artisanPool{

server 10.72.38.235:8080 weight=5;

server 10.72.38.235:8081 weight=10;

}

ip_hash(访问ip)

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

代码语言:javascript
复制
upstream artisanPool{

ip_hash;

server 10.72.38.235:8080;

server 10.72.38.235:8080;

}

fair(需要下载upstream_fair模块)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。

代码语言:javascript
复制
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算法。

代码语言:javascript
复制
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机器。所以这台机器压力会最轻。

举例

代码语言:javascript
复制
#定义负载均衡设备的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打包,上传到服务器上,使用如下命令启动两个进程

代码语言:javascript
复制
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中的策略

代码语言:javascript
复制
   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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 环境说明
  • 安装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
                      相关产品与服务
                      负载均衡
                      负载均衡(Cloud Load Balancer,CLB)提供安全快捷的四七层流量分发服务,访问流量经由 CLB 可以自动分配到多台后端服务器上,扩展系统的服务能力并消除单点故障。轻松应对大流量访问场景。 网关负载均衡(Gateway Load Balancer,GWLB)是运行在网络层的负载均衡。通过 GWLB 可以帮助客户部署、扩展和管理第三方虚拟设备,操作简单,安全性强。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档