nginx 反向代理和负载均衡策略实战案例

幸运
185
文章
0
评论
March 15, 202009:35:27 评论 92 6781字阅读22分36秒

引言

存在即合理,那为什么要使用Nginx呢?这得看看Nginx能帮我们做些什么。

首先,nginx能做反向代理【关于反向代理和正向代理此处不做说明了,感兴趣的小伙伴自行谷歌】;比方说,我想在本地使用 www.glmapper1.com 的域名去访问www.taobao.com。那么这个时候我们就可以通过nginx去实现。

再者,nginx能实现负载均衡,什么是负载均衡呢?就是说应用部署在不同的服务器上,但是通过统一的域名进入,nginx则对请求进行分发,将请求分发到不同的服务器上去处理,这样就可以有效的减轻了单台服务器的压力。

在上面这两种情况下,nginx服务器的作用都只是作为分发服务器,真正的内容,我们可以放在其他的服务器上,这样来,还能起到一层安全隔壁的作用,nginx作为隔离层。

解决跨域问题

同源:URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。

浏览器的同源策略:浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性。从一个域上加载的脚本不允许访问另外一个域的文档属性。

因为nginx和tomcat不能共用同一端口,url一样,端口不同,这样就会有跨域问题。

PS:点到为止,这里本次测试没有涉及,就不妄自菲薄了!!!

配置文件解析

配置文件主要由四部分组成:

main(全区设置)
server(主机配置)
http(控制着nginx http处理的所有核心特性)

  • location(URL匹配特定位置设置)。

upstream(负载均衡服务器设置)
下面以默认的配置文件来说明下具体的配置文件属性含义:

#Nginx的worker进程运行用户以及用户组
#user  nobody;

#Nginx开启的进程数
worker_processes  1;

#定义全局错误日志定义类型,[debug|info|notice|warn|crit]
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#指定进程ID存储文件位置
#pid        logs/nginx.pid;


#事件配置
events {


    #use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
    #epoll模型是Linux内核中的高性能网络I/O模型,如果在mac上面,就用kqueue模型。
    use kqueue;

    #每个进程可以处理的最大连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。理论值:worker_rlimit_nofile/worker_processes
    worker_connections  1024;
}

#http参数
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压缩输出
    #gzip  on;

    #虚拟主机基本设置
    server {
        #监听的端口号
        listen       80;
        #访问域名
        server_name  localhost;

        #编码格式,如果网页格式与当前配置的不同的话将会被自动转码
        #charset koi8-r;

        #虚拟主机访问日志定义
        #access_log  logs/host.access.log  main;

        #对URL进行匹配
        location / {
            #访问路径,可相对也可绝对路径
            root   html;
            #首页文件,匹配顺序按照配置顺序匹配
            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;
        }

        #访问URL以.php结尾则自动转交给127.0.0.1
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        #php脚本请求全部转发给FastCGI处理
        # 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;
        #}

        #禁止访问.ht页面
        # 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       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    #HTTPS虚拟主机定义
    # 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;
    #    }
    #}
    include servers/*;
}

反向代理实例

假设我现在需要本地访问www.baidu.com;配置如下:

server {
    #监听80端口
    listen 80;
    server_name localhost;
     # individual nginx logs for this web vhost
    access_log /tmp/access.log;
    error_log  /tmp/error.log ;

    location / {
        proxy_pass http://www.baidu.com;
    }

验证结果:

nginx 反向代理和负载均衡策略实战案例

可以看到,我在浏览器中使用localhost打开了百度的首页…

负载均衡实例

下面主要验证最常用的三种负载策略。虚拟主机配置:

server {
    #监听80端口
    listen 80;
    server_name localhost;

    # individual nginx logs for this web vhost
    access_log /tmp/access.log;
    error_log  /tmp/error.log ;

    location / {
        #负载均衡
        #轮询 
        #proxy_pass http://polling_strategy;
        #weight权重
        #proxy_pass http://weight_strategy;
        #ip_hash
        # proxy_pass http://ip_hash_strategy;
        #fair
        # proxy_pass http://fair_strategy;
        #url_hash
        # proxy_pass http://url_hash_strategy;
        #重定向
        #rewrite ^ http://localhost:8080;
    }

轮询策略

# 1、轮询(默认)
# 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
upstream polling_strategy { 
    server glmapper.net:8080; # 应用服务器1
    server glmapper.net:8081; # 应用服务器2
}

测试结果(通过端口号来区分当前访问):

8081:hello
8080:hello
8081:hello
8080:hello

权重策略

#2、指定权重
#指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
upstream  weight_strategy { 
    server glmapper.net:8080 weight=1; # 应用服务器1
    server glmapper.net:8081 weight=9; # 应用服务器2
}

测试结果:总访问次数15次,根据上面的权重配置,两台机器的访问比重:2:13;满足预期!

ip hash策略

#3、IP绑定 ip_hash
#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,
#可以解决session的问题;在不考虑引入分布式session的情况下,
#原生HttpSession只对当前servlet容器的上下文环境有效
upstream ip_hash_strategy { 
    ip_hash; 
    server glmapper.net:8080; # 应用服务器1
    server glmapper.net:8081; # 应用服务器2
}

iphash 算法:ip是基本的点分十进制,将ip的前三个端作为参数加入hash函数。这样做的目的是保证ip地址前三位相同的用户经过hash计算将分配到相同的后端server。作者的这个考虑是极为可取的,因此ip地址前三位相同通常意味着来着同一个局域网或者相邻区域,使用相同的后端服务让nginx在一定程度上更具有一致性。

为什么说要解释下iphash,因为采坑了;和猪弟在进行这个策略测试时使用了5台机器来测试的,5台机器均在同一个局域网内【192.168.3.X】;测试时发现5台机器每次都路由到了同一个服务器上,一开始以为是配置问题,但是排查之后也排除了这个可能性。最后考虑到可能是对于同网段的ip做了特殊处理,验证之后确认了猜测。

其他负载均衡策略

这里因为需要安装三方插件,时间有限就不验证了,知悉即可!

#4、fair(第三方)
#按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
upstream fair_strategy { 
    server glmapper.net:8080; # 应用服务器1
    server glmapper.net:8081; # 应用服务器2
    fair; 
}
#5、url_hash(第三方)
#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,
#后端服务器为缓存时比较有效。 
upstream url_hash_strategy { 
    server glmapper.net:8080; # 应用服务器1
    server glmapper.net:8081; # 应用服务器2 
    hash $request_uri; 
    hash_method crc32; 
}

重定向rewrite

location / {
    #重定向
    #rewrite ^ http://localhost:8080;
}

验证思路:本地使用localhost:80端口进行访问,根据nginx的配置,如果重定向没有生效,则最后会停留在当前localhost:80这个路径,浏览器中的地址栏地址不会发生改变;如果生效了则地址栏地址变为localhost:8080;

通过验证,满足预期!

总结

本文先对nginx的作用和基本的配置做了简单说明;然后通过负载均衡的实例测试了不同负载均衡算法的具体应用反馈结果。帮助自己更加深刻的理解nginx服务器中的一些配置细节。感谢刘秘提供的helloworld程序【基于springboot的脚手架,有需要的可以联系他获取;还有就是刘秘是个男的…😜】

本文来源于:nginx 反向代理和负载均衡策略实战案例-幸运草博客
特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。

  • 本站QQ群
  • weinxin
  • 捐赠本站
  • weinxin
Nginx手把手安装 Nginx

Nginx手把手安装

Netcraft 发布了2018年1月 Web 服务器调查报告,排名前三的依然是 Microsoft、Apache 和 nginx 。 Nginx为什么值得学习呢?可以看这篇文章 → Nginx的优点 (我保证可以点进去) 1.系统环境准备 安装Nginx,一般都是选择linux环境下安装。可以在虚拟机里面搭建一个或者在阿里云、腾讯云、滴滴云等买一个相对便宜的。 2.环境调试确认 网络畅通,ping 一下百度,查看公网连通性 √ yum可用,yum list | grep gcc ,查看yum源是否可用。√ 关闭iptables,可以使用iptables -L 查看是否存在iptables规则;关闭:iptables -F 关闭selinux,使用 getenforce ,  查看状态,使用 setenforce 0  关闭selinux。 安装库: yum -y  install gcc gcc-c++ autoconfig pcre pcre-devel make automake yum -y  install wget  httpd-tools vim 3.配置Nginx的yum源 进入官网 nginx.org,打开下载页面,可以看到三个模块: 继续往下拉,我选择使用yum安装nginx 按照官网文档说明,步骤如下: 创建文件 nginx.repo,执行命令 vi /etc/yum.repos.d/nginx.repo 按i 输入以下内容: name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 提示:标红部分按照你的实际情况做相应的替换。版本号写大版本即可,比如 7 不写7.3这样的 使用:lsb_release -a 可以查看你的l机器的版本。(这个命令适用于所有的Linux发行版,包括Redhat、SuSE、Debian…等发行版) 使用:cat /etc/redhat-release (仅限REDHAT系列的linux使用) 配置完毕之后,按Esc之后,输入 :wq 保存退出。 检查yum源,输入yum list | grep nginx 4.开始安装 安装:yum install nginx 等待.... 安装完毕使用 nginx -v查看安装是否成功 本文来源于:Nginx手把手安装-幸运草博客 特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。
nginx实例 - 如何防止大图片占满带宽? Nginx

nginx实例 – 如何防止大图片占满带宽?

场景 前几天网站出现了访问缓慢的情况,查看系统资源状况后,发现出网带宽一直是占满的状态 查看服务器日志,发现了很多10M左右的超大图片的请求,这些图片占满了带宽,严重影响了其他的访问请求 正常情况下是应该访问缩放过的小图,一般在100K以内,查找问题和修改程序来不及,需要紧急处理 想到的方法就是对大图的加载进行限速 配置 修改nginx配置文件中图片访问的配置部分 思路: 对于正常小图的访问不限制,把正常图的大小限定为 100K 以内,超出时就进行限速,速度限定为最大 100k/s location ~ .*.(gif|jpg|jpeg|png|bmp)$ { expires 30d; limit_rate_after 100k; limit_rate 100k; } limit_rate_after 100k; limit_rate 100k; 这两句的意思就是当图片加载了100k以后进行限速,最高 100k 测试 测试服务器带宽为1M,准备了一张3.3M的图片 分别测试限速前后的网络情况,使用网络监控命令进行查看 限速前 访问图片,查看网络流量状态,速度一直保持在 130k/s 左右,正好为1M带宽的满载状态 限速后 访问图片,查看网络流量状态,速度一直保持在 100k/s 左右,说明限速成功 本文来源于:nginx实例 - 如何防止大图片占满带宽?-幸运草博客 特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。
Nginx网站服务 Nginx

Nginx网站服务

1、Nginx:(优点) (1)高性能、轻量级web服务软件 (2)稳定性高 (3)系统资源消耗低 (4)对http并发连接的处理能力强 2、apache和nginx的区别: Apache:是多进程web服务,适合cpu密集型业务  如:数据库查询、计算等。 Nginx:是单进程web服务,适合磁盘IO密集型业务 如:视频,音频网站。并发能力强。 在企业中经常使用nginx和apache结合,前端为nginx,处理高并发进行调度;后端由多台apache进行业务响应,实现负载均衡。 3、Nginx的安装 (1)安装支持软件 pcre-devel           zlib-devel (2)创建运行用户、组 Useradd  -M  -s  /sbin/nologin  nginx (3)编译安装 ./configure  --prefix=/usr/local/nginx  --user=nginx --group=nginx  --with-http_stub_status_module(状态统计模块) 4、Nginx的运行控制 nginx  -t            检查nginx语法 启动nginx         nginx     端口号:80 重新加载nginx     killall -s  HUP  nginx 退出nginx         killall -s  QUIT  nginx 杀死nginx         killal -s  KILL  nginx 5、主配置文件nginx.conf的配置项:路径:/usr/local/nginx/conf/nginx.conf (1)全局配置 worker_processes        工作进程数 (2)I/O配置:使用”events{ }”界定标记 worker_connections       每进程处理连接数 (3)HTTP配置:包括日志、端口及IP、网页目录、默认字符集、连接保持时间、虚拟主机、PHP解析等 (子标记:server{ }代表一个虚拟主机) 6、LNMP:Linux、Nginx、Mysql、PHP (1)由于nginx不能直接支持PHP,编译安装PHP时 必须启用fpm模块以解析PHP网页。(--enable-fpm) php-fpm进程    端口号为:9000 启动命令:php-fpm或 /usr/local/sbin/php-fpm(安装php时创建了链接文件) 停止命令:killall  php-fpm (2)也可以使用LAMP服务器最为代理解析PHP动态网页 本文来源于:Nginx网站服务-幸运草博客 特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。
nginx配置二级域名 Nginx

nginx配置二级域名

主机域名配置那些事 server_name 匹配顺序 nginx中的server_name是用于指定基于名称的虚拟主机,匹配顺序是在配置文件中检索,从上到下,一匹配到符合的则终止,所以配置得按照精准在上,模糊在下来配置。server在配置文件中可以有多个哦。 精准的server_name: server {   listen 80;   server_name test.org www.test.org } *通配符匹配 server {   listen 80;   server_name *.test.org } server {   listen 80;   server_name www.*; } 正则匹配 server {   listen 80;   server_name ~^(?<www>.+).test.org$; } 例子 一个server块配置多个站点 server {   listen 80;   server_name ~^(www.)?(.+)$;   index index.html index.htm;   root /data/www/$2; } 这样的站点意思是匹配所有www开头的,$2对应正则匹配的第二块,也就是(.+)路径,路径自行创建指定,确保有权限,实际目录结构如下: /data/www/test.org /data/www/test123.org /data/www/baidu.com 一个server块中匹配多个二级域名 server {   listen 80;   server_name ~^(.+)?.test.org$;   index index.html;   if ($host = test.org) {       rewrite ^http://www.test.org permanent;   }   root /data/www/test.org/$1; } 对应匹配如下: /data/www/test.org/www /data/www/test.org/hello /data/www/test.org/world...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: