Tomcat 相关服务器学习IT

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

2016-08-11  本文已影响527人  C86guli

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

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

大纲


一、Nginx反向代理Tomcat服务器

注,本文的测试的操作系统为 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;

}
上一篇下一篇

猜你喜欢

热点阅读