nginx+tomcat 集群,负载均衡,静态资源加载问题

Jack_Ruin 发布于 2016/05/05 17:14
阅读 2K+
收藏 2

之前网站是用单个tomcat运行两个项目的,文件上传下载是但一个目录的,现在想使用nginx+tomcat实现集群,负载均衡,于是我在本地windows系统下测试,三个tomcat,两个网站,一个文件服务,如果把文件服务项目跟网站放在同一个tomcat下一起跑,这些图片文件是可以正常加载的,但是把文件服务单独放在一个tomcat下跑,的话,使用nginx就访问不了了,报404.

需求是这样的:我想用三个tomcat,两个跑网站,用nginx做负载均衡,另一个运行文件服务,网站里上传后资源保存在文件服务里,数据库里保存的url路径是/zjsj-file-system/*****这种方式,全部使用nginx代理

部分配置文件如下:

1。运行文件服务的tomcat:

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

            <Context path="/zjsj-file-system" reloadable="false" docBase="D:\zjr\pro\zjsj-file-system"> </Context>、

2.其他两个运行网站的tomcat配置:

 <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

            <Context path="" reloadable="false" docBase="D:\zjr\pro\zjsj"> </Context>

其他的配置都没问题。

nginx.conf:


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
#后添的
worker_rlimit_nofile 51200;

events {
    worker_connections  51200;
}


http {
    include       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  logs/access.log  main;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;     
    large_client_header_buffers 4 32k;
    
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream localhost {
       ip_hash;
       server 192.168.1.108:18080 weight=1;
       server 192.168.1.108:28080 weight=2;
       }
       
       upstream zjsj-file-system {
       
       server 192.168.1.108:38080;
       }
    
    server {
        listen       80;
        server_name  localhost;
        root D:/zjr/pro/zjsj;        #网站根目录
        proxy_redirect off;
        
        #跟后端服务器连接的超时时间
        proxy_connect_timeout 180;
        
        #连接成功后等候后端服务器响应时间
        proxy_read_timeout 180;
        
        #后端服务器数据回传时间
        proxy_send_timeout 180;
    

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass   http://localhost;
            proxy_set_header Host $host;
            proxy_set_header X-Real-Ip $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        #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   html;
        }

    }

    #文件服务器
    server {
        listen       80;
        server_name  zjsj-file-system;
        
        proxy_redirect off;
        root D:/zjr/pro/zjsj-file-system;        #网站根目录
        #charset koi8-r;

        #access_log  logs/zjsj-file.log combined;
        
        #充许客户端请求的最大单个文件字节数
        client_max_body_size 10m;
        
        client_body_buffer_size 128k;
        
        #跟后端服务器连接的超时时间
        proxy_connect_timeout 180;
        
        #连接成功后等候后端服务器响应时间
        proxy_read_timeout 180;
        
        #后端服务器数据回传时间
        proxy_send_timeout 180;
         location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js|html|htm)$  
          {          
            #root /home/webos/sam/html;
           proxy_pass http://zjsj-file-system;
           proxy_redirect off;
           proxy_set_header Host $host;           
           proxy_cache_valid 200 302 1h;
           proxy_cache_valid 301 1d;
           proxy_cache_valid any 1m;
           expires 30d;
          }
    
       
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}
在网上找了很多,都没解决静态资源加载不了的问题,


加载中
0
_wxyz
_wxyz
nginx配置错了,文件服务的nginx的server_name不对,你这样写只能是域名为zjsj-file-system才能访问,其他域名都访问不了。建议你把两个server合并,把文件服务的location放到网站的location的下面试试。
J
Jack_Ruin
是因为有这需求才搞的嘛,如果能解决,还烦请大家提供解决办法
_wxyz
_wxyz
回复 @Jack_Ruin : 额,刚接触就搞这么复杂啦~~,建议你搞个简单的,把不相关的都删掉,先把基本的搞通再说!
J
Jack_Ruin
具体怎么配置呢,麻烦贴下代码可以吗?放在一个service下试过,貌似不行,可能我配置有问题,刚接触,配置什么的都是从网上找的
0
我_承宇
我_承宇
在网站上发起的图片请求就是一个 URL,不管长什么样,你通过 nginx 重写这个 URL,然后指向到你文件服务的目录去就可以了。
我_承宇
我_承宇
回复 @Jack_Ruin : 你去看看 nginx 的 URL 重写指令 rewrite 的用法
J
Jack_Ruin
我现在是一台nginx服务器,一个ip,三个tomcat,通过不同的端口来实现的,搜了好多,都没能找到具体如何配置啊
0
Ken5233
Ken5233

看楼主的需求是类似我们之前的一个应用: A 应用和 B应用 使用同一台 服务器,由同一个nginx进行负载和分发,


location / {
            index  index.html index.htm index.jsp;
	    proxy_redirect    off;
     	    proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
     	    proxy_set_header  X-Real-IP  $remote_addr;
     	    proxy_set_header  Host $http_host;
	    proxy_pass http://webserver/;
        }
	
	location ~ ^/WEB-INF/ {
            deny all;
        }

	# ********** cms ********** #
	location /cms/ {  
	    root  /usr/local/tomcat-cms/webapps/cms/;
	    proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
     	    proxy_set_header  X-Real-IP  $remote_addr;
     	    proxy_set_header  Host $http_host;
	    proxy_pass        http://webserver2/cms/;
	    access_log off;
	}

 访问时, http://server/ 进入A应用默认主页,http://server/cms 进入cms应用...



Ken5233
Ken5233
回复 @Jack_Ruin : 没听出区别 ^.^ 画个图吧
J
Jack_Ruin
还不完全一样,同一台机子,A应用部署两个,B应用是文件服务应用,A的两个都会使用B的文件上传功能,A应用的图片资源都是保存在B应用的,现在是nginx转发时,访问不到B的图片资源
0
_wxyz
_wxyz
upstream web {
	server localhost:18080;
	server localhost:28080;
}

upstream file {
	server localhost:38080;
}

server {
	listen       8080;
	server_name  localhost;

	charset utf-8;

	#access_log  logs/host.access.log  main;

	location / {
		index  index.html index.htm;
		proxy_pass	http://web;
		proxy_redirect	off;
	}
	
	location ~ .*\.(gif|png|css|js) {
		index  index.html index.htm;
		proxy_pass	http://file;
		proxy_redirect	off;
	}

	#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   html;
	}
}

server {
	listen       18080;
	server_name  localhost;

	charset utf-8;

	#access_log  logs/host.access.log  main;

	location / {
		root   E:/Workspace/Lab/test_nginx_image/web1;
		index  index.html index.htm;
	}

	#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   html;
	}
}

server {
	listen       28080;
	server_name  localhost;

	charset utf-8;

	#access_log  logs/host.access.log  main;

	location / {
		root   E:/Workspace/Lab/test_nginx_image/web2;
		index  index.html index.htm;
	}

	#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   html;
	}
}

server {
	listen       38080;
	server_name  localhost;

	charset utf-8;

	#access_log  logs/host.access.log  main;

	location /resource {
		root   E:/Workspace/Lab/test_nginx_image;
		index  index.html index.htm;
	}

	#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   html;
	}
}



_wxyz
_wxyz
回复 @Jack_Ruin : 肯定会端口占用啦~~~
J
Jack_Ruin
回复 @抽象派 : 你看我贴的代码,有什么问题,启动ngixn时会报错,端口占用
J
Jack_Ruin
http://localhost:38080/zjsj-file-system/filesystem/ueditor/image/20160425/1461563592084051132.png这是我的tomcat访问路径,使用nginx后,访问路径就是http://localhost/zjsj-file-system/**,所以会报404。如果按照你上面的写法,端口就会被占用
_wxyz
_wxyz
回复 @Jack_Ruin : 你参考我这个修改,你把修改后的nginx配置贴下,我花了一中午验证了是可以的啊
J
Jack_Ruin
试了下不行,我说详细点吧,我会在我的pc机上启动三个tomcat,端口配置就是18080,28080,38080,前台个是运行我的同一个项目,最后一个是运行文件服务的,项目中的图片资源都是在文件服务里的,项目中保存的图图片url地址为/zjsj-file-system/******
0
J
Jack_Ruin
upstream web {
        server 192.168.1.108:18080;
        server 192.168.1.108:28080;
        }
 
        upstream file {
            server 192.168.1.108:38080;
        }
        
        server {
            listen       80;
            server_name  localhost;
        
            charset utf-8;
        
            #access_log  logs/host.access.log  main;
        
            location / {
                index  index.html index.htm;
                proxy_pass  http://web;
                proxy_redirect  off;
            }
            
            location ~ .*\.(gif|png|css|js) {
                index  index.html index.htm;
                proxy_pass  http://web;
                proxy_redirect  off;
            }
        
            #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   html;
            }
        }
        
        server {
            listen       18080;
            server_name  localhost;
        
            charset utf-8;
        
            #access_log  logs/host.access.log  main;
        
            location / {
                root   D:\zjr\pro\zjsj;
                index  index.html index.htm;
            }
        
            #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   html;
            }
        }
        
        server {
            listen       28080;
            server_name  localhost;
        
            charset utf-8;
        
            #access_log  logs/host.access.log  main;
        
            location / {
                root   D:\zjr\pro\zjsj;
                index  index.html index.htm;
            }
        
            #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   html;
            }
        }
        
        server {
            listen       38080;
            server_name  localhost;
        
            charset utf-8;
        
            #access_log  logs/host.access.log  main;
        
            location /zjsj-file-system {
                root   D:\zjr\pro\zjsj-file-system;
                index  index.html index.htm;
            }
        
            #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   html;
            }

        }

这是修改后

_wxyz
_wxyz
你在参考nginx负载的那一部分就行了,我只是不想启动tomcat才用nginx代替的~
返回顶部
顶部