Nginx 经典美文

nginx 常用命令

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

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

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/bash
cd /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头中不会携带版本号信息。

2018年最新的面试题,满满的干货, 请关注 https://github.com/976500133/FETopic

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 1.ngnix介绍 ngnix www服务软件 俄罗斯人开发 开源 性能很高 本身是一款静态WWW软件 静态小文件...
    逗比punk阅读 2,064评论 1 6
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,624评论 24 1,002
  • I/O模型Nginx介绍Nginx的安装和目录结构Nginx的配置Nginx的编译安装 一、I/O模型 (一)I/...
    哈喽别样阅读 887评论 0 4
  • 《老男孩Linux运维》笔记 隐藏Nginx软件版本号 一般来说,软件的漏洞都和版本有关。因此要尽量隐藏对访问用户...
    Zhang21阅读 3,611评论 0 28
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,982评论 0 9