通过前面的内容,现在环境都已经安装完毕,开始进入正题。
选择nginx与tomcat实现负载均衡的原因:
- nginx是一个理论能够支持5W并发的服务器
- nginx对静态资源的处理非常强大
- tomcat是一个servlet容器,对动态页面支持的非常好
- tomcat最多支持300并发后性能就开始下降
所以我们利用nginx的负载均衡可以水平扩展tomcat增加服务器并发处理能力,利用动静分离充分利用nginx和tomcat的性能。
- 首先我们来实现负载均衡:
通过配置nginx.conf文件:
cd /usr/local/nginx/conf
vim nginx.conf
下面是实现负载均衡的具体配置:
user root;
# 开启四个worker进程,比如你是四核cpu就开启四个
worker_processes 4;
# error_log logs/error.log;
# error_log logs/error.log notice;
# error_log logs/error.log info;
error_log logs/error.log debug;
# pid logs/nginx.pid;
events {
# epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
# 每一个worker进程能并发处理(发起)的最大连接数(包含所有连接数)。不能超过最大文件打开数:在linux终端中输入ulimit -a进行查看
worker_connections 65535;
# 打开同时接受多个新网络连接请求的功能。
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
# 自定义日志格式,“main” 代表这个自定义格式在下面的access_log会用到,后面定义日志具体记载的内容,
# $http_x_forwarded_for:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,例如做了CDN加速的就要添加,否则不知道用户真实ip
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $remote_addr';
# Nginx访问日志,main代表使用上述定义main的日志格式记录日志
access_log logs/access.log main;
# 设置为on表示启动高效传输文件的模式,开启这个参数后可以让数据不用经过用户buffer,直接在磁盘和tcp socket之间传输数据。
sendfile on;
# tcp_nopush on;
# keepalive_timeout 0;
# 设置请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损耗,类似于线程池,数据库连接池
keepalive_timeout 35;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
# gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain applicaiton/javascript application/x-javascript application/css text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
# upstream tomcat_server{
# server 127.0.0.1:8080;
# }
# cache begin
proxy_buffering on;
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=my-cache:150m max_size=300m inactive=1d;
proxy_temp_path /usr/local/nginx/nginx_temp;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
# cache end
## upstream模块是实现负载均衡的核心模块,通过配置upstreamName(tomcats),server地址(127.0.0.1:8080),负载方式(轮询|IP_HASH|第三方)实现基本的负载均衡功能。
upstream tomcats {
## 默认使用轮询,权重是相同是1,代表两台服务器处理请求的概率相等
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8082 weight=1;
}
server {
## 监听端口
listen 80;
server_name www.abc.com;
## 设定请求缓存
large_client_header_buffers 4 16k;
client_max_body_size 300m;
client_body_buffer_size 512k;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
# charset koi8-r;
# access_log logs/host.access.log main;
## location映射解析,匹配规则遵循正则表达式
## / 代表所有请求走这个配置
location / {
# root html;
# index index.html index.htm;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
## 这个走反向代理,表示所有请求都会走之前名字为tomcats的upstream模块
proxy_pass http://tomcats;
## 如果连接超时1秒,自动走另一台服务器,实现故障转移
proxy_connect_timeout 1;
proxy_read_timeout 1;
proxy_send_timeout 1;
}
## ^~ /static/ 代表所有/static/的请求走这个配置
location ^~ /static/ {
## 所有静态文件直接读取硬盘
root /usr/local/tomcat-9_1/webapps;
add_header X-Cache $upstream_cache_status;
proxy_cache my-cache;
proxy_cache_valid 200 12h;
proxy_cache_valid 301 302 1m;
proxy_cache_key $host$uri$is_args$args;
expires 30d; # 缓存30天
}
location ~ /purge(/.*) {
allow all;
# 指定可以清除缓存的ip,all允许所有ip清除
proxy_cache_purge my-cache $host$1$is_args$args;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
# error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
# location ~ \.php$ {
# proxy_pass http://127.0.0.1;
# }
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
# }
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# location ~ /\.ht {
# deny all;
# }
}
# another virtual host using mix of IP-, name-, and port-based configuration
# server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
# }
# HTTPS server
# server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
# }
}
修改完毕后,检测配置文件是否正确,并重启:
## 检测Nginx配置文件是否正确
/usr/local/nginx/sbin/nginx -t
## 重启Nginx服务,使配置生效
/usr/local/nginx/sbin/nginx -s reload
启动两台tomcat,并修改webapps/ROOT/目录下的jsp文件,分别在开头加上8081和8082用来区分两台服务器。
然后访问地址,按CTRL+R键刷新查看效果:
以上说明负载均衡实现成功。
欢迎各位提出问题,互相探讨,共同进步。