Nginx +Tomcat架构的必要性与应用示例
一、Nginx +Tomcat整合的必要性
Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然Tomcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多。 Nginx可以通过如下两种方式来实现与Tomcat的耦合。 | |
序号 | 说明 |
1 | 【将静态页面请求交给Nginx,动态请求交给后端Tomcat处理】。 即:请求来临之后,先全部到达Nginx服务器,Nginx服务器会对请求进行过滤(通过location实现判断请求URL的静态与动态): 《1》若判断请求时静态则Nginx服务器自己找到静态资源处理后直接返回给客户端; 《2》若判断请求时动态则Nginx服务器会把请求转发给Tomcat服务器,Tomcat服务器处理完成后将结果返回给Nginx,Nginx在返回给客户端。具体情况如下图所示: |
2 | 【将所有请求都交给后端的Tomcat服务器处理,同时利用Nginx自身的负载均衡功能,进行多台Tomcat服务器的负载均衡】。 即:请求先到达Nginx服务器,Nginx服务器通过负载均衡策略将请求分发到后端的Tomcat服务器上,Tomcat服务器与数据库交互处理完成业务功能后返回结果给Nginx服务器,Nginx服务器再将结果返回给客户端。 《1》若想使Nginx与Tomcat的效率更高,可以将静态的资源放置在Nginx服务器中,直接让Nginx服务器处理返回给客户端;对于动态的资源内容通过Nginx的负载均衡策略传递给Tomcat处理后返回结果给Nginx服务器,Nginx服务器再将结果返回给客户端。. 《2》若访问量十分巨大(如每天有几百万、上千万的访问),首先要做的就是扩展Tomcat服务器;其次静态资源内容就不能只放在Nginx服务器上了,还需要将这些静态资源放到CDN中。 |
二、Nginx +Tomcat动静分离配置示例
2.1、Nginx+Tomcat动静分离配置示例
#Nginx +Tomcat动静分离配置示例
server { listen 80; server_name www.ixdba.net; root /web/www/html;#这是Nginx处理的静态资源(即:url带/img/的请求都是到【/web/www/html/img/】路径下查找资源返回) location /img/ { alias /web/www/html/img/; }#这是Nginx将动态内容(以.jsp和.do结尾的文件都反向代理给后端的Tomcat处理,且配置了一些反向代理的优化配置)location ~ (\.jsp)|(\.do)$ { proxy_pass http://192.168.1.16:8080; 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_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;}
}
2.2、root与alias的区别
alias指令和root指令的区别是: 《1》【alias指定的目录是当前目录】; 《2》【root指定的是根目录】; 一般情况下,建议在【location / 】中通过【root指令来配置根目录】,而在【其它目录匹配的位置使用alias指令】。 | |
序号 | 说明 |
1 |
这个location段配置中,如果url请求【/i/logo.gif】,那么Nginx将会在服务器上查找【/var/www/html/images/i/logo.gif】文件。 |
2 |
在这个location段配置中,如果url请求【/i/logo.gif】,那么Nginx将会在服务器上查找【/var/www/html/images/logo.gif】文件,也就是说请求的url中location后面的部分会被追加到alias指定的目录后面,而location后面的【 /i 】路径将被自动丢弃。 |
三、Nginx +Tomcat多tomcat负载均衡配置示例
假设有三台Tomcat服务器,分别开放不同的端口,地址分别是:
【主机192.168.12.131开放8000端口】【主机192.168.12.132开放8080端口】【主机192.168.12.133开放8090端口】对应的Nginx配置文件中相关配置代码如下:
#Nginx+Tomcat负载均衡配置示例
http {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 on;tcp_nopush on;tcp_nodelay on;#keepalive_timeout 0;keepalive_timeout 65;server_names_hash_bucket_size 128;client_max_body_size 20m;client_header_buffer_size 32k;large_client_header_buffers 4 32k;gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_version 1.1;gzip_comp_level 2;gzip_types text/plain application/x-javascript text/css application/xml;gzip_vary on;upstream mytomcats { server 192.168.1.131:8000 max_fails=3 fail_timeout=20s; server 192.168.1.132:8080 max_fails=3 fail_timeout=20s;server 192.168.1.133:8090 max_fails=3 fail_timeout=20s;ip_hash;} server { listen 80; server_name www.ck.net; access_log logs/ck.access.log main;#当客户端请求的是以(.jpg .gif .png .swf .flv .wma .wmv .asf .mp3 .mmf .zip .rar)结尾的这类静态资源文件时,Nginx直接从Nginx服务器本机的【/web/www.html/】路径下查找返回给客户端location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { root /web/www/html/; }#当客户端的请求处理上面提到的静态资源外全部都走这个反向代理到后端的Tomcat进行处理,Tomcat处理完成后将结果返回给Nginx服务器,Nginx服务器再将结果返回给客户端location / {proxy_pass http://mytomcats; include /usr/local/nginx/conf/proxy.conf;} }
#这是【/usr/local/nginx/conf/proxy.conf】文件的内容
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_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;