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

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

转原文声明:
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。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;

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 80,910评论 21 356
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 转自陈明乾的博客,可能有一定更新。 转原文声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、...
    C86guli阅读 941评论 1 6
  • 总是会反省自己的不足,却总没动力改变,所以总是在纠结中过着不如意的生活,2017一定要改变! 今年的目标:锻炼身体...
    aflowertree阅读 157评论 0 0
  • 今天登上欧洲最高的建筑-碎片大厦,前年来伦敦时还不知道有这个景点,去了有名的伦敦眼腑瞰了伦敦全景,这次来在塔桥游览...
    梦寐以求的太阳阅读 957评论 0 0