美文网首页Tomcat 相关服务器学习IT
[转][笔记] 4.Tomcat系列之Nginx反向代理 tom

[转][笔记] 4.Tomcat系列之Nginx反向代理 tom

作者: C86guli | 来源:发表于2016-08-11 19:00 被阅读527次

    转自陈明乾的博客,可能有一定更新。

    转原文声明:
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://freeloda.blog.51cto.com/2033581/1300915

    大纲


    一、Nginx反向代理Tomcat服务器

    • 1.环境准备
    • 2.Nginx将请求反向代理到后端Tomcat
    • 3.Nginx将图片缓存到本地
    • 4.Nginx将请求实现动静分离

    注,本文的测试的操作系统为 CentOS 6.8 x86_64,软件版本为 jdk-8u101、apache-tomcat-7.0.70。

    软件下载地址:

    一、Nginx反向代理Tomcat服务器


    1.环境准备


    实验拓扑:

    tomcat: 192.168.0.181
    nginx: 192.168.0.171

    接着来同步各节点的时间:

    [root@tomcat ~]# ntpdate 202.120.2.101
    [root@nginx ~]# ntpdate 202.120.2.101
    

    下面我们来安装nginx服务器,这里选择比较简单的 yum install 的方式安装:

    创建 /etc/yum.repos.d/nginx.repo 文件,内容如下:

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=0
    enabled=1
    

    yum repolist 看看:

    [root@lamp1 ~]# yum repolist
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.sina.cn
     * epel: ftp.cuhk.edu.hk
     * extras: mirrors.sina.cn
     * updates: mirrors.sina.cn
    repo id          repo name                                                status
    base             CentOS-6 - Base                                           6,696
    epel             Extra Packages for Enterprise Linux 6 - x86_64           12,181
    extras           CentOS-6 - Extras                                            62
    nginx            nginx repo                                                   28
    updates          CentOS-6 - Updates                                          293
    repolist: 19,260
    

    已经有了 nginx repo,接着直接可以 yum install 安装 nginx:

    [root@docker2 ~]# yum install -y nginx
    [root@docker2 ~]# rpm -qa | grep nginx
    nginx-1.10.1-1.el6.ngx.x86_64
    

    看一下安装的文件:

    [root@lamp1 ~]# rpm -ql nginx
    /etc/logrotate.d/nginx
    /etc/nginx
    /etc/nginx/conf.d
    /etc/nginx/conf.d/default.conf
    /etc/nginx/fastcgi_params
    /etc/nginx/koi-utf
    /etc/nginx/koi-win
    /etc/nginx/mime.types
    /etc/nginx/modules
    /etc/nginx/nginx.conf
    /etc/nginx/scgi_params
    /etc/nginx/uwsgi_params
    /etc/nginx/win-utf
    /etc/rc.d/init.d/nginx
    /etc/rc.d/init.d/nginx-debug
    /etc/sysconfig/nginx
    /etc/sysconfig/nginx-debug
    /usr/lib64/nginx
    /usr/lib64/nginx/modules
    /usr/sbin/nginx
    /usr/sbin/nginx-debug
    /usr/share/doc/nginx-1.10.1
    /usr/share/doc/nginx-1.10.1/COPYRIGHT
    /usr/share/nginx
    /usr/share/nginx/html
    /usr/share/nginx/html/50x.html
    /usr/share/nginx/html/index.html
    /var/cache/nginx
    /var/log/nginx
    

    启动 nginx,默认监听在 80 端口:

    [root@lamp1 ~]# service nginx start
    Starting nginx:                                            [  OK  ]
    

    2.Nginx将请求反向代理到后端Tomcat


    首先,我们来修改一些 nginx 的配置文件,/etc/nginx/nginx.conf 可以不去动它,修改 /etc/nginx/conf.d/default.conf:

    [root@lamp1 nginx]# vi conf.d/default.conf
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/log/host.access.log  main;
    
        location / {
            #root   /data/www;
            #index  index.php index.html index.htm;
            proxy_pass http://192.168.0.181:8080;
        }
    

    重载配置:

    [root@lamp1 nginx]# nginx -s reload
    

    首先保证 tomcat 服务器是可用的,上一篇博文已经测试好了,所有这里可以直接测试,访问 http://192.168.0.171/shop:

    Snip20160811_53.png

    好了,大家可以看到我们成功设置了nginx反向代理tomcat服务器。

    大家可以看到,我们网站上有很多的图片,每次访问都要去后端的tomcat服务器上去取,很消耗服务器资源。我们下面将设置在nginx服务器上缓存图片。

    3.Nginx将图片缓存到本地


    修改配置文件,首先修改 /etc/nginx/nginx.conf,添加缓存的配置:

    [root@lamp1 nginx]# cat nginx.conf
    
    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    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;
    
        proxy_cache_path /nginx/cache levels=1:2 keys_zone=first:10m inactive=24h max_size=1G; # 设置缓存
    
        upstream backend { # 后端 tomcat 服务器
            server 192.168.0.181:8080 weight=1;
        }
    
        include /etc/nginx/conf.d/*.conf;
    }
    

    接着修改 /etc/nginx/conf.d/default.conf:

    [root@lamp1 nginx]# cat conf.d/default.conf
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/log/host.access.log  main;
    
        location / {
            #root   /data/www;
            #index  index.php index.html index.htm;
            proxy_pass http://backend; #
        }
    
        location ~* "\.(jpg|jpeg|png|gif|html|css|js)$" { # 不区分大小写匹配,缓存静态文件
            proxy_pass http://backend;
            proxy_cache first;
            proxy_cache_valid 200 24h; # 200 响应缓存 24h
            proxy_cache_valid 302 10m; # 302 响应缓存 10m
            add_header X-Cache-Status $upstream_cache_status; # 添加响应首部,返回缓存命中信息
    
        }
    
        #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   /usr/share/nginx/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           /data/www;
        #    fastcgi_pass   192.168.0.171:9000;
        #    fastcgi_index  index.php;
        #    include        fastcgi_params;
        #}
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    

    建立 /nginx/cache 目录,然后测试配置语法,重新加载配置:

    [root@lamp1 nginx]# mkdir -p /nginx/cache
    [root@lamp1 nginx]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@lamp1 nginx]# nginx -s reload
    

    访问 nginx 服务器地址,即可看到 tomcat 首页,刷新几次,看静态文件被缓存:

    Snip20160811_55.png Snip20160811_56.png

    以上分别是一个 png 文件和一个 css 文件,都显示缓存命中。在tomcat 服务器的日志中可看到,除了第一次访问,后续刷新网页,都只发送了一个对根目录的 / 的 HTTP 请求,因为首页中除了对 / 的请求,其他都是静态文件请求:

    Snip20160811_58.png

    不过,对 SHOP++ 的访问中,css、js 文件并没有被缓存,不知什么原因,只有图片被缓存了,多次刷新,tomcat 服务器都收到如下请求:

    Snip20160811_59.png

    另外我们可以看看缓存目录:

    [root@lamp1 nginx]# ll /nginx/cache/
    total 40
    drwx------ 3 nginx nginx 4096 Aug 11 09:24 0
    drwx------ 3 nginx nginx 4096 Aug 11 15:58 3
    drwx------ 3 nginx nginx 4096 Aug 11 09:17 4
    drwx------ 4 nginx nginx 4096 Aug 11 15:58 8
    drwx------ 4 nginx nginx 4096 Aug 11 09:24 9
    drwx------ 5 nginx nginx 4096 Aug 11 16:00 a
    drwx------ 3 nginx nginx 4096 Aug 11 15:58 b
    drwx------ 5 nginx nginx 4096 Aug 11 16:01 c
    drwx------ 5 nginx nginx 4096 Aug 11 09:24 e
    drwx------ 3 nginx nginx 4096 Aug 11 16:00 f
    [root@lamp1 nginx]# du -sh /nginx/cache/
    328K    /nginx/cache/
    

    可看到是有缓存内容的。好了到这里我们的nginx缓存服务就配置完成了,下面我们看一下如何实现动静分离。

    4.Nginx将请求实现动静分离


    首先,我们来说一下我们要实现的效果,上面我们已经将静态内容缓存在nginx服务器上,我们想让用户请求的静态内容到nginx去取,动态内容到tomcat服务器上去取,这就能实现动静分享效果。同样的首先我们来修改配置文件,

    [root@lamp1 nginx]# cat conf.d/default.conf
    server {
        listen       80;
        server_name  localhost;
    
    
        #charset koi8-r;
        #access_log  /var/log/nginx/log/host.access.log  main;
    
    
        location ~* "\.(jsp|do)$" {
            proxy_pass http://backend;
        }
    
        location / {
            rewrite ^(/.*)$ $1/index.jsp;
        }
    
        location ~* "\.(jpg|jpeg|png|gif|html|css|js)$" {
            proxy_pass http://backend;
            proxy_cache first;
            proxy_cache_valid 200 24h;
            proxy_cache_valid 302 10m;
            add_header X-Cache-Status $upstream_cache_status;
    
        }
    
        #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   /usr/share/nginx/html;
        }
    }
    

    对于 location 的查找,修饰符 = 表示 URI 与 前缀字符串 必须精确匹配。如果能够精确匹配,则结束查找。如果对于 / 的请求很频繁,可为 location / 添加 = 修饰符,这样可以加速处理过程,因为一次匹配查找即可结束。这里只是提一下,配置里没有这样定义。

    在上面的配置中,对于以 / 起始的请求做内部重定向,比如访问 http://192.168.0.171,被内部重定向到 http://192.168.0.171/index.jsp;访问 http://192.168.0.171/shop 被内部重定向到 http://192.168.0.171/shop/index.jsp。访问 http://192.168.0.171http://192.168.0.171/ 是等效的。

    重定向是这样定义的:

    location / {
        rewrite ^(/.*)$ $1/index.jsp;
    }
    

    动态内容交给后端 tomcat 服务器:

    location ~* "\.(jsp|do)$" {
        proxy_pass http://backend;
    }
    

    静态内容有本地缓存处理,对于第一次访问请求,内容还是从后端取得的:

    location ~* "\.(jpg|jpeg|png|gif|html|css|js)$" {
        proxy_pass http://backend;
        proxy_cache first;
        proxy_cache_valid 200 24h;
        proxy_cache_valid 302 10m;
        add_header X-Cache-Status $upstream_cache_status;
    
    }

    相关文章

      网友评论

        本文标题:[转][笔记] 4.Tomcat系列之Nginx反向代理 tom

        本文链接:https://www.haomeiwen.com/subject/gwnjsttx.html