湖北快3今天红号预测号码|湖北快3开奖时间是
展开
湖北国联计算机科技有限公司
  • 首页HOME
  • 公司简介INTRODUCTION
  • 安全防御DEFENSE
  • 软件开发SOFTWARE
  • 物联网IOT
  • 运行维护SRE
  • 成功案例CASE
  • 联系我们CONTACT
  • Technology Services |技术服务

    那些实用的Nginx规则
    来源:湖北国联计算机科技有限公司-荆州网站建设-荆州软件开发-政府网站建设公司 时间:2018-12-07

    1.  内置语法

    先介绍Nginx默认已支持的内置功能,靠这些基本就满足大部分的web服务需求。

    1.1 proxy代理

    proxy常用于两类应用场景,一类是中转,如异地科学的上网方式,另外一类是到后端服务的负载均衡方案。

    用反向代理时候,需要特别注意里面的域名默认是在nginx启动时候就解析了,除非reload否则一直用的是当初解析的域名,也就是说不能动态解析。

    但这个问题是可以通过别的模块或者用内置字典变量方式来解决。

    resolver114.114.114.114;

    server {

       location / {

           set $serversgithub.com;

           proxy_passhttp://$servers;

       }

    }

    1.1.1 中转

    针对某个域名进行中转:

    server {

    listen172.16.10.1:80;

       server_name pypi.python.org;

       location ~ /simple {

           proxy_set_headerHost $http_host;

           proxy_redirect off;

           proxy_passhttp://pypi.python.org;

       }

    }

    注意如果是前后端域名不一样的话需要处理proxy_redirect301跳转之类的显?#33606;?#21542;则在跳转时候会跳转到proxy_pass的域名。

    另外可以直接代理所有80端口的http流量:

    server {

       listen 80;

       server_name _;

       resolver 114.114.114.114;

       set $URL $host;

       location / {

           proxy_passhttp://$URL;

       }

    }

    如果是想代理https的站点也不是不可能,只是需要自行处理CA证书导入即可,而且经过https中转的流量对nginx是透明的,也就是有证书的时候做窃听和劫持?#37027;?#20917;。

    1.1.2 负载均衡

    这是代理的另外一个常见用法,通过upstream到多个后端,可以通过weight来调节权重或者backup关键词来指定备份用的后端,通常默认就可以了,或者可以指定类似ip_hash这样的方式来均衡,配置很简单,先在http区域添加upstream定义:

    upstreambackend {

       ip_hash;

       server backend1.example.comweight=5;

       server backend2.example.comweight=5;;

    }

    然后在server里面添加proxy_pass

    location /{

       proxy_pass http://backend;

       proxy_http_version 1.1;

       proxy_set_header Connection"";

    }

    做负载均衡的时候可以智能识别后端服务器状态,虽然可以智能地proxy_next_upstream到另外的后端,但还是会定期损失一些正常的尝试性的连接,比如过了max_fails 次尝试之后,休息fail_timeout时间,过了这个时间之后又会去尝试,这个时候可以使用第三方的upstream_check模块来在后台定期地自动探索,类似这样:

    checkinterval=3000 rise=2 fall=5 timeout=2000 type=http;

    这样替代用户正常的连接来进行尝试的方式进一步保障了高可用的特性。

    还有就是在做前端代理的时候也是这样的方式,直接proxy_pass到后端即可,比如CDN的场景。

    1.2 防盗链

    普通的防盗链是通过referer来做,比如:

    location~* \.(gif|jpg|png|bmp)$ {

       valid_referers none blocked*.example.com server_names ~\.google\. ~\.baidu\.;

       if ($invalid_referer) {

           return 403;

       }

    }

    再精细一点的就是URL?#29992;埽?#38024;对一些用户IP之类的变?#21487;?#25104;一个?#29992;?/span>URL通常是针对文件下载时候用到,可以通过openresty来写lua脚本或者是accesskey之类的模块来实现。

    1.3 变量

    nginx里面支持正则匹配和变量配置,默认的变量比如remote_addrrequest_filenamequery_stringserver_name之类的,这些组合在一起可以做很多规则,或者还有日志里面statushttp_cookie等。

    还有在进行多域名配置时候可以用通配符,比如:

    server_name~^(www\.)?(.+)$;

    root/data/web/$2;

    这样就实现了自动进行域名的目录指派。

    变量方面,比如配置变量a=1

    set $a 1;

    下面这个案例配合if判断来做有更大的用处。

    1.4 if判断

    nginx里面支持一些简单的if判断,但是没有多重逻辑的语法,多个判断条件用起来需要结合变量的方式来实现,比如允许ip地址为10.10.61段和和192.168.100段的用户访问,其余的拒绝,返回405状态码:

    set $err0;

       if ( $remote_addr ~ 10.10.61.){

           set $err 0;

       }

       if ( $remote_addr ~192.168.100.){

           set $err 0;

       }

       if ( $err = 1){

           return 405;

       }

    这样通过一个err变量比较巧妙实现了需求。

    1.5 error_page

    有用到后端proxy的地方需要加上这句话才可?#28304;?#21040;状态码到nginx

    fastcgi_intercept_errorson;

    具体配置?#35805;?#26159;配置到具体的错误URL页面,比如:

    #返回具体状态码

    error_page404 403 /4xx.html

    #返回200状态码

    error_page404 403 =200  /error.html

    或者采用callback的方式统一做处理:

    error_page404 403 = @fallback;

    [email protected] {

       proxy_pass http://backend;

       access_log/data/logs/404_error.log access;

    }

    这样在重定向时不会改变URL,然后把404页面直接返回。

    1.6 rewrite

    rewrite做一些301302之类的跳转,同时?#37096;?#20197;在CDN前端做去问号缓存的效果。

    location/db.txt {

       rewrite (.*) $1? break;

       include proxy.conf;

    }

    另外最常见的跳转写法:

    rewrite^/game/(.*) /$1;

    /game/test跳转为/test的效果,注意这样是没有状态码的,如果访?#25910;?#24120;就直接返回200状态码。

    可以在后面加个permanent?#38382;?#23601;变为了301 Moved Permanently,或者添加redirect改为302跳转。

    同理,还可以进行多个正则匹配进行URL重组,比如:

    rewrite^/download/(.*)/lastest/(.*)$ /file/$1?ver=$2 break;

    1.7 日志字段

    想针对每个连接进行日志留档,可以在nginx日志那里配置好字段,比如记录cookie之类的数据。

    log_format字段里面加入$http_cookie变量即可。

    另外post的数据可以永久保留在文件里面,比如用来做http的日志备份,包括getpost的原始数据,把这个值开启即可:

    client_body_in_file_only on;

    然后post的数据就会保存在nginx/client_body_temp文件夹里面。

    1.8 internal关键词

    这个关键词很少见,但有时候是很有用的,比如在有很多规则时候,突然需要针对某个目录转为nginx内?#30475;?#29702;。

    location^~ /upload/down/ {

    alias/data/web/dts/dtsfile/down/;

    internal;

    }

    1.9 try_files

    ?#32622;?#24847;思是尝试,后面可以接多个目录或者文件,比如kohana框架:

    try_files$uri /index.php?$query_string;

    先看是否有URL这个文件,没有的话再调用index.php来处理,或者支持状态码处理:

    try_files/foo /bar/ =404;

    没有这两个文件的话返回404状态。

    1.10 auth认证

    可以做简单的用户登录认证方式,其中的passwd_file得通过apachehtpasswd命令来生成。

    auth_basic"Restricted";

    auth_basic_user_filepasswd_file;

    认证通过之后?#30475;?#35775;问会在头部添加Authorization字段包含用户名密码的base64?#29992;?#23494;文给服务端。

    1.11 gzip

    普通的线上web站点gzip压缩是必须要开的,压缩一些文本类型的文件再返回给用户。

    注意必须手动指定全需要压缩的类型,比如cssjs之类的,线上配置如下:

    gzip on;

    gzip_min_length 2048;

    gzip_buffers    4 16k;

    gzip_vary  on;

    gzip_http_version1.1;

    gzip_types text/plain  text/css text/xml application/xml application/javascriptapplication/x-javascript ;

    1.12 mime配置

    很久以前基本是忽略这个配置,但手游流行之后就发现异常了,需要让手机浏览器知道返回的apk后缀是什么类型,否则类似IE浏览器会以zip后缀返回,需要加上:

    application/vnd.android.package-archiveapk;

    application/iphonepxl ipa;

    1.13 限速

    限速包括限制请求的并发数和请求的下载速度。

    简单的限制某个线程的下载速度就直接加上一句话就可以了:

    limit_rate1024k;

    要限制某个IP的并发数之类的就需要用ngx_http_limit_req_modulengx_http_limit_conn_module模块了,不过是默认就编译好的。

    比如使用一个 10M 大小的状态缓存区,针对每个IP每秒只接受20次?#37027;?#27714;:

    limit_req_zone$binary_remote_addr zone=NAME:10m rate=20r/s;

    1.14 location匹配

    location匹配有多种方式,常见的比如

    location = /

    location /

    location^~ /test{

    是有优先级的,直接 ”=” 的优先级是最高的,?#35805;?#23601;用”~”这个符号来匹配php就好了,不过是区分了大小写的:

    location ~.*\.php$

    1.15 文件缓存

    返回给用户的文件?#35805;?#37117;配置了过期时间,让浏览器缓存起来。

    比如缓存14天:

    expires14d;

    针对某些特殊的文件就需要location匹配之后进行禁止缓存配置:

    add_headerCache-Control no-cache;

    add_headerCache-Control no-store;

    expiresoff;

    1.16 缓存文件

    nginx可以作为ATS这样的缓存服务器来缓存文件,配置也比较简单,不过我们很少用,除非一些特殊的场合,参考配置:

    #先在全局下面定义?#27809;?#23384;存放的目录

    proxy_cache_path /data/cache/ levels=1:2 keys_zone=cache_one:10m inactive=7d max_size=10g;

    proxy_temp_path  /data/cache/proxy_temp_path;

    proxy_cache_key  $host$uri$is_args$args;

    #然后在server里面的location匹配好目的文件,加入下一段即可

    proxy_cachecache_one;

    proxy_cache_valid200 304 24h;

    proxy_cache_validany 10m;

    proxy_passhttps://$host;

    proxy_cache_key$host$uri$is_args$args;

    add_header Nginx-Cache "$upstream_cache_status"; 3. 内置模块

    2. 内置模块

    nginx含有大量的模块可以支持多?#25351;?#26434;的需求,比如源码目录src/http/modules里面就有很多c模块的代码,或者直接通过./configure–help|grep module来查看有哪些内置模块,编译时候直接加上就可以了。

    除了nginx内置的模块,网络上还有很多第三方的模块,可以通过编译时候加?#38382;?/span>–add-module=PATH指定模块源码来编译。

    下面介绍一些湖北国联线上用过而且比?#26174;?#30340;内置模块。

    2.1 stream

    端口转发的模块,从nginx1.9版本才开始支持,包含tcpudp的支持,和IPTABLES相比这个虽然是应用层,会监听端口,但是配置起来很方便,比IPTABLES灵活,在tcp模块下面添加类似vhostserver就可以了,方便自动化管理,参考配置:

    server {

       listen PORT;

       proxy_pass IP:PORT;

       access_log/data/logs/tcp/PORT.log;

    }

    2.2 http_realip_module

    nginx反向代理之后,如何让后端web直接获取到的IP不是反向代理的iP,而是直接获取到用户的真实IP呢,就需要这个模块了,不需要代码那里再做类似X-Real-IP的变量特殊判断。

    2.3 http_slice_module

    在做CDN时候可以用到,让一个大文件分片,分成多个小文件通过206断点续传到后端,然后再组合起来,避免大文件直接回源导致多?#21271;?#21644;多次回源的问题。

    2.4http_secure_link_module

    前面说到的防盗链可以用这个来做,但是这个?#35805;?#26159;针对那种文件下载时候用到的,比如从网页下载时候,服务端生成一个?#29992;?/span>URL给用户,然后这个URL有过期时间之类的,避免此URL被多次分享出去,不过普通的素材加载还是用普通的防盗链即可。

    2.5http_sub_module

    替换响应给用户的内容,相对于sed之后再返回,比如可以在需要临时全?#20013;?#25913;网站背景或者title时候可以一次?#28304;?#29702;好。

    3. 扩展项目

    简单介绍下大名鼎鼎的两个基于nginx的扩展项目,也是湖北国联线上有很多地方用到的。

    3.1 openresty

    集成lua脚?#33606;负?#21487;以完成任何普通web相关的需求。

    比如URL?#29992;?#36827;行防劫持和防盗链,服务端动态生成一串aes?#29992;?#30340;URLCDNCDNopenresty解密之后用普通的URL转发到后端,然后再返回给用户正确的内容。

    3.2 tengine

    淘宝的nginx修改版,实现了很多nginx的收费功能或者是特殊功能,比如动态加载、concat合并请求,动态解析等。

    湖北国联python开发的后台基本都是用的这个版?#33606;?#20027;要是利用了concat的合并素材的功能。

    荆州地区政府网站建设 解决方案 专业团队 Copyright ? 2016 武汉国联信通科技有限公司松滋分公司 地址:湖北省荆州市沙市区荆沙大道楚天都市佳园一期C区29栋112       地址:湖北省松滋市才知文化广场1141-1142号     ?#26102;啵?34200 联系电话:0716-6666211     网站编辑部邮箱:[email protected] 鄂公网安备 42100202000212号 备案号:鄂ICP备16011027号-1     企业名称:湖北国联计算机科技有限公司
    湖北快3今天红号预测号码 四肖中特期期准资料 福时时开奖结果 三分彩到底是什么 北京赛pk10直播哪个好 天津市快乐十分一定牛 陕西快乐十分前三 手机游戏下载 单机游戏 足彩胜负彩竞猜分析 内蒙古时时走势图经网 今年黄金走势图