从0开始使用nginx 负载均衡,https,session共享

安装 Ngnix

安装编译工具及库文件

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

安装 PCRE

// 下载 pcre 安装包
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
// 注意:此处 pcre-8.35 请自行改成自己需要的版本号,这已经是比较旧的版本了
// 解压
tar zxvf pcre-8.35.tar.gz
// 进入目录
cd pcre-8.35
编译安装
// ./configure
make && make install
// 查看版本
pcre-config –version

安装 Ngnix

// 下载 Ngnix
wget http://nginx.org/download/nginx-1.6.2.tar.gz
// 解压
tar zxvf nginx-1.6.2.tar.gz
// 进入目录
cd nginx-1.6.2
// 编译安装
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/root/local/pcre-8.35
// 注意:这里的 prefix 指的是你 Ngnix 安装位置(不是上面解压的位置),with-pcre 指的是上面的 pcre 安装位置,
// 不要完全复制,按照实际情况修改。
make
make install
// 查看 ngnix 版本
/usr/local/nginx/sbin/nginx –v

在这里插入图片描述
出现这个版本,恭喜你,安装成功

使用 Ngnix

启动

// 启动
/usr/local/nginx/sbin/nginx
// 查看是否有对应进程
ps -ef|grep nginx

在这里插入图片描述
访问虚拟机 这里由于是阿里云服务器,对安全组入方向开放配置的80端口即可
如果不是阿里云服务器,则需开启防火墙设置
1.开放端口命令: /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
2.保存:/etc/rc.d/init.d/iptables save
3.重启服务:/etc/init.d/iptables restart
4.查看端口是否开放:/sbin/iptables -L -n

在这里插入图片描述

负载均衡配置

什么是负载均衡?(引用自csdn

负载均衡,英文名称为Load
Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。负载均衡的本质目的就是提高网站的吞吐量(吞(请求)、吐(响应)数量),减轻单台服务器压力,尽可能最大化利用每个服务器的资源。

在这里插入图片描述
首先你要自己安装2个tomcat 分别是不同端口,这里是 8080 和 9080,并开启对应防火墙端口

进入 Nginx 安装目录 /usr/local/nginx/conf 下有一个 nginx.conf 文件,这个文件是 Nginx 的主要配置文件,将其修改为如下

user www www;
worker_processes 1; #设置值和CPU核心数一致
error_log /usr/local/nginx/logs/nginx_error.log debug; #日志位置和日志级别
pid /usr/local/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
#工作模式及连接数上限
events
{
  use epoll;#epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
  worker_connections 65535;#单个后台worker process进程的最大并发链接数 (最大连接数=连接数*进程数)
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
#设定mime类型,类型由mime.type文件定义
  include mime.types;
  default_type application/octet-stream;
  log_format main  '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for';
  access_log    /usr/local/nginx/logs/access.log;
#charset gb2312;
     
  server_names_hash_bucket_size 128;
  #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k
  client_header_buffer_size 32k;
  #设定请求缓冲
  large_client_header_buffers 4 32k;
  #允许客户端请求的最大单文件字节数
  client_max_body_size 8m;
     
  sendfile on;
  #防止网络阻塞
  tcp_nopush on;
  #keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后,继请求时,keepalive-timeout功能可避免建立或重新建立连接。
  keepalive_timeout 60;
  #提高数据的实时响应性
  tcp_nodelay on;
  
  fastcgi_connect_timeout 300; #连接到后端fastcgi超时时间
  fastcgi_send_timeout 300; #向fastcgi请求超时时间(这个指定值已经完成两次握手后向fastcgi传送请求的超时时间)
  fastcgi_read_timeout 300; 
  fastcgi_buffer_size 64k;#读取fastcgi应答第一部分需要多大缓冲区,该值表示使用1个64kb的缓冲区读取应答第一部分(应答头),可以设置为fastcgi_buffers选项缓冲区大小
  fastcgi_buffers 4 64k;#指定本地需要多少和多大的缓冲区来缓冲fastcgi应答请求,假设一个php或java脚本所产生页面大小为256kb,那么会为其分配4个64kb的缓冲来缓存;若页面大于256kb,那么大于的256kb的部分会缓存到fastcgi_temp指定路径中,这并非是个好办法,内存数据处理快于硬盘,一般该值应该为站点中php/java脚本所产生页面大小中间值,如果站点大部分脚本所产生的页面大小为256kb,那么可把值设置为16 16k,4 64k等
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  #开启gzip压缩
  gzip on; 
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;#压缩级别大小,最大为9,值越小,压缩后比例越小,CPU处理更快。值越大,消耗CPU比较高。
  gzip_types text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
  
 #这里为后端服务器 mysvr 应用集群配置,根据后端实际情况修改即可,mysvr 为负载均衡名称,可以任意指定
 #但必须跟下面 server 虚拟主机的 proxy_pass  段一致,否则不能转发后端的请求。weight配置权重,在fail_timeout内检查max_fails次数,失败则剔除均衡。
  upstream mysvr {   
      server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
      server 127.0.0.1:9080 weight=1 max_fails=2 fail_timeout=30s;
  }
  
  server
  {
    listen 81;#监听端口
    server_name localhost;#可以是你的服务器的IP地址如 12.123.123.123
    # access_log  logs/access.log  main;
    #默认请求
    location /
    {
    	 #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
       proxy_next_upstream http_502 http_504 error timeout invalid_header;
       proxy_redirect off;
       proxy_pass  http://mysvr; 
	   proxy_redirect default;
    }
  }
}

修改完成后可以使用 xftp 上传到服务器对应路径覆盖

// 进入到 Nginx 下的 sbin 文件夹
cd /usr/local/nginx/sbin
// 检查配置文件是否有误
./nginx -t
// 重启nginx 
./nginx -s reload

出现以下界面则 nginx 重启成功
在这里插入图片描述

如果在 ./nginx -t 时有报错,可以根据提示的行数去查看配置文件是否有误。
上面的配置文件我已经测试过是可以使用的

访问你的服务器
http://XX.XXX.XXX.XXX:81/ 这里的 81 端口是上面 server 中配置的 listen ,即 Nginx 监听的 http 端口号

在这里插入图片描述
在这里插入图片描述
可以看到同样访问 81 端口,2 次不同的请求却访问了不同端口的 tomcat 的首页
到此负载均衡配置完成

nginx 的 upstream目前支持 4 种方式的分配
weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包

配置https

配置https的资料引用自博客园
修改 usr/local/nginx/conf/nginx.conf http中新增一个 server
这里的证书公钥私钥生成参考 https://www.cnblogs.com/jingxiaoniu/p/6745254.html

server{
		#比起默认的80 使用了443 默认 是ssl方式  多出default之后的ssl
        listen 443 default ssl;
		#default 可省略
		#开启  如果把ssl on;这行去掉,ssl写在443端口后面。这样http和https的链接都可以用
        ssl on;
		#证书(公钥.发送到客户端的)
        ssl_certificate /usr/local/nginx/conf/ssl/server.crt;
		#私钥,
        ssl_certificate_key /usr/local/nginx/conf/ssl/server.key;
		#下面是绑定域名
        server_name localhost;
        location / {
	    proxy_set_header x-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header HOST $http_host;
            proxy_set_header X-Forwarded-Proto https;
            proxy_redirect off;
		#代理tomcat
		proxy_pass  http://mysvr; 
        }        
}

配置完需要重启nginx

配置跳转

将监听 80 端口的 server 修改为

server
  {
    listen 80;#监听端口
    server_name localhost;#域名
	rewrite ^(.*)$  https://$host$1 permanent;  
  }

重启nginx,重新访问http地址就会自动跳转https

配置服务器宕机自动跳转

负载均衡时使用 upstream(轮循),就可以实现服务器宕机自动从可用列表中删除,但是这种方式太过简单,可以增加一些配置

upstream mysvr_as {   
      server 127.0.0.1:8080 weight=2 max_fails=2 fail_timeout=30s;
      server 127.0.0.1:9080 weight=1 max_fails=2 fail_timeout=30s;
  }

注意:这里的fail_timeout和max_fails指的并不是客户端访问,而是指nginx的连接探测server的超时时间与超时次数。

Weight权重,weight越高负载均衡访问该server的概率越大,与weight成正比
max_fails和fail_timeout参数是配合使用的
表示在周期内(fail_timeout 30秒),nginx连接后端出现异常2次(max_fails)
Nginx就会在这个周期内将此节点标记为不可用,在下个周期再次请求。

注意
在需要配置自动跳转的server中proxy_pass之后,加上
proxy_connect_timeout 2;
proxy_read_timeout 2;
proxy_send_timeout 2;

完整 server

server
  {
    listen 81;#监听端口
    server_name 39.108.105.147;#域名
    location /
    {
       proxy_pass  http://mysvr; 
	   proxy_connect_timeout 2; 
	   proxy_read_timeout 2; 
	   proxy_send_timeout 2;
	   proxy_redirect default;
    }
    access_log off;

  }

重启即可成功

以下配置注解是引用自博客园

proxy_connect_timeout 语法 proxy_connect_timeout time 默认值 60s 上下文 http
server location 说明 该指令设置与upstream server的连接超时时间,有必要记住,这个超时不能超过75秒。
这个不是等待后端返回页面的时间,那是由proxy_read_timeout声明的。如果你的upstream服务器起来了,但是hanging住了(例如,没有足够的线程处理请求,所以把你的请求放到请求池里稍后处理),那么这个声明是没有用的,由于与upstream服务器的连接已经建立了。
proxy_read_timeout 语法 proxy_read_timeout time 默认值 60s 上下文 http server
location 说明
该指令设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。这个时间不是获得整个response的时间,而是两次reading操作的时间。
proxy_send_timeout 语法 proxy_send_timeout time 默认值 60s 上下文 http server
location 说明
这个指定设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接

实现tomcat的session共享

虽然 tomcat 本身有自带session共享,但是有以下不足:
1、必须在同一种中间件之间完成(如 :tomcat-tomcat之间).
2、session 复制带来的性能损失会快速增加.特别是当 session 中保存了较大的对象,而且对象变化较快时,性能下降更加显著,会消耗系统性能。这种特性使得web应用的水平扩展受到了限制。
3、Session
内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。

基于cache DB缓存的session共享
基于memcache/redis缓存的session共享.即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cacheDB中查找,如果找到则复制到本机,这样实现session共享和高可用。

这里采用 memcache + tomca t实现基于 cacheDB 的 session 共享。
还可以使用redis来实现 session共享,但是其插件更新较慢,不支持高版本tomcat,需要手动修改 jar 包(redis-tomcat-sssion)。

在这里插入图片描述

Memcached实现

Memcached安装

Memcached是一款免费、开源、分布式的内存对象缓存系统, 用于减少数据库的负载, 加快web应用程序的访问. Memcached简单并且强大, 其简单的设计加快了部署, 易于开发, 缓存解决了面临的大量数据时很多的问题.

yum -y install libevent libevent-devel
cd /usr/local/src/
 tar -zvxf memcached-1.4.34.tar.gz
 cd memcached-1.4.34
 ./configure --prefix=/usr/local/memcached
 make && make install
 // 启动memcached,端口11211可以根据自己需要修改不同端口
 /usr/local/memcached/bin/memcached -d -m 512 -u root -p 11211 -c 1024 -P /var/lib/memcached.11211pid
 // 查看memcached进程是否起来
  ps -ef|grep memcached
 // 测试一下memcached连接,如下说明成功(输入quit退出)
 telnet 192.168.10.203 11211

配置tomcat mms插件

memcached-session-manager
Tomcat8 对应需要的jar包
百度云下载
https://pan.baidu.com/s/1v2-8xQzWyQUqB6PPybrMAA
提取码 s50u
在这里插入图片描述
特别注意
memcached-session-manager-tc8-1.9.7.jar 中的 tc8 为 tomcat 的版本号。
一定要注意:不同版本号的 tomcat,对应的msm包也不同。此处为 tomcat8 的 jar 包。
把上面这些 MSM 依赖的 jar 包下载后全部上传到两台机器的 tomcat 安装路径的 /lib 目录下
在这里插入图片描述

Tomcat配置只需要修改conf/context.xml文件:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="mem1:127.0.0.1:11211"
	sticky="false"
	sessionBackupAsync= "true" 
    sessionBackupTimeout= "1800000"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"/>

第一台tomcat节点的congtext.xml配置好之后,再将该文件拷贝到另一台tomcat节点的相同路径下

配置好之后,记得重启两台机器的tomcat服务

Manager 各参数说明:
memcachedNodes 必选项,memcached的节点信息,多个memcached节点,中间需要使用空格
sticky=“false” 使用 no-sticky 模式
requestUriIgnorePattern 可选值,制定忽略那些请求的session操作,一般制定静态资源如css,js一类的。
sessionBackupAsync 可选值,默认true,是否异步的方式存储到memcached。
sessionBackupTimeout 可选项,默认100毫秒,异步存储session的超时时间。

mms测试

将2台配置了mms的tomcat通过nginx负载均衡

将此war包放到2个tomcat的webapps下,再运行tomcat,会自动解压项目

修改其中一个tomcat的demo1中的index.jsp
在这里插入图片描述
随便输入任意字符以此来区别2个tomcat的项目

通过Nginx 的负载均衡访问 2个服务器的demo1/index.jsp
在这里插入图片描述
在这里插入图片描述
可以发现,nginx通过负载均衡将请求发给了2个tomcat,但是sessionId不变

通过 redis 实现

redis 实现 Tomcat session 共享需要使用tomcat-redis-session-manager,但是有一个很大的缺点,只支持 Tomcat6 和 Tomcat7。如果需要支持 Tomcat8 需要自己修改代码。下面是修改后的 jar包,将这些 jar 包放到 Tomcat 的 lib 目录下就可以了。
百度云链接:https://pan.baidu.com/s/1a7h_slWIMie6W1esXfaodQ
提取码:u62y

tomcat配置f

修改 tomcat 下 /conf/context.xml 在 前加上

<Valve className="com.demo.redis_session.RedisSessionHandlerValve" />
	<Manager className="com.demo.redis_session.RedisSessionManager"
	 host="127.0.0.1"
	 port="6379"
	 database="0"
	 maxInactiveInterval="60" />

redis session 共享测试

通过 82 端口访问 nginx 通过负载均衡分别访问 8084 8085 2个端口的 tocmat 可以看到 sessionID 都是相同的
在这里插入图片描述
在这里插入图片描述

通过 proxy_cache 配置 nginx 的静态缓存

Nginx的proxy_cache模块,可以将静态资源缓存到nginx中,让tomcat服务器只处理动态请求,大大提升了服务器的效率。

配置proxy_cache

在http下添加prixy_cache配置

  #cache begin
  proxy_buffering on;
  proxy_cache_valid any 10m;
  proxy_cache_path /usr/local/nginx/static levels=1:2 keys_zone=my-cache2:8m max_size=1000m inactive=600m;
  proxy_temp_path /usr/local/nginx/static;
  proxy_buffer_size 4k;
  proxy_buffers 100 8k;
  #cache end

代码说明:
proxy_cache_path 缓存文件路径
levels 设置缓存文件目录层次;levels=1:2 表示两级目录
keys_zone 设置缓存名字和共享内存大小
inactive 在指定时间内没人访问则被删除
max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。

当配置好之后,重启nginx,如果不报错,则配置的proxy_cache会生效

添加server 这里是新建一个server专门用来测试缓存,端口为84,

server
  {
    listen 84;#监听端口
    server_name localhost;#域名
    location /
    {
		proxy_pass  http://mysvr_as; 
		
		proxy_cache my-cache2;
		proxy_cache_valid 200;

		#Proxy Settings
		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;
		proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
		proxy_max_temp_file_size 0;
		proxy_connect_timeout 90;
		proxy_send_timeout 90;
		proxy_read_timeout 90;
		proxy_buffer_size 4k;
		proxy_buffers 4 32k;
		proxy_busy_buffers_size 64k;
		proxy_temp_file_write_size 64k;
		##End Proxy Settings
    }
  }

配置项介绍:
Proxy_cache tmp-test 使用名为tmp-test的对应缓存配置
proxy_cache_valid 200 206 304 301 302 10d; 对httpcode为200…的缓存10天
proxy_cache_key $uri 定义缓存唯一key,通过唯一key来进行hash存取
proxy_set_header 自定义http header头,用于发送给后端真实服务器。
proxy_pass 指代理后转发的路径,注意是否需要最后的/

到这里,最基本的proxy_cache功能就配置成功了。当uri成功匹配到该location,则proxy_cache就会生效。

测试是否成功

通过访问tomcat默认路径下的tomcat.png,来测试缓存是否成功
在这里插入图片描述
访问之后,会在上面配置的proxy_cache_path下生成nginx的缓存文件

之后删除tomcat下的tomcat.png
再次访问,还是可以显示,说明访问的是nginx下的缓存文件。

发布了12 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/brucelpt/article/details/88652305