Nginx+ tomcat环境搭建

什么是静动分离?

是为了减轻应用服务器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服务器的负载压力。

不过在开发环境下,为了便于开发,咱们的静态资源和代码还是放在一起的,等开发测试完成,才会将完成的完整程序部署到生成环境上,然而程序代码和静态资源是分别放置到不同的服务器上的。

猜你喜欢

转载自blog.csdn.net/qq_16538827/article/details/81979912