一、环境准备
服务器名称 | 系统版本 | 预装软件 | IP地址 |
Nginx服务器 | CentOS 7 最小安装 | Nginx | 192.168.16.130 |
Web服务器A | CentOS 7 最小安装 | tomcat+jdk | 192.168.16.136 |
Web服务器B | CentOS 7 最小安装 | tomcat+jdk | 192.168.16.152 |
Web服务器B | CentOS 7 最小安装 | tomcat+jdk | 192.168.16.153 |
二、架构图
三、部署过程
(一)Nginx 服务安装
1. 安装相关依赖包 yum install wget lrzsz dos2unix lsof tree gcc-c++ pcre pcre-devel zlib zlib-devel gd-devel openssl openssl-devel gd-devel -y 2. 环境设置 ulimit -SHn 65535 //设置linux高负载参数 3. 创建用户及组 useradd www -s /sbin/nologin -M 4. 编译安装Nginx #tar zxf nginx-1.10.2.tar.gz -C /usr/src/ #cd /usr/src/nginx-1.10.2/ # ./configure --prefix=/application/nginx-1.10.2 \ --with-http_gzip_static_module \ --without-http_memcached_module --with-http_ssl_module --with-http_stub_status_module --user=www --group=www \ #make && make install # ln -s /application/nginx-1.10.2 /application/nginx 5. 创建systemctl 系统Nginx 服务启动文件 vim /usr/lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/application/nginx/sbin/nginx ExecReload=/application/nginx/sbin/nginx -s reload ExecStop=/application/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target 6. 加入开机自启动并启动Nginx #systemctl enable nginx.service #systemctl start nginx.service 7. 启动和查看Nginx 启动状态 #systemctl restart nginx.service #systemctl status nginx.service #ss -ntlp 8. 访问验证 Windows : 浏览器输入 http://192.168.168.16.130 Linux : curl http://192.168.16.130 (二) tomcat + JDk 安装 三台(192.168.16.136、192.168.16.152、192.168.16.153) #yum 安装 JDK yum -y install java-1.8.0-openjdk 1. 解压 tomcat 包 [root@localhost ~]# tar zxf apache-tomcat-8.0.52.tar.gz 2. 移动并更名 [root@localhost ~]# mv apache-tomcat-8.0.52 /usr/local/tomcat8 3. 启动tomcat 和访问验证 [root@localhost ~]# cd /usr/local/tomcat8/bin/ [root@localhost bin]# ls bootstrap.jar catalina-tasks.xml configtest.bat digest.bat setclasspath.sh startup.bat tomcat-native.tar.gz version.bat catalina.bat commons-daemon.jar configtest.sh digest.sh shutdown.bat startup.sh tool-wrapper.bat version.sh catalina.sh commons-daemon-native.tar.gz daemon.sh setclasspath.bat shutdown.sh tomcat-juli.jar tool-wrapper.sh [root@localhost bin]# ./startup.sh
浏览器输入;http://192.168.16.153:8080
4. 编写静态配置文件
在Tomcat的webapps目录下,新建一个文件夹drp,并将login.html放到drp文件夹里。 完整目录:/usr/local/tomcat8/webapps/drp #cat login.html <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf8" /> </head> <body> <h1>您正在访问:192.168.16.152</h1> </body> </html 注:以上步骤都在其他两台服务器上操作一遍 1. 启动tomcat 访问验证 分别输入url: http://192.168.16.136:8080/drp/login.html http://192.168.16.152:8080/drp/login.html http://192.168.16.153:8080/drp/login.html (三) nginx 负载均衡配置(完整配置) 1.nginx.conf 配置文件 user nobody; #工作进程个数,一般跟服务器cpu核数相等,或者核数的两倍 worker_processes 2; #单个进程最大连接数 events{ worker_connections 1024; } http{ keepalive_timeout 65; gzip on; #服务器集群 upstream mycluster{ #集群有几台服务器即可配置几台,weight表示权重,权重越大被访问到的几率越大 #这里添加的是上面启动好的两台Tomcat服务器 server 192.168.16.136:8080 weight=1; server 192.168.16.152:8080 weight=1; server 192.168.16.153:8080 weight=1; } #nginx基本配置 server{ listen 8088; #端口号 server_name 192.168.16.130; #服务名 location /{ #将访问请求转向至服务器集群,mycluster和上面upstream mycluster 对应 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; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
2.负载均衡测试验证
http://192.168.16.130:8088/drp/login.html
不断刷新浏览器,访问的地址一直在变化,可以看到负载均衡的效果已经实现。 (四)、动静分离(完整配置) 什么是动静分离 为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。用户请求的动态文件比如servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的作用。 本文的动静分离主要是通过nginx+tomcat来实现,其中nginx处理图片、html、JS、CSS等静态文件,tomcat处理jsp、servlet等动态请求。 ------------------------------------------------------------------------------- 创建 JSP动态页面 Jsp放到drp目录中,添加一个图片标签,加载Tomcat根目录下 webapps/drp/img/test.jpg图片文件。启动Tomcat测试是否能够访问。 # cd /usr/local/tomcat8/webapps/drp #cat index.jsp <%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="utf8"%> <HTML> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf8"> <title>Nginx动静分离测试</title> </head> <body> <h1>您正在访问:192.168.16.136</h1> <img src="/drp/img/test.jpg" alt="test" /> </body> </html>
浏览器输入网址:http://192.168.16.152:8080/drp/index.jsp
(五)、对Nginx进行配置
通过配置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/tomcat8/webapps/drp; expires 1h; } root /usr/local/webapps; 这段代码的意思是指定Nginx访问的目录,即静态资源所在的目录。 expires 30d; 指定这些资源文件在客户端浏览器的缓存时间。30d指的是30天,1h指的是1小时。 (六)、完整的nginx 配置文件(说明) 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.16.136:8080 weight=1; server 192.168.16.152:8080 weight=1; server 192.168.16.152:8080 weight=1; } server{ listen 8088; server_name 192.168.16.130; 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; } } }
(七)、测试动静分离
小结
从上述的实例可以看到已经初步实现了Nginx动静分离的功能,在配置动静分离后,用户请求你定义的静态资源,默认会去nginx的发布目录请求,而不会到后端请求,这样可以提高网站响应速度,减轻真实Web服务器的负载压力。
不过在开发环境下,为了便于开发,咱们的静态资源和代码还是放在一起的,等开发测试完成,才会将完成的完整程序部署到生成环境上,然而程序代码和静态资源是分别放置到不同的服务器上的。
发表评论