Nginx系列笔记-动静分离实现及图片服务器

本章目录:

  1、实践动静分离;

  2、单独建立图片服务器的思路;

动静分离:

     Nginx是一种轻量级,高性能,多进程的Web服务器,非常适合作为静态资源的服务器使用,而动态的访问操作可以使用稳定的Apache、Tomcat及IIS等来实现,这里就以Nginx作为代理服务器的同时,也使用其作为静态资源的服务器,而动态的访问服务器就以Apache为例说明。

   blob.png 

说明:

    1、代理服务器和静态服务器即为一台服务器上,这里只是为了明显区分动静分离所处服务器的不同;

    2、静态服务器中,存放的资源主要是源代码文件、图片、属性、样式以及其它所有非动态的资源文件;

    3、调度规则,即为代理服务器,这里是Nginx的服务器调度规则;

    4、动态服务器,其种类比较繁多,可以是Apache、Tomcat、IIS以及其它Web服务器,它们一般分别隶属于一台服务器;

二、实现

  1、实现说明

   如上图所示,当客户端访问代理服务器时:

   首先,加载和显示存放在静态服务器中的静态资源,这里以html为例;

   其次,如果上一步没有匹配对应的资源,我们就认为是动态访问请求,那么就直接访问参与负载均衡的服务器列表中的某一台服务器的动态操作;

   最后,Nginx作为Web服务器加载静态资源(html、css、js、image),而静态资源如果需要动态获取数据,并填充到页面显示,会自动去往负载服务器获取并返回,在实现了动态分离的同时,也参与了服务器的负载均衡。

  2、准备工作

     准备两台计算机设备,分别为:

        Nginx:192.168.1.104

      动态服务器 tomcat:192.168.1.101

3、安装配置

    首先,在静态服务器中安装Nginx服务器,其次,分别配置Nginx配置如下:

#动态资源加载
	 upstream tomcat_web_test{
	     #sticky; 
		 #ip_hash; 
         server 192.168.1.101 weight=1;
   }
location / { 
          index index.html index.php index.htm;
		    root html;
			proxy_redirect     off;
           proxy_set_header Host $host;
		    proxy_set_header   X-Real-IP        $remote_addr;
    		proxy_set_header X-Forwarded-For    $remote_addr;
            proxy_pass http://tomcat_web_test;
		}
		
  #默认静态资源
		location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ 
	   { 
		 root  html; #自定义目录文件
		 #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,
		 可以设置更长,这样可以节省带宽和缓解服务器的压力
		 expires      3d; 
	   }

建立静态文件资源 如:index.css

 blob.png

Tomcat JSP:

 blob.png

最后,打开浏览器输入192.168.1.101,结果如下:

 blob.png

blob.png

   从上图,我们知道动静已经分离成功了,因为静态资源页面html加载的是静态服务器的,而动态请求操作则访问的是动态服务器。

网上有一篇很详细的文章:

   http://www.cnblogs.com/wunaozai/p/5001742.html

单独建立图片服务器的思路:

    当企业发展起来之后,简单的静态分离并不能满足业务增长需求,用户的递增,从而延迟了页面访问速度,增加流量成本,所以所有的网站都需要考虑自己图片处理的解决方案,以免在流量变大之后显得手足无措。

    如果你留心的话,可以发现,现在主流的网站都是有单独的图片服务器的,例如,人人网的为rrimg,淘宝的为taobaocdn,下面还有很多的二级域名。

    独立的图片服务器有诸多好处,其中一个就是客户端浏览器对一个主机下的连接数量限制,具体的连接数目忘记了,但基本都在10以下。也就是说,浏览器会控制一个站点下的并发请求数量在10以下,如果对于网站有很多样式文件、脚本文件和图片需要加载的话,请求的过程会被阻塞,影响网站的打开速度。  

    建立图片服务器,将图片资源放在另外一个域名下面,会在一定程度上提升网站的打开速度,这样来说的话是不是说我们独立的服务器越多越好呢?也不尽然,解析域名并建立连接也需要很长的时间,独立的主机多了的话,也不利于速度的提升。图片往往会消耗掉网站中的很多宽带和IO资源,独立的图片服务器可以在宽带和IO性能上单独提升,便于管理和拓展。

   本文只是只是简单的以Nginx为例简单的搭建图片服务器,至于更加高大上的图片服务器,后续抽空补上,之前我们使用FastDFS处理过图片文件(  FastDFS是一款类Google FS的开源分布式文件系统):

采用的如下方案:

 blob.png

配置如下:

     我们是单独将图片上传写了个APP部署在Image服务器然后VieMall上传图片是调Image服务器部署的图片服务器应用提供的上传图片的方法并将图片存放在Image服务器的本地文件夹xxx下且在nginx.conf里修改为Image服务器IP,前台访问时直接按http:+C服务器IP+文件路径+图片路径;

Nginx配置:

  blob.png

图片服务器应用:

public class VieMallPhotoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private String realPath;
	@Override
	public void init() throws ServletException {
		realPath = "/resource/images";
	}

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/gif");
		String pathInfo = request.getPathInfo();
		String fullPath = realPath + pathInfo;
		try {
			File file = new File(fullPath);
			if (!file.isFile()) {
				System.out.println("没有图片文件");
			}
			if (file.isFile()) {
				javax.servlet.ServletOutputStream servletoutputstream = null;
				try {
					response.setContentLength((int) file.length());
					servletoutputstream = response.getOutputStream();
					byte[] image = new byte[8192]; //8K
					BufferedInputStream bufferedinputstream = null;
					try {
						bufferedinputstream = new BufferedInputStream(new FileInputStream(file));
						int i;
						while ((i = bufferedinputstream.read(image, 0, 8192)) != -1) {
							servletoutputstream.write(image, 0, i);
						}
					}finally {
						if (bufferedinputstream != null) {
							bufferedinputstream.close();
						}
					}

				} catch (Exception e) {
				} finally {
					if (servletoutputstream != null) {
						try {
							servletoutputstream.close();
						} catch (Exception e) {
						}

					}
				}

			} else {
			}
		} catch (Exception e) {
		}

	}

	@Override
	public void destroy() {
		System.out.println("PicServlet destroying");
	}
}

Web.xml:

<servlet>
<description></description>
<display-name>imagesServlet</display-name>
<servlet-name>imagesServlet</servlet-name>
<servlet-class>com.viemall.service.VieMallPhotoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>imagesServlet</servlet-name>
<url-pattern>/imagesServlet</url-pattern>
</servlet-mapping>

前台页面访问图片:

  #图片服务器

   imgIp= http://192.168.1.101/imagesServlet 

   前台  <img src=”${imgIp}” >

后台应用上传图片:

   http://192.168.1.101:8080/uploadImage

  上传代码省略….


   大型网站图片服务器架构的演进

发表评论