`

nginx

 
阅读更多
一、Nginx反向代理

正向代理,也就是传说中的代理,他的工作原理就像一个跳板。简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录。结论就是,正向代理,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

反向代理.举例:

例用户访问 http://ooxx/readme但ooxx上并不存在readme页面他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户

但用户并不知情这很正常,用户一般都很笨

这里所提到的 ooxx这个域名对应的服务器就设置了反向代理功能

结论就是 反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。

正向代理和反向代理的区别,从用途上来讲:

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。

另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

从安全性来讲:

正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。

反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

开放的反向代理应用:nginx和nat123。nginx是单纯的反向代理,需要自行搭建反向代理服务才能使用,效率高。nat123是结合了NAT和反向代理的应用,可以直接使用,解决80端口问题等,速度快。

通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。

一个通过HttpProxy模块实现反向代理的简单配置:

    server {
        listen   8888;
        server_name  134.32.28.134;
        location / {
            proxy_pass http://134.32.28.134:8090;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
此配置实现在ie中输入http://134.32.28.134:8888即会调转到134.32.28.134:8090中

Upstream模块配置实现:

    upstream appserver {
         server 134.32.28.134:8090;
    }  
    server {
        listen   8888;
        server_name  134.32.28.134;
        location / {
            proxy_pass http://appserver;
        }
    }
HttpRewrite模块配置实现

    server {
        listen   8888;
        server_name  134.32.28.134;
        rewrite  http://134.32.28.134:8090/ permanent;
    }
二、Nginx负载均衡

Nginx本身提供轮询(round robin)、用户IP哈希(ip_hash)和指定权重三种方式负载均衡策略, 另外也出现第三方负载均衡模块fair和url_hash,默认情况下,Nginx以轮询作为负载均衡策略。

轮询与指定权重策略

简单配置如下:

    upstream appserver {
       server 134.32.28.134:8090 weight=5;
       server 134.32.28.134:8091 weight=2;
    }
weight是设置权重,用于后端服务器性能不均的情况。 轮询策略的缺点是某一时段内的一连串访问可能都是由同一个用户A发起的,那么第一次A的请求可能是 8090,而下一次是 8091,然后是 8090、8091…… 在大多数应用场景中,这样并不高效,并且如果后台服务器没有实现对session的共享,会导致session没有共享的。当然,也正因如此,Nginx 为你提供了一个按
照IP来hash的方式,这样每个客户端的访问请求都会被甩给同一个后端服务器。

IP哈希策略

配置如下:

    upstream appserver {
           ip_hash;
           server 134.32.28.134:8090;
           server 134.32.28.134:8091;
    }
这种策略中,用于进行hash运算的key是客户端的IP地址。这样的方式保证一个客户端每次请求都将到达同一个后台主机。当然,如果所hash到的后台服务器当前不可用,则请求会被转移到其他服务器。

down机、重试策略及备份

当某个一个服务器暂时性的宕机(down)时,你可以使用“down”来标示出来,并且这样被标示的 、服务器就不会接受请求去处理。如:

    upstream appserver {
       server 134.32.28.134:8090;
       server 134.32.28.134:8091 down;
    }
可以为每个 backend 指定最大的重试次数,和重试时间间隔。所使用的关键字是 max_fails 和 fail_timeout。如下所示:

    upstream appserver {
       server 134.32.28.134:8090;
       server 134.32.28.134:8091 max_fails=3 fail_timeout=30s;
    }
可以使用“backup”关键字。当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就只使用由 backup 标注的备机。backup不能和ip_hash关键字一起使用。举例如下:

    upstream appserver {
       server 134.32.28.134:8090;
       server 134.32.28.134:8091;
       server 134.32.28.134:8092 backup;
    }
fair(Nginx需安装第三方模块,OpenResty已经集成)

fair按后端服务器的响应时间来分配请求,响应时间短的优先分配,配置如下:

    upstream appserver {
           server 134.32.28.134:8090;
           server 134.32.28.134:8091;
           fair;
    }
url_hash(Nginx需安装第三方模块)

url_hash按访问URL的hash结果来分配请求,使每个URL定向到同一个后端服务器,后端服务器为缓存时比较适用。另外,在upstream中加入hash语句后,server语句不能写入weight等其他参数。

    upstream appserver {
           server 134.32.28.134:8090;
           server 134.32.28.134:8091;
           hash  $request_uri;
           hash_method  crc32;
    }
三、Nginx静态缓存

Nginx过Proxy Cache可以使其对静态资源进行缓存。其原理就是把静态资源按照一定的规则存在本地硬盘,并且会在内存中缓存常用的资源,从而加快静态资源的响应。

http段设置

proxy_connect_timeout 600;  #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout    600;  #连接成功后,后端服务器响应时间(代理接收超时)
proxy_send_timeout    600;  #后端服务器数据回传时间(代理发送超时)
proxy_buffer_size     32k;  #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers         4 32k;#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size  64k;           #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size  64k;       #设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_path /home/spdev/nginx/openresty/local/nginx/proxy_temp;
proxy_cache_path /home/spdev/nginx/openresty/local/nginx/cache levels=1:2
keys_zone=cache_one:200m inactive=1d max_size=30g;
#levels设置目录层次,keys_zone设置缓存名字和共享内存大小
#inactive在指定时间内没人访问则被删除在这里是1天,max_size最大缓存空间
server段设置

location ~* \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)$ {
     proxy_pass http://appserver;  #动态不缓存 
     proxy_redirect off;
     proxy_set_header Host $host;
     proxy_cache cache_one;
     proxy_cache_valid 200 302 1h;  #哪些状态缓存多长时间
     proxy_cache_valid 301 1d;
     proxy_cache_valid any 1m;      #其他的缓存多长时间  
     expires 30d;   #置失期时间,为30天
}
四、IP并发限制、带宽限制

nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。 HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。 一旦并发连接超过指定数量,就会返回503错误。HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制。

设置HttpLimitReqModul限制某一段时间内同一ip访问数

http段设置

    #限制同一ip每秒访问20次
    limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
这里定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,以$binary_remote_addr 为key,限制平均每秒的请求为20个,1M能存储16000个状态,rate的值必须为整数,如果限制两秒钟一个请求,可以设置成30r/m。

server段设置

    limit_req zone=allips burst=5 nodelay;
    #brust的意思就是,如果第1秒、2,3,4秒请求为19个,第5秒的请求为25个是被允许的。
    #但是如果你第1秒就25个请求后面的5个请求就会被限制,返回503错误。
    #nodelay,如果不设置该选项,严格使用平均速率限制请求数,
    #也就是说如果你设置rate=120r/m,相当于每秒只允许处理2个请求
设置HttpLimitZoneModule 限制并发连接数

http段设置

    #ip限制并发数
    limit_conn_zone  $binary_remote_addr zone=addr:10m;
    #服务器限制并发总数
    limit_conn_zone $server_name zone=perserver:10m;
server段设置

    #连接数限制
    limit_conn addr 10; 
    limit_conn perserver 50000;
    #连接限速
    limit_rate 500k;  
    #限制ip
    allow 132.35.75.0/24;
    #deny all;
其中allow、deny是HTTP Access模块对应的指令,以下需注意:

1、deny 一定要加一个ip,否则直接跳转到403,不往下执行了;如果403默认页是
   同一域名下,会造成死循环访问;
2、allow的ip段从允许访问的段位从小到大排列,如127.0.0.0/24 下面才能是
   10.10.0.0/16
   24表示子网掩码:255.255.255.0
   16表示子网掩码:255.255.0.0
   8表示子网掩码:255.0.0.0;
3、deny all;结尾 表示除了上面allow的其他都禁止
   如:
         deny 192.168.1.1;
         allow 127.0.0.0/24;
         allo w 192.168.0.0/16;
         allow 10.10.0.0/16;
         deny all;
五、第三方合并静态文件模块的使用

这里介绍的是淘宝开发的nginx_concat_module针对nginx的文件合并模块,主要用于合并前端代码减少http请求数。对于此模块的安装前面已经有过说明,这里不再详细解说。

nginx_concat_module模块配置

    # nginx_concat_module 主开关
    concat on;
    # 最大合并文件数
    concat_max_files 10;
    # 只允许同类型文件合并
    concat_unique on;
    # 允许合并的文件类型,多个以逗号分隔。如:application/x-javascript, text/css
    concat_types text/html;
举例如:

http://主机地址/test/??1.css,2.css,3.css…10.css,这里会将1.css,2.css...10.css 是个css文件合并为一个文件从而只需一次请求。

六、实际应用中配置实例

nginx.conf部分配置

    include  common.conf;
    include  proxy_cache.conf;
    #设定负载均衡的服务器列表
    upstream appserver {
           server 134.32.28.134:8090 weight=5;
           server 134.32.28.134:8091 weight=2;
    }
    include limit_common.conf;
    # server虚拟主机配置                                                 
    server {
        listen       8888;
        server_name  134.32.28.134;
        #设置网页的默认编码格式
        #charset utf8;     
            #根据访问域名生成对应的访问日志
        access_log  logs/host.access.log  main;    
        lua_code_cache on;                     
        location / {               
            proxy_pass http://appserver;                               
            include user_agent.conf;
            include limit_info.conf;
        }
        location /mytest {   
            content_by_lua_file conf/alcache.lua;      
        }
        location /proxy {   
                include user_agent.conf;                                       
            include limit_info.conf;
            proxy_pass http://appserver$uri;   
        }
        #静态文件缓存
        location ~* \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)$ {
             #防盗链
                 #valid_referers none blocked 134.32.28.134;
                     #if ($invalid_referer) {
                            #return 403;
                     #}
             proxy_pass http://appserver;
             proxy_redirect off;
             proxy_set_header Host $host;
             proxy_cache cache_one;
             proxy_cache_valid 200 302 1h;
             proxy_cache_valid 301 1d;
             proxy_cache_valid any 1m;
             expires 30d;
        }
此处nginx.conf中include了limit_common.conf、user_agent.conf、limit_info.conf与proxy_cache.conf,其中user_agent.conf中配置了客户端信息判断及文件合并等信息,limit_common.conf配置了ip限制相关公用信息,limit_info.conf配置了实际server中限制要求,proxy_cache.conf中配置了静态缓存相关信息,其中静态文件缓存部分为server运用中的配置。

user_agent.conf配置

#客户端判断
#if ($http_user_agent ~* "MSIE") { proxy_pass http://appserver; }
if ($http_user_agent ~* "Nokia") { rewrite . /404.html break; }
if ($http_user_agent ~* "Mobile") { rewrite . /404.html break; }
if ($http_user_agent ~* "SAMSUNG") { rewrite . /404.html break; }
if ($http_user_agent ~* "SonyEricsson") { rewrite . /404.html break; }
if ($http_user_agent ~* "MOT") { rewrite . /404.html break; }
if ($http_user_agent ~* "BlackBerry") { rewrite . /404.html break; }
if ($http_user_agent ~* "LG") { rewrite . /404.html break; }
if ($http_user_agent ~* "HTC") { rewrite . /404.html break; }
if ($http_user_agent ~* "J2ME") { rewrite . /404.html break; }
if ($http_user_agent ~* "Opera Mini") { rewrite . /404.html break; }
if ($http_user_agent ~* "ipad") { proxy_pass http://appserver; }
if ($http_user_agent ~* "iphone") { proxy_pass http://appserver; }
if ($http_user_agent ~* "android") { proxy_pass http://appserver; }
#只允许访问get、head、post方法
if ($request_method !~* ^(GET|HEAD|POST)$ ) {
        return 403;
}
#js、css文件合并
concat on;
#concat_max_files 10;
#只允许同类型文件合并
#concat_unique on;
#允许合并的文件类型,多个以逗号分隔。如:application/x-javascript, text/css
#concat_types text/html
limit_common.conf配置

#限制同一ip每秒访问20次
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
#ip限制并发数
limit_conn_zone  $binary_remote_addr zone=addr:10m;
#服务器限制并发总数
limit_conn_zone $server_name zone=perserver:10m;
limit_info.conf配置

#brust的意思就是,如果第1秒、2,3,4秒请求为19个,第5秒的请求为25个是被允许的。
#但是如果你第1秒就25个请求后面的5个请求就会被限制,返回503错误。
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
#也就是说如果你设置rate=120r/m,相当于每秒只允许处理2个请求
limit_req zone=allips burst=5 nodelay;
#连接数限制
limit_conn addr 10; 
limit_conn perserver 50000;
#连接限速
limit_rate 500k;  
#限制ip
allow 132.35.75.0/24;
#deny all;
proxy_cache.conf配置

proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /home/spdev/nginx/openresty/local/nginx/proxy_temp;
proxy_cache_path /home/spdev/nginx/openresty/local/nginx/cache levels=1:2
keys_zone=cache_one:200m inactive=1d max_size=30g;
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    一分钟搞定 Nginx反向代理 nginx域名代理

    3.找到D:\nginx\conf下nginx.conf文件用记事本打开 在文段末尾大括号前加上 include proxy.conf;(就是加载刚刚新建的那个文件(注意路径)) 4.进入cmd 进入D盘: d: 进到nginx文件夹下:cd nginx 启动nginx.exe:...

    nginx-upstream-jvm-route 和 nginx 对应版本,亲测可用

    此资源有两个文件,含 nginx-upstream-jvm-route 和 nginx 对应版本,都是tar.gz文件。 安装方法网上很多就不写了,亲测可用。 不用担心版本不匹配造成安装失败,再浪费积分去到处下载尝试的烦恼。 此资源有两个文件...

    Nginx 1.22.0 Linux 版本,解压安装。

    Nginx 1.22.0 Linux 版本,解压安装。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型...

    nginx-1.23.1.zip

    nginx/Windows-1.23.1 Nginx(发音为“engine X”[9] /ˌɛndʒɪnˈɛks/ EN-jin-EKS),风格化为NGIИX,是一个Web服务器,也可以用作反向代理,负载平衡器,邮件代理和HTTP缓存。该软件由Igor Sysoev创建,并于...

    Nginx 全能HTTP+Web 指南 完整版pdf

    Nginx全能指南是一本介绍Nginx服务器的书,首先,简要介绍Nginx的基本概念和作用,如反向代理、负载均衡等。然后,列举Nginx的优点,如高性能、可扩展性、稳定性等。接着,介绍如何安装和配置Nginx,并提供一些实用...

    使用nginx部署前端项目(超详细教程).pdf

    使用nginx部署前端项目是一篇非常详细的教程,旨在帮助初学者使用Nginx来部署前端项目。本文首先介绍了Nginx的基本概念和作用,解释了为什么Nginx是一个强大的Web服务器和反向代理。然后,文章详细讲解了如何在Linux...

    Nginx服务器的安装与配置.pdf

    Nginx官网配置.pdf Nginx基本配置.pdf Nginx模块.pdf Nginx指南.pdf 第1章 Nginx简介.pdf 第2章 Nginx服务器的安装与配置.pdf 第3章 Nginx的基本配置与优化.pdf 第4章 Nginx与PHP(FastCGI)的安装、配置与优化.pdf 第...

    nginx-1.19.3-http-flv.zip

    资源说明: 1. 采用nginx最新版编译,包含最新的nginx-http-flv-module,以及基础模块openssl、prce、zlib 2. 整体打包,已配置好nginx.conf的http-flv直播流,以及http web环境...3. 使用nginxservice.exe install安装

    nginx常用依赖包.rar

    本压缩包均为linux 64位系统的,其中包含nginx-1.14.2.tar.gz、nginx-1.15.4.tar.gz、nginx-1.16.1.tar.gz、nginx-1.17.5.tar.gz及pcre-8.41.tar.gz、pcre-8.42.tar.gz、pcre-8.43.tar.gz、pcre-8.44.tar.gz及...

    Nginx启动、重启失败的一般解决方法和步骤

    也可以通过查看Nginx日志文件定位到Nginx重启失败的原因,Nginx日志文件的路径一般在:/var/log/nginx目录下 总结 文章没什么技术含量,每天都攒一点基础知识 您可能感兴趣的文章:nginx centos 服务开机启动设置...

    linux服务器上使用nginx访问本地静态资源的方法

    vim /etc/nginx/conf.d/nginx.conf 5.重启nginx服务 service nginx restart 6.页面尝试访问本地资源 7.访问成功! 总结 以上所述是小编给大家介绍的linux服务器上使用nginx访问本地静态资源的方法,希望对大家...

    Nginx配置统计流量带宽请求及记录实时请求状态的方法

    ngx_req_status用来展示nginx请求状态信息,类似于apache的status,nginx自带的模块只能显示连接数等等信息,我们并不能知道到底有哪些请求、以及各url域名所消耗的带宽是多少。ngx_req_status提供了这些功能. 功能...

    nginx 离线安装包nginx 离线安装包

    nginx 离线安装包nginx 离线安装包

    nginx-sticky-module-1.25.zip

    nginx sticky是nginx的module,可以实现基于cookie的负载均衡。 下载后,在编译安装nginx时,用--add-module选项,指到sticky所在目录。类似命令如下: ./configure --prefix=/usr/local/nginx-1.6.0 --add-module=...

    nginx-1.18.0离线安装依赖包及过程

    nginx-1.18安装步骤 附件上传至服务器/opt/nginx cd /opt/nginx tar zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure make make install tar zxvf pcre-8.40.tar.gz cd pcre-8.40 ./configure make make ...

    Nginx文件上传模块配置

    Nginx是一个高性能的HTTP和反向代理服务器,也是IMAP/POP3/SMTP代理服务器,是由俄罗斯人lgor Sysoev开发,支持模块加载和卸载,其中upload_module和upload_progress_module就是第三方开发的模块,并没有加入到Nginx...

    Nginx日志管理介绍

    Nginx日志描述 通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的...

    可自动按天分割日志的nginx (根据nginx源代码修改得来)

    将在 logs目录下生成类似 2014-01-21.access.log 的log文件,这个日期会根据服务器的时间变化) 配置可参照 nginx目录下的 conf/nginx.conf 文件进行log配置 源码留给有特殊需要的朋友自己编译。此源码就是修改后的...

    Centos7环境下Nginx版本升级方式及步骤

    此手册主要用于记录个人进行nginx升级的步骤和心得,介绍了2种升级方式。 YUM upgrade升级:本方式适用于使用rpm安装nginx的方式,优点是升级操作简单便捷,缺点是无法升级到指定版本,默认升级至YUM安装支持的...

Global site tag (gtag.js) - Google Analytics