什么是静动分离?
是为了减轻应用服务器tomcat的负载,对静态资源如:图片/css/js/等文件,在反向代理的服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器处理。用户请求的动态文件比如servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的作用。
本文的动静分离主要是通过nginx+tomcat来实现,其中nginx处理图片、html、JS、CSS等静态文件,tomcat处理jsp、servlet等动态请求。
基础知识了解完后,咱们来具体实践一下动静分离的感觉。负载均衡在这篇博客就不在介绍了,但是同样会配置出来,实现动静分离和负载均衡的效果。
主机环境:
服务器IP | 系统 | 按照软件 | 服务器类型 |
192.168.2.20 | centos7 | nginx | 代理服务器 |
192.168.2.21 | centos7 | tomcat+jdk | web服务器 |
192.168.2.22 | centos7 | tomcat+jdk | web服务器 |
Nginx安装:
1、添加CentOS 7 Nginx yum资源库:
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2、安装Nnginx
yum -y install nginx
3、启动nginx 并检查是否正常启动;
[root@master /]# systemctl start nginx
[root@master /]#
[root@master /]# ps axu|grep nginx
root 20921 0.0 0.0 46828 968 ? Ss 23:38 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 20922 0.0 0.0 49316 1984 ? S 23:38 0:00 nginx: worker process
root 20931 0.0 0.0 112644 980 pts/0 R+ 23:38 0:00 grep --color=auto nginx
4、关闭防火墙或者添加端口我这里选择关闭防火墙
[root@master bin]# systemctl stop firewalld.service
[root@master bin]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
5、访问Nginx
Tomcat+jdk安装:
1、jdk的安装
参考:https://blog.csdn.net/qq_16538827/article/details/81703021
2、tomcat部署
1)下载tomcat
wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.33/bin/apache-tomcat-8.5.33.tar.gz
2)解压tomcat
[root@master opt]# tar -zxvf apache-tomcat-8.5.33.tar.gz -C /opt/
3) 修改目录名称 (这里也可以不修改按个人习惯)
[root@master opt]# mv apache-tomcat-8.5.33 tomcat8
4)启动tomcat
[root@master bin]# cd /opt/tomcat8/bin/
[root@master bin]# ./startup.sh #启动tomcat
5)netstat -ant # 查看8080 8009 8005端口是否启动;
6) 访问tomcat
#截至以上 nginx tomcat 已经安装成功,下面进行配置;
负载均衡配置:
编写测试页面 test.html 20填写“访问ip192.168.2.20” 21填写“访问ip192.168.2.21”; 22填写22
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=gb2312" />
</head>
<body>
<h1>访问ip:192.168.2.20</h1>
</body>
</html>
分配测试url是否可以正常访问;
nginx的配置
修改nginx.conf
user nginx;
worker_processes 2; #工作进程个数,一般跟服务器cpu核数相等,或者核数的两倍
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 2048; #单个进程最大连接数;
}
upstream myhsh{
#这里添加的是上面启动好的两台Tomcat服务器
server 192.168.2.20:8080 weight=1;
server 192.168.2.21:8080 weight=1;
server 192.168.2.22:8080 weight=1;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
配置./conf.d/www.conf #新建
server {
listen 80;
server_name hs.com;
location / {
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_buffering off;
proxy_pass http://myhsh;
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
}
error_log /opt/nginx_log/error.log debug;
access_log /opt/nginx_log/access.log ;
}
修改hosts 增加192.168.2.20 hs.com
动静分离配置
user nobody;
worker_processes 2;
events{
worker_connections 1024;
}
http{
#设置默认类型为二进制流
default_type application/octet-stream;
server_names_hash_bucket_size 128;
#指定来自客户端请求头的headerbuffer大小,设置为32KB
client_header_buffer_size 32k;
#指定客户端请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
large_client_header_buffers 4 32k;
#上传文件大小
client_max_body_size 356m;
#nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access日志存在未知
access_log /var/log/nginx/access.log access;
#开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络阻塞。
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#设置客户端连接保持活动的超时时间
keepalive_timeout 65;
server_tokens off;
#客户端请求主体读取缓存
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_send_timeout 60;
proxy_read_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#开启gzip
gzip on;
#允许压缩的最小字节数
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 4 16k;
#设置识别HTTP协议版本,默认是1.1
gzip_http_version 1.1;
#gzip压缩比,可在1~9中设置,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU
gzip_comp_level 2;
#压缩的类型
gzip_types text/plain application/x-javascript text/css application/xml;
#让前端的缓存服务器混村经过的gzip压缩的页面
gzip_vary on;
upstream mycluster{
server 192.168.2.20:8080 weight=1;
server 192.168.2.21:8080 weight=1;
server 192.168.2.22:8080 weight=1;
}
server{
listen 8088;
server_name 192.168.22.228;
charset utf-8; #设置编码为utf-8;
#location / {
# root html;
# index index.html index.htm;
#}
#location ~ .*\.(jsp|do|action)$
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://mycluster;
# 真实的客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 请求头中Host信息
proxy_set_header Host $host;
# 代理路由信息,此处取IP有安全隐患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真实的用户访问协议
proxy_set_header X-Forwarded-Proto $scheme;
}
#静态文件交给nginx处理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
root /usr/local/webapps;
expires 30d;
}
#静态文件交给nginx处理
location ~ .*\.(js|css)?$
{
root /usr/local/webapps;
expires 1h;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
location /配置
全部的请求均转发给Tomcat进行处理
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://mycluster;
# 真实的客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 请求头中Host信息
proxy_set_header Host $host;
# 代理路由信息,此处取IP有安全隐患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真实的用户访问协议
proxy_set_header X-Forwarded-Proto $scheme;
}
如:html,js,css等静态资源请求,由Nginx进行处理
#静态文件交给nginx处理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
root /usr/local/webapps;
expires 30d;
}
#静态文件交给nginx处理
location ~ .*\.(js|css)?$
{
root /usr/local/webapps;
expires 1h;
}
小结
从上述的实例可以看到已经初步实现了Nginx动静分离的功能,在配置动静分离后,用户请求你定义的静态资源,默认会去nginx的发布目录请求,而不会到后端请求,这样可以提高网站响应速度,减轻真实Web服务器的负载压力。
不过在开发环境下,为了便于开发,咱们的静态资源和代码还是放在一起的,等开发测试完成,才会将完成的完整程序部署到生成环境上,然而程序代码和静态资源是分别放置到不同的服务器上的。