nginx实现负载均衡和动静分离

nginx配置(windows配置),供大家参考,具体内容如下

以下是我的项目用到的一份配置文件

#user nobody;
worker_processes 4; #进程数,一般cpu是几核就写多少

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

#pid logs/nginx.pid;

events {
 worker_connections 1024;#单个进程的最大连接数
}

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;

 sendfile on;
 #tcp_nopush on;

 #keepalive_timeout 0;
 keepalive_timeout 65;
 proxy_connect_timeout 15s;
 proxy_send_timeout 15s;
 proxy_read_timeout 15s;
 fastcgi_buffers 8 128k;

 gzip on;
 client_max_body_size 30m;
 gzip_min_length 1k;
 gzip_buffers 16 64k;
 gzip_http_version 1.1;
 gzip_comp_level 6;
 gzip_types text/plain application/x-javascript text/css application/xml application/javascript image/jpeg image/gif image/png image/webp;
 gzip_vary on;

 #第一个集群
 upstream xdx.com{
 server 119.10.52.28:8081 weight=100;
 server 119.10.52.28:8082 weight=100;

 }

 #第二个集群,用于上传图片所用
 upstream xdxfile.com{
 server 119.10.52.28:8081;#关于文件上传的请求均访问这个集群
 }

 #第三个集群
 upstream xdx8082.com{
 server 119.10.52.28:8082;#8082
 }

 #第四个集群
 upstream xdxali.com{
 server 139.196.235.228:8082;#阿里云
 }

 #第五个集群
 upstream xdxaliws.com{
 server 139.196.235.228:8886;#阿里云websocket
 }
#第一个代理服务器,监听的是80端口,监听的域名是www.wonyen.com或者wonyen.com
 server {
 listen 80;#监听的端口
 server_name www.wonyen.com wonyen.com;#监听的域名

 #charset koi8-r;

 #access_log logs/host.access.log main;

 #location指的是访问的路径,下面这条配置表示当访问网站的根目录,即访问wonyen.com或者www.wonyen.com的时候,就去根目录为html的下面去寻找index.html或者index.htm。在index.html这个页面里面你可以做一些重定向的工作,跳转到指定页面

 #也可以自定义到某个集群
 # location / {
  # root html;
  # index index.html index.htm;
 #}
 #所有静态请求都交由nginx处理,存放目录为webapps下的root,过期时间为30天
  location ~ \.(css|js|gif|jpg|jpeg|png|bmp|swf|eot|svg|ttf|woff|mp3|mp4|wav|wmv|flv|f4v|json)$ {
  root apache-tomcat-8.0.9-windows-x86-yipin-8081/apache-tomcat-8.0.9/webapps/ROOT;
  expires 30d;
 }

 #配置以Att结尾的请求的处理集群为http://xdxfile.com
 location ~ ^/\w+Att{
  proxy_pass http://xdxfile.com;
 }

 #配置以Fill结尾的请求的处理集群为http://xdxfile.com
 location ~ ^/\w+Fill{
  proxy_pass http://xdxfile.com;
 }

 #精准配置,如果请求名为/crowdFundSave,则
 location = /crowdFundSave{
  proxy_pass http://xdxfile.com;
 }

 #精确配置,同上
 location = /crowdFundRewardSave{
  proxy_pass http://xdxfile.com;
 }

 #精确配置,同上
 location = /garbageCategorySave{
  proxy_pass http://xdxfile.com;
 }

 #精确配置,同上
 location = /mailTestAjax{
  proxy_pass http://xdx8082.com;
 }

 #精确配置,同上
 location = /mailSendAjax{
  proxy_pass http://xdx8082.com;
 }

 #精确配置,同上
 location = /mailOldAjax{
  proxy_pass http://xdx8082.com;
 }

 #精确配置,同上
 #location = /wechatAuthority{
  #proxy_pass http://xdxali.com;
 #}
 location ~ ^/ueditor1_4_3{
  proxy_pass http://xdxfile.com;
 }
 #其他所有请求都访问 http://xdx.com的集群
  location ~ .*$ {
  index index;
  proxy_pass http://xdx.com;
  }
 #404页面访问/Error404.jsp这个location
 error_page 404  /Error404.jsp;

 #500等页面也访问 /Error404.jsp这个location
 error_page 500 502 503 504 /Error404.jsp;

 #配置请求/Error404.jsp就访问http://xdxfile.com集群
 location = /Error404.jsp {
  proxy_pass http://xdxfile.com;
 }

 # 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  html;
 # fastcgi_pass 127.0.0.1:9000;
 # fastcgi_index index.php;
 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
 # include fastcgi_params;
 #}

 # deny access to .htaccess files, if Apache's document root
 # concurs with nginx's one
 #
 #location ~ /\.ht {
 # deny all;
 #}
 }

 # another virtual host using mix of IP-, name-, and port-based configuration
 #另外一个代理服务器,监听8886接口,监听的域名为www.wonyen.com或者wonyen.com
 server {
 listen 8886;
 server_name www.wonyen.com wonyen.com;
#配置若请求为wonyen.com:8086(根目录),就让他去访问http://xdxaliws.com这个集群,这边配置的是websocket的服务端
 location / {
  proxy_pass http://xdxaliws.com;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
 }
 }

 # HTTPS server
 #
 #server {
 # listen 443 ssl;
 # server_name localhost;

 # ssl_certificate cert.pem;
 # ssl_certificate_key cert.key;

 # ssl_session_cache shared:SSL:1m;
 # ssl_session_timeout 5m;

 # ssl_ciphers HIGH:!aNULL:!MD5;
 # ssl_prefer_server_ciphers on;

 # location / {
 # root html;
 # index index.html index.htm;
 # }
 #}

}

以上就是我的一个配置。基本上需要注意的都在配置文件中注解。我把几个重要的地方单独拿出来讲一下。

1.集群的配置,我在上面的配置里有定义多个集群,集群按字面的意思理解就是由多台服务器构成的一个集合,典型的例子如

upstream xdx.com{
 server 119.10.52.28:8081 weight=100;
 server 119.10.52.28:8082 weight=100;

 }

这样的一个配置,这个集群包含了两个分支,我们可以在两台服务器上搭建相同的项目(上述的例子是在同样的服务器,不同的端口部署相同的项目,因为笔者的服务器有限),当有请求是需要这个集群来处理的时候,nginx会随机分配,当然也可以配置权重来设置两个server的访问概率。这就是负载均衡的原理。我们在多台服务器上部署相同的项目,利用nginx对请求进行转发,这样可以降低只有一台服务器所造成的的负载过大,而且当其中一台服务器挂掉以后,nginx会分配另外一台服务器来工作,这样就不会造成服务停止了。

2.server配置项代表的是一个代理服务器,上面的文件中我们配置了两个文件,分别监听wonyen.com(www.wonyen.com)这两个域名的80和8886端口,所有访问wonyen.com:80(即wonyen.com)这个域名下的请求,都按照第一个server所定义的规则去转发,而所有访问wonyen.com:8886下的请求,则会按照第二个server所定义的规则去转发。

3.我们甚至可以通过配置来处理多个域名,看以下的例子。下面的例子我配置了两个域名的规则,一个是iis服务器,一个是tomcat服务器,主要目的是为了解决80端口只能被一个程序使用的问题。如果iis用了80,tomcat就用不了,反之亦然。所以我给iis和tomcat都分配除了80以外的端口,而把80端口留给niginx。由nginx来分配请求给不同的网站。

复制代码

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

events {
 worker_connections 1024;
}

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;

 sendfile on;
 #tcp_nopush on;

 #keepalive_timeout 0;
 keepalive_timeout 65;

 gzip on;
 client_max_body_size 30m;
 gzip_min_length 1k;
 gzip_buffers 16 64k;
 gzip_http_version 1.1;
 gzip_comp_level 6;
 gzip_types text/plain application/x-javascript text/css application/xml application/javascript image/jpeg image/gif image/png image/webp;
 gzip_vary on;
 upstream achina.com{
 server 120.76.129.218:81;

 }
 upstream qgrani.com{
 server 120.76.129.218:8080;

 }

 server {
 listen 80;
 server_name www.achinastone.com achinastone.com;

 #charset koi8-r;

 #access_log logs/host.access.log main;

 location / {
  root html;
  index index.html index.htm;
 }
  #其他请求
  location ~ .*$ {
  index index;
  proxy_pass http://achina.com;
  }

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

 # 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  html;
 # fastcgi_pass 127.0.0.1:9000;
 # fastcgi_index index.php;
 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
 # include fastcgi_params;
 #}

 # deny access to .htaccess files, if Apache's document root
 # concurs with nginx's one
 #
 #location ~ /\.ht {
 # deny all;
 #}
 }

 # another virtual host using mix of IP-, name-, and port-based configuration
 #
 server {
 listen 80;
 server_name www.qgranite.com qgranite.com;

 location / {
  root html;
  index index.html index.htm;
 }
  #所有静态请求都交由nginx处理,存放目录为webapp
  location ~ \.(css|js|gif|jpg|jpeg|png|bmp|swf|eot|svg|ttf|woff|mp3|mp4|wav|wmv|flv|f4v)$ {
  root apache-tomcat-8.0.9\webapps\ROOT;
  expires 30d;
 }
  #其他请求
  location ~ .*$ {
  index index;
  proxy_pass http://qgrani.com;
  }
 }

 # HTTPS server
 #
 #server {
 # listen 443 ssl;
 # server_name localhost;

 # ssl_certificate cert.pem;
 # ssl_certificate_key cert.key;

 # ssl_session_cache shared:SSL:1m;
 # ssl_session_timeout 5m;

 # ssl_ciphers HIGH:!aNULL:!MD5;
 # ssl_prefer_server_ciphers on;

 # location / {
 # root html;
 # index index.html index.htm;
 # }
 #}

}

4.还有一个就是动静分离,说得通俗一点就是,把请求数据(动)与请求图片(静)分开,在tomcat里,当我们没有做动静分离的时候,tomcat把对图片的请求也会当成一个动态的请求,而处理动态请求是比较费性能的(至于为什么,我也不太清楚)。所以我们可以使用nginx配置来实现动静分离。

我的做法是把其中一个tomcat项目放在nginx的根目录下,这样,我们就可以通过以下方式来配置,实现当我们访问图片,js,css等静态资源的时候,都到一个指定的目录去访问。这样做的好处除了节省性能,还有一个就是我们不需要在所有的负载均衡服务器中都同步保留这些静态资源,只需要在一个地方保留就好了。配置如下

#所有静态请求都交由nginx处理,存放目录为webapps下的root,过期时间为30天
  location ~ \.(css|js|gif|jpg|jpeg|png|bmp|swf|eot|svg|ttf|woff|mp3|mp4|wav|wmv|flv|f4v|json)$ {
  root apache-tomcat-8.0.9-windows-x86-yipin-8081/apache-tomcat-8.0.9/webapps/ROOT;
  expires 30d;
 }

5.既然读取静态资源是从这个目录读取的,那么我们必须考虑如何存储静态资源,特别是当我们做了负载均衡以后,在我们的 项目中上传图片的请求有可能在任意一个集群的分支中被调用,比如我们的集群中有A,B两台服务器,他们都有可能做上传图片这件事情,如果A调用了上传图片这个请求,则图片则被上传到了A这台服务器上,反之就是B上面。这样势必导致A,B两台服务器上的静态图片是不同步的,当我们要访问这些图片的时候,(假设此时我们还没做动静分离)就有可能出现访问不到的情况。由于上一步我们做了动静分离,现在的问题就演变为,如何把这些A,B服务器上传的图片,都同步到我们做动静分离的那个文件夹下。人工或者程序去同步都很麻烦,我的做法是指定一台服务器(也就是nginx安装的那台服务器)的tomcat项目(也就是部署在nginx根目录下的那个tomcat项目),让它专门来负责上传图片的工作,这样所有的图片都由这个tomcat项目来上传,也就保证了静态库中的图片就是完整的图片。为此我配置了一个集群,如下。

#第二个集群,用于上传图片所用
 upstream xdxfile.com{
 server 119.10.52.28:8081;#关于文件上传的请求均访问这个集群
 }

然后在location中我这样配置:

 #配置以Att结尾的请求的处理集群为http://xdxfile.com
 location ~ ^/\w+Att{
  proxy_pass http://xdxfile.com;
 }

 #配置以Fill结尾的请求的处理集群为http://xdxfile.com
 location ~ ^/\w+Fill{
  proxy_pass http://xdxfile.com;
 }

因为我把所有涉及到附件上传的请求都加上了Att或者Fill的后缀,当nginx捕获这些后缀名的请求的时候,就会把他们都交给 http://xdxfile.com这个集群,也就是119.10.52.28:8081这个项目。

6.做了负载均衡以后,有一个不得不面临的问题就是内存数据的同步,我们在程序中有时候会把一些数据存放在内存中,典型的一类数据就是session。如何让session数据在集群的各个分支中共享session呢,这边要用到一个新的东西,叫做redis。我会在下一篇文章中详细地介绍。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 如何使用nginx充当mysql的负载均衡器

    说明:nginx版本要求是1.9以上 ,编译nginx的时候需要加上 --with-stream 如: ./configure --prefix=/Data/apps/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-stream 注意 1.因为mysql默认使用了3306端口所以配置nginx t

  • 详解Nginx服务器之负载均衡策略(6种)

    一.关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器.详情请查看我的另一篇博客. 二.Nginx负载均衡策略 负载均衡用于从"upstream"模块定义的后端服务器列表中选取一台服务器接受用户的请求.一个最基本的upstream模块是这样的,模块内的server是服务器列表: #动态服务器组 upstream dynamic_zuoyu { server localhost:8

  • Nginx 负载均衡算法及故障转移解析

    概述 Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡.故障转移.失败重试.容错.健康检查等. 当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器). 配置 upstream backServer{ server 127.0.0.1:8080; server 127.0.0.1:8081; } server { listen 80; server_name www.itmayiedu.com; location / { #

  • linux下nginx负载均衡搭建的方法步骤

    首先先了解下负载均衡,假设一个场景,如果有1000个客户同时访问你服务器时,而你只有一台服务器的Nginx,且只有一个MySQL服务器,那么这些请求 可能会高出你的的服务器承受能力,就会down掉: 解决方法: 1.垂直升级:就是增加服务器的配置,CPU,内存等 2.水平升级:添加多台服务器来分担服务器压力 常见的负载均衡器 根据工作在的协议层划分可划分为: 四层负载均衡:根据请求报文中的目标地址和端口进行调度 七层负载均衡:根据请求报文的内容进行调度,这种调度属于「代理」的方式 根据软硬件划分

  • Nginx+Tomcat高性能负载均衡集群搭建教程

    Nginx是一个高性能的HTTP服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.其占有内存少,并发能力强,在同类型的网页服务器中表现较好.Nginx可以在大多数Unix Linux OS上编译运行,并有Windows移植版.一般情况下,对于新建站点,建议使用最新稳定版作为生产版本. 单个Tomcat最大支持在线访问是500左右,要通知支持更多的访问量一个Tomcat就没法做到了.在这里我们采用集群部署方式,使用多个Tomcat,反向代理使用Nginx. 架构如下: 准备工作 a

  • 详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南

    Nginx是一种服务器软件,也是一种高性能的http和反向代理服务器,同时还是一个代理邮件服务器.也就是说,我们在Nginx上可以发布网站,可以实现负载均衡(提高应答效率,避免服务器崩溃),还可以作为邮件服务器实现收发邮件等功能.而最常见的就是使用Nginx实现负载均衡. Nginx与其他服务器的性能比较: Tomcat服务器面向Java语言,是重量级的服务器,而Nginx是轻量级的服务器.Apache服务器稳定.开源.跨平台,但是Apache服务器不支持高并发,Nginx能支持处理百万级的TC

  • Nginx+Tomcat负载均衡及动静分离群集的实现

    目录 Nginx配置反向代理的主要参数 动静分离原理 Nginx静态处理优势 配置Nginx+Tomcat负载均衡,动静分离 配置Nginx负载均衡器 部署两台Tomcat 动静分离配置 配置动态页面请求 Nginx负载均衡模式 Nginx配置反向代理的主要参数 upstream服务池名{}配置后端服务器池,以提供响应数据 proxy_pass http://服务池名配置将访问请求转发给后端服务器池的服务器处理 动静分离原理 服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源由Ng

  • nginx实现负载均衡和动静分离

    nginx配置(windows配置),供大家参考,具体内容如下 以下是我的项目用到的一份配置文件 #user nobody; worker_processes 4; #进程数,一般cpu是几核就写多少 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024;#单

  • Docker Nginx容器和Tomcat容器实现负载均衡与动静分离操作

    下载Tomcat8镜像 [root@localhost ~]# docker search tomcat8 NAME DESCRIPTION STARS OFFICIAL AUTOMATED ashince/tomcat8 Tomcat GUI Manager pre-configured docker ima- 5 podbox/tomcat8 2 [OK] 这个tomcat包含了jdk而且启动了可以直接访问,自己启动了8080端口 [root@localhost ~]# docker pul

  • Nginx+Tomcat实现负载均衡、动静分离的原理解析

    一.Nginx 负载均衡实现原理 1.Nginx 实现负载均衡是通过反向代理实现 反向代理(Reverse Proxy) 是指以 代理服务器(例:Nginx) 来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器(例:Tomcat),并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器(例:Nginx)对外就表现为一个反向代理服务器. 我们从客户端的视野来看,实际上客户端并不知道真实的服务提供者是哪台服务器,它只知道它请求了反向代理服务器.因

  • Nginx负载均衡以及动静分离的原理与配置

    目录 一.Nginx实现负载均衡原理 二.Nginx动静分离原理 Nginx 静态处理优势 三.Nginx + Tomcat 动静分离.负载均衡配置步骤 环境准备: 动静分离配置 Nginx 负载均衡模式 总结 一.Nginx实现负载均衡原理 Nginx实现负载均衡是通过反向代理实现 Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发. 但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat

  • Nginx Tomcat负载均衡动静分离原理解析

    目录 nginx实现负载均衡原理 nginx动静分离原理 nginx静态处理优势 nginx+tomcat动静分离.负载均衡配置 1.准备三台服务器,nginx作为负载均衡器,tomcat作为应用服务器 2.部署nginx负载均衡器 3.部署两台tomcat应用服务器 4.动静分离配置 5.测试效果 nginx负载均衡中4层代理和7层代理 4层代理和7层代理 代理原理 优缺点对比 nginx支持的代理类型 nginx负载均衡模式 Nginx 四层代理配置 nginx实现负载均衡原理 Nginx实

  • 使用nginx做负载均衡的模块解读

    使用nginx做负载均衡的两大模块: upstream 定义负载节点池. location 模块 进行URL匹配. proxy模块 发送请求给upstream定义的节点池. upstream模块解读 nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块,所支持的代理方式有 proxy_pass(一般用于反向代理),fastcgi_pass(一般用于和动态程序交互),memcached_pass,proxy_next_upstream,fastcgi_next_p

  • springboot整合Nginx实现负载均衡反向代理的方法详解

    目录 一.百度百科 二.Nginx作为web服务器 三.Nginx处理请求逻辑图 四.Nginx的优点 五.Nginx应用场景 1.反向代理 2.负载均衡 3.动静分离 六.Nginx的常用命令 1.启动 2.从容停止 3.快速停止 4.强制停止 5.重启 6.重启Nginx服务 七.Nginx配置文件 八.Nginx 配置实例-反向代理实例 1.实现效果 2.准备工作 3.访问过程的分析 4.具体配置 5.最终测试 九.Nginx 的原理 1.mater 和 worker 2.worker 如

  • Nginx四层负载均衡的配置指南

    一.四层负载均衡介绍 什么是四层负载均衡 所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器. 以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器.TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作.在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,

  • 详解Linux系统配置nginx的负载均衡

    详解Linux系统配置nginx的负载均衡 负载均衡的几种方式: 1.轮询:默认按照时间顺序对所有服务器一个一个的访问,如果有服务器宕机,会自动剔除: 2.weight:服务器的方位几率和weight成正比,这个可以在服务器配置不均的时候进行配置: 3.ip_hash:对每个请求的ip进行hash计算,并按照一定的规则分配对应的服务器(可解决session共享): 4.fair:按照每台服务器的响应时间(rt)来分配请求,rt知道优先分配: 5.url_hash:按照访问url的hash值来分配

随机推荐