继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Nginx 经典美文

aluckdog
关注TA
已关注
手记 473
粉丝 68
获赞 394

nginx 常用命令

nginx  -c /etc/nginx/nginx.conf #nginx启动,conf 可以自己指定或者删除nginx -s stop #停止nginxnginx -s quit  #停止nginxnginx -s reload #nginx重载配置nginx -t #检查配置文件是否正确

600

如果将整个配置文件的结构简化一下,大概就是这样:

main块
    event块{    #定义nginx的事件模型,不可或缺。
    }

    http块 {  #http服务器的必要块。
        server块 { #定义虚拟主机的块。
            if块 {}
            location块 {    #定义uri规则的块,可以使用正则表达式。
                if块 {}   #RewriteCond的重新规则条件的功能。
            }
        }
    }

nginx 限制ip访问

server {
    listen 80;
    server_name xx.xx.xx.xx;

    location / {
           root html/blog;
          index.index.php index.html index.htm;
          allow 127.0.0.1/24;
          allow 192.168.0.0/16;
          allow 10.10.0.0;
          deny all;
    }//deny 一定要加一个ip,否则调转到403。//对于allow的ip段,允许访问的段位从小到大排列。//24,代表子网掩码:255.255.255.0//16,代表子网掩码:255.255.0.0//8,代表子网掩码:255.0.0.0

也可以通过文件的形式include进来
1.首先建立一个用于屏蔽IP的配置文件,放在nginx的conf目录下面, 这里以iplist为例,iplist内容可以是是:

deny 192.168.1.11;
deny 192.168.1.123;
deny 10.0.1.0/24;

2、在nginx的配置文件 nginx.conf 中加入 include iplist,以便这个配置文件能够被加载。

server {
    listen 80;
    server_name localhost;
    location / {    include iplist;
    proxy_pass http://local_tomcat;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forworded-For $proxy_add_x_forwarded_for;
    }
}

3、重新加载nginx的配置 nginx -s reload,即可生效。


开启gzip 压缩性能优化

gzip on; #开启压缩gzip_static on; #告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了gzip_min_length  1k;   #允许压缩页面的最小字节数gzip_disable "msie6";  #为指定的客户端禁用gzip功能gzip_http_version 1.1; #压缩版本 gzip_vary on;  #支持前端的缓存服务器缓存经过gzip压缩的页面。gzip_comp_level 6; #指定压缩等级,其值从1到9,数字越大,压缩率越高,越消耗CPU,负载也越高.设置为4,这是一个比较折中的设置.gzip_proxied any; #允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js; #支持的压缩类型

nginx图片及目录防盗链

什么是防盗链系统

防盗链系统就是防范盗链的系统,防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。实施防盗链系统后,因为屏蔽了那些盗链的间接资源请求,从而可以大大减轻服务器及带宽的压力,也正如此,越来越多的站点都开始实施防盗链技术。

Nginx的防盗链主要使用的是referer模块。

语法:valid_referers none | blocked | server_names | <string> ...

说明:当在HTTP请求头中有Referer字段,则变量$invalid_referer将会设置为空字符串,否则$invalid_referer将会设置为1. 匹配时不区分大小写

none:表示请求头中没有Referer字段。
blocked:表示请求头中有Referer字段,但是该字段的值已经被防火墙或者是代理服务器删除了,不是以"http://"或者是"https://"开头
server_names:请求头的Referer字段包含其中一个server name。
string:表示任意的字符串。可以是一个server name或者是server name和URI的结合,可以使用在server name的开头和结尾可以使用*。并且不会检查Referer字段的服务器的端口号。
也可以使用正则表达式进行匹配,如果要使用正则表达式,则第一个符号必须是"~",并且表达式匹配的内容应该是"http://"或者是"https://"以后的内容。

配置示例

location ~ \.(png|jpg|jpeg|gif)$ {
valid_referers none blocked server_names *.kakaogift.cn *.kakaogift.com;    if ($invalid_referer) {        return 403;
    }   
}

nginx 负载均衡 load balance

nginx的upstream目前支持4种方式的分配

<code>1)、</code> 轮询(默认)� 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
  <code>2)、</code>weight� 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
  <code>3)、</code>ip_hash� 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
  <code>4)、</code>fair(第三方)� 按后端服务器的响应时间来分配请求,响应时间短的优先分配。


#server参数#weight=number       ;服务器的权重,在默认情况下是1。#max_conns=number    ;限制与代理服务器的最大并发连接数。 默认值为零,意味着没有限制#max_fails=number    ;最大失败数,与服务器进行通信失败的次数,服务器将被视为不可用。缺省情况下,尝试失败的次数被设置为1。#fail_timeout=time   ;最大超时,与服务器通信不可用的时间段,服务器将被视为不可用。默认情况下,参数被设置为10秒。#backup              ;标志着服务器作为备份服务器。当主服务器不可用时将启用#down                ;将服务器标记为永久不可用#resolve             ;监视对应于服务器的域名的IP地址的变化,自动修改上游配置而不需要重新启动#route=string        ;设置服务器的路由名称#service=name        ;启用DNS SRV记录解析和设置服务名称#slow_start=time     ;慢启动,即服务器可用后到提供服务的这段时间,默认为0,表示禁用,不能用于hash和ip_hash负载均衡方法upstream backend {
    ip_hash;    //支持round robin, least_conn,ip_hash

    server backend1.example.com weight=5;
    server backend2.example.com down;   //down只在ip_hash时有效,表示该server down时,发请求给下一个server
    server backend3.example.com max_fails=3 fail_timeout=30s;   //
    server 192.0.0.1 backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

nginx 配置expires缓存实现性能优化

expires功能就是允许通过nginx配置文件控制http的expires和cache-control响应头的内容。告送浏览器是否缓存和缓存多长时间。

(1).根据文件扩展名进行判断
location ~ .*\.(gif | jpg | jpeg | png | nmp | swf)$ {
    expires 365d;
}
(2).缓存某个特定的文件
location ~(robots.txt) {
    expires 7d;    break;
}

nginx 日志相关优化

1).配置日志切割脚本
vim cut_nginx_log.sh#!/bin/bashcd /opt/application/nginx/nginx/logs && \ /bin/mv blog_access.log     blog_access_$(date +%F -d -1day).log/opt/application/ngnix/nginx/sbin/nginx -s reload

crontab -e
00 00 * * * /bin/sh /usr/local/cut_nginx_log.sh >/dev/null 2>&1

2).不记录不需要的访问日志 如果日志写入太频繁,会占用大量的磁盘I/O,从而降低了服务器的性能

location ~ .*\.(js | css | gif | jpg | jpeg | png | nmp | swf)$ {
    access_log off ;
}

Rewrite规则

location  = / {  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ]
}
location  / {  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ]
}
location /documents/ {  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ]
}
location ~ /documents/Abc {  # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration CC ]
}
location ^~ /images/ {  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ]
}
location /images/ {  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
  [ configuration F ]
}
location /images/abc {  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
  # F与G的放置顺序是没有关系的
  [ configuration G ]
}
location ~ /images/abc/ {  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ]
}
location ~* /js/.*/\.js

已=开头表示精确匹配
如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
^~ 开头表示uri以某个常规字符串开头,不是正则匹配
~ 开头表示区分大小写的正则匹配;
~* 开头表示不区分大小写的正则匹配
/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到

so,实战项目一般这样
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。#这里是直接转发给后端应用服务器了,也可以是一个静态首页# 第一个必选规则location = / {
    proxy_pass http://tomcat:8080/index}# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}#第三个规则就是通用规则,用来转发动态请求到后端应用服务器#非静态文件请求就默认是动态请求,自己根据实际把握#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了location / {
    proxy_pass http://tomcat:8080/}

优雅的显示错误页面

server {
  ......
   error_page 500 501 502 503 504   xxx.html #https://err.tmall.com/error2.html
   error_page 400 403 404 405 408 410 411 412 413 414 415  https://err.tmall.com/error1.html
  ......
}

模块(心跳检查)nginx_upstream_check_module

1.下载模块包 wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz


2.解压 tar -zxf v0.3.0.tar.gz


3.添加补丁 patch -p1 < ../nginx_upstream_check_module-master/check_1.5.12+.patch


4.配置nginx ./configure --add-module=/opt/nginx_upstream_check_module-0.3.0


5.编译安装 make && make install


6.查看安装信息 nginx -V


upstream default_upstream{
        keepalive 60;
        server 127.0.0.1:8080 max_fails=0 fail_timeout=30s weight=20;
        check interval=1000 rise=3 fall=2 timeout=3000 type=http default_down=false;
        check_http_send "GET / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx;
}#测试地址,不一定要配置
 location /nstatus {
  check_status;
  access_log off;
  allow all;  #deny all;

}

最后记录一些常用的默认配置,不需要修改就行

error_log    logs/error.log warn;

指定error_log的日志文件为logs/error.log并设置记录级别为warning。

events {    use    epoll; #为什么nginx比apache快,epoll起到了比较关键的作用
    worker_connections    20480;
}

设定事件模型使用epoll,每个worker进程可用的最大连接数是20480。

root    /home/admin/cai/htdocs;

设置静态文件所在地,也就是网站根目录。

sendfile    on;

打开会使用sendfile系统调用,用来发送静态文件,节省了文件在用户空间和内核空间拷贝的消耗。

tcp_nopush     on;

打开后,会使TCP在发送数据时进行缓存,提高传输效率,但是会增加客户端响应时间。

keepalive_timeout     15s;
keepalive_requests     100;

设置keepalive连接的超时时间为15s,并且每处理100个请求以后就关闭链接。

server_tokens     off;

关闭后,nginx在错误页面和响应的Server头中不会携带版本号信息。



作者:二月长河
链接:https://www.jianshu.com/p/3837eaf92e82


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP