Nginx+Tomcat+redis集群配置

Nginx 安装及配置

简介:

中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。Ngnix是一个负载均衡服务器,其特点是占有内存少,并发能力强

nginx一般用来做静态服务器,本身不具备动态解析功能,需要结合其它插件或软件使用,如tomcat,php等,在性能方面:如果,不做集群调优等情况下,

tomcat(tomcat是动态服务器,需要依赖于jdk)一般支持并发100个左右,而nginx在静态方面可以达到几万并发。


nginx(下载:http://nginx.org/en/download.html)nginx-1.9.3.tar.gz


模块依赖性

  1. gzip模块需要 zlib 库( 下载: http://www.zlib.net/)zlib-1.2.8.tar.gz 
    gzip可以加快我们网站打开的速度,原理是通过服务器压缩,客户端浏览器快速解压,大大的节省了网站的流量,提高了网页打开的速度,
    但与此同时也会增加cpu的开销。
  2. rewrite模块需要 pcre 库 ( 下载: http://www.pcre.org/) pcre-8.38.tar.gz 
    rewrite主要时实现url的重写,通过pcre的perl兼容正则表达式进行匹配,通过rewrite规则,可实现规范的URL,或者动态的URL地址需要伪装成静态的HTML,便于搜索引擎抓到,旧URL可以通过rewrite跳转到新URL上。
  3. ssl 功能需要openssl( 下载: http://www.openssl.org/ )openssl-1.1.0.tar.gz
    openssl可以生成数字证书,自带功能加密功能,增加nginx的ssl安全性。

安装:


  • sudo su切换到root用户
  • 1、下载完包后,我们把它们移动到一个nginx的文件夹里(mv  openssl-1.1.0.tar.gz nginx-1.9.3.tar.gz pcre-8.38.tar.gz zlib-1.2.8.tar.gz /opt/nginx),再解压(tar -zxvf openssl-1.1.0.tar.gz nginx-1.9.3.tar.gz pcre-8.38.tar.gz zlib-1.2.8.tar.gz
  • 2、安装pcre(cd pcre-8.38 ./configure  make&make install
  • 3、安装zlib(cd zlib-1.2.8 ./configure  make&make install
  • 4、安装openssl(cd openssl-1.1.0 ./config  make&make install
  • 5、安装nginx(cd nginx-1.9.3  ./configure  make&make install) 执行./configure如果提示找不到上面安装的相关模块时,则可以使用一下命令
    --with-openssl=<openssl_dir>--with-pcre=<pcre_dir>--with-zlib=<zlib_dir>指定依赖的模块目录。如./configure --width-openssl=/opt/nginx
    /nginx-1.9.3 在make&make install, 如果编译通过,则默认安装即可。

使用:(注意,nignx安装后的使用目录是/usr/local/nginx/)下面的说明用开始安装的目录也行。


我们切换到这个目录下,通过 ./nginx 启动nginx服务器,浏览器输入http://localhost,显示以下信息,则安装成功。


如果要要重启nginx,使用 ./nginx -s reload 即可

关闭方式有以下几种

1、直接输入 ./nginx -s stop

2、 查询nginx主进程号

  ps -ef | grep nginx

  从容停止   kill -QUIT 主进程号

  快速停止   kill -TERM 主进程号

  强制停止   kill -9 nginx

若nginx.conf配置了pid文件路径,如果没有,则在logs目录下

kill -信号类型 '/usr/local/nginx/logs/nginx.pid

判断配置文件是否正确可用./nginx -t

配置文件介绍:


除了nginx.conf,其余配置文件,一般只需要使用默认提供即可

nginx.conf


在conf文件下的nginx.conf时主要配置文件,其内容如上图:
  • worker_process表示工作进程的数量,一般设置为cpu的核数(上图没截取到)
  • worker_connections表示每个工作进程的最大连接数(上图没截取到
     server{}块定义了虚拟主机
  1.  listener 监听端口,默认为80
  2.  server_name监听的域名
  3.  location{}是用来匹配URI进行配置,URI即语法中的'/uri/'。location{}配置任何查询,因为
    素有请求都以/开头。
    root 指定对应uri的资源查找路径,这里html为相对路径,完整路径为/opt/nginx/nginx-1.9.3/html
    index指定首页index文件的名称,可用配置多个,以空格分开,如有多个,按配置顺序查找。
  4. error_page服务器发生错误请求时候,它会自动根据错误状态码跳转到相应的50页面。

mime.types  定义的文件扩展名与文件类型映射关系

fastcgi_params  ginx配置Fastcgi解析时会调用fastcgi_params配置文件来传递服务器变量,这样CGI中可以获取到这些变量的值。默认传递以下变量:

uwsgi_params fastcgi_params一样,传递哪些服务器变量,只有前缀不一样,以uwsgi_param开始而非fastcgi_param

scgi_params fastcgi_params一样,传递哪些服务器变量,只有前缀不一样,以uwsgi_param开始而非fastcgi_param

koi-utfkoi-winwin-utf 

这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码。

koi-win: charset_map  koi8-r < -- > windows-1251

koi-utf: charset_map  koi8-r < -- > utf-8

win-utf: charset_map  windows-1251 < -- > utf-8

Redis 的安装



Tomcat + Redis + Nginx集群配置   

1、wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.70/bin/apache-tomcat-7.0.70.tar.gz

2、tar -zxvf  apache-tomcat-7.0.70.tar.gz , mv apache-tomcat-7.0.70 tomcat1

3 、tar -zxvf  apache-tomcat-7.0.70.tar.gz ,mv apache-tomcat-7.0.70 tomcat2

4、tar -zxvf  apache-tomcat-7.0.70.tar.gz, mv apache-tomcat-7.0.70 tomcat3

 5、修改tomcat2里的端口依次为8006 8081 8010 修改tomcat3里的端口依次为8007 8082 8011 

6、之后我们创建一个文件夹test(mkdir test) 再创建一个index(vim index.jsp)内容如下

<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>

    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>
sessionID:<%=session.getId()%>
<br>
SessionIP:<%=request.getServerName()%>
<br>
SessionPort:<%=request.getServerPort()%>
<%
//为了区分,第二个可以是222
out.println("This is Tomcat Server 1111");
%>
 

7、之后分别修改tomcat1 tomcat2 tomcat3的server.xml,在<Host >内为其指定web项目的路径

 <Context path="" reloadable="true" docBase="/opt/nginx/test"/>


8、cd /usr/local/nginx/conf切换到nignx安装后的目录下,修改nginx.conf(vim nginx.conf)配置文件

#user nobody;
 
# 进程数,一般这个和cpu核心数相等
 
worker_processes 2;
 
# 错误日志配置
 
#error_log logs/error.log;
 
#error_log logs/error.log notice;
 
#error_log logs/error.log info;
 
	# pid 进程
 
#pid logs/nginx.pid;
 
#工作模式及连接数上限
events {
 
	# work 进程连接数
	use epoll; 
	worker_connections 2048;

    # 并发总数是 worker_processes 和 worker_connections 的乘积
    # 即 max_clients = worker_processes * worker_connections
    # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么
    # 为什么上面反向代理要除以4,应该说是一个经验值
    # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
    # worker_connections 值的设置跟物理内存大小有关
    # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
    # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
    # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
    # $ cat /proc/sys/fs/file-max
    # 输出 34336
    # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
    # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
    # 使得并发总数小于操作系统可以打开的最大文件数目
    # 其实质也就是根据主机的物理CPU和内存进行配置
    # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
    # ulimit -SHn 65535

}
 
 
 
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 logs/access.log main;

	# 开启高效文件传输模式,调用sendfile 进行文件的传输,但一般为了和网速的io进行平衡,

	#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    #对于普通应用,必须设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.

	sendfile on;

	#tcp_nopush on;

    #连接超时时间
	#keepalive_timeout 0;

	keepalive_timeout 65;

	tcp_nodelay     on;

	# 是否开启gzip压缩输出

	#开启zip网页压缩
	gzip  on;
	gzip_min_length 1k;
	gzip_buffers 4 8k;
	gzip_http_version 1.1;
	gzip_types text/plain application/x-javascript text/css application/xml;

    #设定请求缓冲
    client_header_buffer_size    128k;
    large_client_header_buffers  4 128k;


	#负载均衡配置,nginx 是做反向代理的,访问nginx就是在访问负载均衡配置的这个server,这个可以通过log查看

	# 查看的error log 从中可以清晰看到 负载均衡的地址:client: 127.0.0.1, server: localhost,request: "GET /index.jsp # HTTP/1.1", upstream: "http://127.0.0.1:18081/index.jsp", host: "localhost"

	upstream localhost{

		#ip_hash iphash 实现负载均衡,这里使用了轮回的方式实现

		# nginx 转发的后台tomcat服务器配置,以及其权重的配置,权重越大要承载的量越大

		#ip_hash; #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
		server localhost:8080 weight=1 max_fails=2 fail_timeout=30s;

		server localhost:8081 weight=1 max_fails=2 fail_timeout=30s;

		server localhost:8082 weight=1 max_fails=2 fail_timeout=30s;

	}
 
	# 虚拟主机的配置
	 
	server {
	 
		# 就是nginx服务的端口
		 
		listen 80;
		 
		#这个就是访问域名
		 
		server_name localhost;
		 
		# 字符编码的设置
		 
		charset utf-8;
		 

		#access_log logs/host.access.log main;
		 
		# 动静分离,动态的反向到负载均衡的tomcat上
		 
		 
		location / {
			# nginx 的根目录,当发送静态请求时会默认到这个目录下去查找
		    root /opt/nginx/test;
		    #定义首页索引文件的名称
	        index  index.html index.htm index.jsp index.do;
	    }   

		#error_page 404 /404.html;
	    # 定义错误提示页面 /50x.html


	    error_page 500 502 503 504 /50x.html;

	    location = /50x.html {
	    	#root html;
	    }


	    # 静态页面由 nginx处理

	     location ~ ^/(images|javascript|js|css|flash|media|static)/ {

 			#过期30天,静态文件不怎么更新,过期可以设大一点,
            #如果频繁更新,则可以设置得小一点。

	    	#expires 30d;

	    }

	    #jsp,do等页面交由tomcat处理
	    location ~ \.(jsp|do)$ {

	    	# 代理路径,和负载均衡的 upstream localhost 这个localhost路径是一致的,但http是不能忘!

			proxy_pass http://localhost;
	        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;    
	        client_max_body_size    10m;    
	        client_body_buffer_size 128k;    
	        proxy_buffers           32 4k;  
	        proxy_connect_timeout   3;    
	        proxy_send_timeout      30;    
	        proxy_read_timeout      30;   
	        
		}

	 
	    #禁止访问 .htxxx 文件
        location ~ /.ht {
            deny all;
        }
	
	}
}
	

9、cd ../sbin/ 切换到启动命令文件夹下,执行sudo ./nginx -t测试配置文件配置是否有误如果提示成功,我们分别启动tomcat1 tomcat2 tomcat3,
     再执行sudo ./nginx 启动nginx,然后访问http://localhost,不断f5刷新,可以看到访问被分配到不同的tomcat,这样就起到负载均衡的作用, 如果
     我们尝试把tomcat1关掉,访问就被分配到剩下的两个tomcat下,但是有一个问题,就是每次访问不到不同的tomcat,session就发生了 变化,
     这时后我们可以采用redis来做session共享。
      
     
10、Tomcat 结合 Redis做session共享需要jedis-2.8.1.jar  commons-pool2-2.4.2.jar tomcat-redis-session-manager-2.0.0.jar这几个包,
jedis-2.8.1.jar  commons-pool2-2.4.2.jar 可以从http://mvnrepository.com/ 上下载, tomcat-redis-session-manager-2.0.0.jar这个包比较
麻烦,需要自己用gradle编译,因为tomcat-redis-session-manager的作者把源码开放到git上,打包方式是gradle,编译方式如下:

        1、 如果自己系统上没有gradle,请先安装gradle, sudo apt-get install gradle,
         2、git clone https://github.com/jcoleman/tomcat-redis-session-manager.git
         3、修改build.gradle,在signing节点中添加required = false以及删掉或注释掉文件中的sonatype的repository代码即可
         4、执行gradle build,编译结束后生成build,在里面的libs文件夹下可以找到 tomcat-redis-session-manager-2.0.0.jar这个包

11、分别把jedis-2.8.1.jar  commons-pool2-2.4.2.jar tomcat-redis-session-manager-2.0.0.jar复制到 tomcat1 tomct2 tomcat3的libs目录下,

       再一次修改tomcat1 tomcat2 tomcat3的conf里的 context.xml 文件,在里头的context节点里增加如下内容
     
  <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />

    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"

     host="localhost"

     port="6379"

     database="10"

     maxInactiveInterval="60"/>

      11、最后,启动redis,tomcat1,tomcat2,tomcat3,nginx,访问http://localhost,不断按f5刷新,可以看到都是同样内容,除非关闭浏览器再重新启动才能看到session id的变化,说明已经实现了  tomcat集群和session共享。







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值