[转][笔记] 4.Tomcat系列之Nginx反向代理 tom
转自陈明乾的博客,可能有一定更新。
转原文声明:
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。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。
软件下载地址:
- jdk 8u101: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- apache-tomcat 7.0.70: http://tomcat.apache.org/download-70.cgi
一、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.171 与 http://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;
}