Nginx 經(jīng)典美文

nginx 常用命令

nginx  -c /etc/nginx/nginx.conf #nginx啟動(dòng),conf 可以自己指定或者刪除
nginx -s stop #停止nginx
nginx -s quit  #停止nginx
nginx -s reload #nginx重載配置
nginx -t #檢查配置文件是否正確

如果將整個(gè)配置文件的結(jié)構(gòu)簡(jiǎn)化一下苟呐,大概就是這樣:

main塊
    event塊{
    #定義nginx的事件模型佑女,不可或缺斋射。
    }

    http塊 {  #http服務(wù)器的必要塊讽膏。
        server塊 { #定義虛擬主機(jī)的塊拉庶。
            if塊 {}
            location塊 {    #定義uri規(guī)則的塊杨刨,可以使用正則表達(dá)式映之。
                if塊 {}   #RewriteCond的重新規(guī)則條件的功能沾乘。
            }
        }
    }

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 一定要加一個(gè)ip怜奖,否則調(diào)轉(zhuǎn)到403。
//對(duì)于allow的ip段翅阵,允許訪問的段位從小到大排列歪玲。
//24,代表子網(wǎng)掩碼:255.255.255.0
//16,代表子網(wǎng)掩碼:255.255.0.0
//8,代表子網(wǎng)掩碼:255.0.0.0

也可以通過文件的形式include進(jìn)來
1.首先建立一個(gè)用于屏蔽IP的配置文件,放在nginx的conf目錄下面, 這里以iplist為例掷匠,iplist內(nèi)容可以是是:

deny 192.168.1.11;
deny 192.168.1.123;
deny 10.0.1.0/24;

2滥崩、在nginx的配置文件 nginx.conf 中加入 include iplist,以便這個(gè)配置文件能夠被加載讹语。

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 壓縮性能優(yōu)化

gzip on; #開啟壓縮
gzip_static on; #告訴nginx在壓縮資源之前短条,先查找是否有預(yù)先gzip處理過的資源。這要求你預(yù)先壓縮你的文件(在這個(gè)例子中被注釋掉了)才菠,從而允許你使用最高壓縮比茸时,這樣nginx就不用再壓縮這些文件了
gzip_min_length  1k;   #允許壓縮頁面的最小字節(jié)數(shù)
gzip_disable "msie6";  #為指定的客戶端禁用gzip功能
gzip_http_version 1.1; #壓縮版本 
gzip_vary on;  #支持前端的緩存服務(wù)器緩存經(jīng)過gzip壓縮的頁面。
gzip_comp_level 6; #指定壓縮等級(jí)赋访,其值從1到9可都,數(shù)字越大,壓縮率越高进每,越消耗CPU汹粤,負(fù)載也越高.設(shè)置為4,這是一個(gè)比較折中的設(shè)置.
gzip_proxied any; #允許或者禁止壓縮基于請(qǐng)求和響應(yīng)的響應(yīng)流田晚。我們?cè)O(shè)置為any嘱兼,意味著將會(huì)壓縮所有的請(qǐng)求。
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圖片及目錄防盜鏈

什么是防盜鏈系統(tǒng)

防盜鏈系統(tǒng)就是防范盜鏈的系統(tǒng)贤徒,防止別人通過一些技術(shù)手段繞過本站的資源展示頁面芹壕,盜用本站的資源汇四,讓繞開本站資源展示頁面的資源鏈接失效。實(shí)施防盜鏈系統(tǒng)后踢涌,因?yàn)槠帘瘟四切┍I鏈的間接資源請(qǐng)求通孽,從而可以大大減輕服務(wù)器及帶寬的壓力,也正如此睁壁,越來越多的站點(diǎn)都開始實(shí)施防盜鏈技術(shù)背苦。

Nginx的防盜鏈主要使用的是referer模塊。

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

說明:當(dāng)在HTTP請(qǐng)求頭中有Referer字段潘明,則變量$invalid_referer將會(huì)設(shè)置為空字符串行剂,否則$invalid_referer將會(huì)設(shè)置為1. 匹配時(shí)不區(qū)分大小寫

none:表示請(qǐng)求頭中沒有Referer字段。
blocked:表示請(qǐng)求頭中有Referer字段钳降,但是該字段的值已經(jīng)被防火墻或者是代理服務(wù)器刪除了厚宰,不是以"http://"或者是"https://"開頭
server_names:請(qǐng)求頭的Referer字段包含其中一個(gè)server name。
string:表示任意的字符串遂填〔酰可以是一個(gè)server name或者是server name和URI的結(jié)合,可以使用在server name的開頭和結(jié)尾可以使用*吓坚。并且不會(huì)檢查Referer字段的服務(wù)器的端口號(hào)撵幽。
也可以使用正則表達(dá)式進(jìn)行匹配,如果要使用正則表達(dá)式凌唬,則第一個(gè)符號(hào)必須是"~"并齐,并且表達(dá)式匹配的內(nèi)容應(yīng)該是"http://"或者是"https://"以后的內(nèi)容漏麦。

配置示例

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

    if ($invalid_referer) {
        return 403;
    }   
} 

nginx 負(fù)載均衡 load balance

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

<code>1)客税、</code> 輪詢(默認(rèn))? 每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉撕贞,能自動(dòng)剔除更耻。
  <code>2)、</code>weight? 指定輪詢幾率捏膨,weight和訪問比率成正比秧均,用于后端服務(wù)器性能不均的情況。
  <code>3)号涯、</code>ip_hash? 每個(gè)請(qǐng)求按訪問ip的hash結(jié)果分配目胡,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題链快。
  <code>4)誉己、</code>fair(第三方)? 按后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配域蜗。


#server參數(shù)
#weight=number       ;服務(wù)器的權(quán)重巨双,在默認(rèn)情況下是1噪猾。
#max_conns=number    ;限制與代理服務(wù)器的最大并發(fā)連接數(shù)。 默認(rèn)值為零筑累,意味著沒有限制
#max_fails=number    ;最大失敗數(shù)袱蜡,與服務(wù)器進(jìn)行通信失敗的次數(shù),服務(wù)器將被視為不可用慢宗。缺省情況下坪蚁,嘗試失敗的次數(shù)被設(shè)置為1。
#fail_timeout=time   ;最大超時(shí)镜沽,與服務(wù)器通信不可用的時(shí)間段迅细,服務(wù)器將被視為不可用。默認(rèn)情況下淘邻,參數(shù)被設(shè)置為10秒茵典。
#backup              ;標(biāo)志著服務(wù)器作為備份服務(wù)器。當(dāng)主服務(wù)器不可用時(shí)將啟用
#down                ;將服務(wù)器標(biāo)記為永久不可用
#resolve             ;監(jiān)視對(duì)應(yīng)于服務(wù)器的域名的IP地址的變化宾舅,自動(dòng)修改上游配置而不需要重新啟動(dòng)
#route=string        ;設(shè)置服務(wù)器的路由名稱
#service=name        ;啟用DNS SRV記錄解析和設(shè)置服務(wù)名稱
#slow_start=time     ;慢啟動(dòng)统阿,即服務(wù)器可用后到提供服務(wù)的這段時(shí)間,默認(rèn)為0筹我,表示禁用扶平,不能用于hash和ip_hash負(fù)載均衡方法

upstream backend {
    ip_hash;    //支持round robin, least_conn蔬蕊,ip_hash

    server backend1.example.com weight=5;
    server backend2.example.com down;   //down只在ip_hash時(shí)有效结澄,表示該server down時(shí),發(fā)請(qǐng)求給下一個(gè)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緩存實(shí)現(xiàn)性能優(yōu)化

expires功能就是允許通過nginx配置文件控制http的expires和cache-control響應(yīng)頭的內(nèi)容岸夯。告送瀏覽器是否緩存和緩存多長時(shí)間麻献。

(1).根據(jù)文件擴(kuò)展名進(jìn)行判斷
location ~ .*\.(gif | jpg | jpeg | png | nmp | swf)$ {
    expires 365d;
}  
(2).緩存某個(gè)特定的文件
location ~(robots.txt) {
    expires 7d;
    break;
}

nginx 日志相關(guān)優(yōu)化

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).不記錄不需要的訪問日志 如果日志寫入太頻繁,會(huì)占用大量的磁盤I/O猜扮,從而降低了服務(wù)器的性能

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

Rewrite規(guī)則

location  = / {
  # 精確匹配 / 勉吻,主機(jī)名后面不能帶任何字符串
  [ configuration A ]
}
location  / {
  # 因?yàn)樗械牡刂范家?/ 開頭,所以這條規(guī)則將匹配到所有請(qǐng)求
  # 但是正則和最長字符串會(huì)優(yōu)先匹配
  [ configuration B ]
}
location /documents/ {
  # 匹配任何以 /documents/ 開頭的地址旅赢,匹配符合以后齿桃,還要繼續(xù)往下搜索
  # 只有后面的正則表達(dá)式?jīng)]有匹配到時(shí),這一條才會(huì)采用這一條
  [ configuration C ]
}
location ~ /documents/Abc {
  # 匹配任何以 /documents/Abc 開頭的地址煮盼,匹配符合以后短纵,還要繼續(xù)往下搜索
  # 只有后面的正則表達(dá)式?jīng)]有匹配到時(shí),這一條才會(huì)采用這一條
  [ configuration CC ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 開頭的地址僵控,匹配符合以后香到,停止往下搜索正則,采用這一條。
  [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 結(jié)尾的請(qǐng)求
  # 然而养渴,所有請(qǐng)求 /images/ 下的圖片會(huì)被 config D 處理雷绢,因?yàn)?^~ 到達(dá)不了這一條正則
  [ configuration E ]
}
location /images/ {
  # 字符匹配到 /images/,繼續(xù)往下理卑,會(huì)發(fā)現(xiàn) ^~ 存在
  [ configuration F ]
}
location /images/abc {
  # 最長字符匹配到 /images/abc翘紊,繼續(xù)往下,會(huì)發(fā)現(xiàn) ^~ 存在
  # F與G的放置順序是沒有關(guān)系的
  [ configuration G ]
}
location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址藐唠,繼續(xù)往下搜索帆疟,匹配到這一條正則,采用
    [ configuration H ]
}
location ~* /js/.*/\.js

已=開頭表示精確匹配
如 A 中只匹配根目錄結(jié)尾的請(qǐng)求宇立,后面不能帶任何字符串踪宠。
^~ 開頭表示uri以某個(gè)常規(guī)字符串開頭,不是正則匹配
~ 開頭表示區(qū)分大小寫的正則匹配;
~* 開頭表示不區(qū)分大小寫的正則匹配
/ 通用匹配, 如果沒有其它匹配,任何請(qǐng)求都會(huì)匹配到

so,實(shí)戰(zhàn)項(xiàng)目一般這樣
所以實(shí)際使用中妈嘹,個(gè)人覺得至少有三個(gè)匹配規(guī)則定義柳琢,如下:
#直接匹配網(wǎng)站根,通過域名訪問網(wǎng)站首頁比較頻繁润脸,使用這個(gè)會(huì)加速處理柬脸,官網(wǎng)如是說。
#這里是直接轉(zhuǎn)發(fā)給后端應(yīng)用服務(wù)器了毙驯,也可以是一個(gè)靜態(tài)首頁
# 第一個(gè)必選規(guī)則
location = / {
    proxy_pass http://tomcat:8080/index
}
# 第二個(gè)必選規(guī)則是處理靜態(tài)文件請(qǐng)求倒堕,這是nginx作為http服務(wù)器的強(qiáng)項(xiàng)
# 有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}
#第三個(gè)規(guī)則就是通用規(guī)則爆价,用來轉(zhuǎn)發(fā)動(dòng)態(tài)請(qǐng)求到后端應(yīng)用服務(wù)器
#非靜態(tài)文件請(qǐng)求就默認(rèn)是動(dòng)態(tài)請(qǐng)求垦巴,自己根據(jù)實(shí)際把握
#畢竟目前的一些框架的流行,帶.php,.jsp后綴的情況很少了
location / {
    proxy_pass http://tomcat:8080/
}

優(yōu)雅的顯示錯(cuò)誤頁面

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.添加補(bǔ)丁 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;
}


#測(cè)試地址铭段,不一定要配置
 location /nstatus {
  check_status;
  access_log off;
  allow all;
  #deny all;

}

最后記錄一些常用的默認(rèn)配置,不需要修改就行

error_log    logs/error.log warn;

指定error_log的日志文件為logs/error.log并設(shè)置記錄級(jí)別為warning闲礼。

events {
    use    epoll; #為什么nginx比apache快玄叠,epoll起到了比較關(guān)鍵的作用
    worker_connections    20480;
}

設(shè)定事件模型使用epoll安岂,每個(gè)worker進(jìn)程可用的最大連接數(shù)是20480撑柔。

root    /home/admin/cai/htdocs;

設(shè)置靜態(tài)文件所在地,也就是網(wǎng)站根目錄展运。

sendfile    on;

打開會(huì)使用sendfile系統(tǒng)調(diào)用,用來發(fā)送靜態(tài)文件精刷,節(jié)省了文件在用戶空間和內(nèi)核空間拷貝的消耗拗胜。

tcp_nopush     on;

打開后,會(huì)使TCP在發(fā)送數(shù)據(jù)時(shí)進(jìn)行緩存怒允,提高傳輸效率埂软,但是會(huì)增加客戶端響應(yīng)時(shí)間。

keepalive_timeout     15s;
keepalive_requests     100;

設(shè)置keepalive連接的超時(shí)時(shí)間為15s,并且每處理100個(gè)請(qǐng)求以后就關(guān)閉鏈接勘畔。

server_tokens     off;

關(guān)閉后所灸,nginx在錯(cuò)誤頁面和響應(yīng)的Server頭中不會(huì)攜帶版本號(hào)信息。

2018年最新的面試題炫七,滿滿的干貨爬立, 請(qǐng)關(guān)注 https://github.com/976500133/FETopic

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市万哪,隨后出現(xiàn)的幾起案子侠驯,更是在濱河造成了極大的恐慌,老刑警劉巖奕巍,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吟策,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡的止,警方通過查閱死者的電腦和手機(jī)檩坚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诅福,“玉大人效床,你說我怎么就攤上這事∪ㄋ” “怎么了剩檀?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旺芽。 經(jīng)常有香客問我沪猴,道長,這世上最難降的妖魔是什么采章? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任运嗜,我火速辦了婚禮,結(jié)果婚禮上悯舟,老公的妹妹穿的比我還像新娘担租。我一直安慰自己,他們只是感情好抵怎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布奋救。 她就那樣靜靜地躺著,像睡著了一般反惕。 火紅的嫁衣襯著肌膚如雪尝艘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天姿染,我揣著相機(jī)與錄音背亥,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狡汉,可吹牛的內(nèi)容都是我干的娄徊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盾戴,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寄锐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捻脖,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤锐峭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后可婶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沿癞,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年矛渴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椎扬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡具温,死狀恐怖蚕涤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铣猩,我是刑警寧澤揖铜,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站达皿,受9級(jí)特大地震影響天吓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峦椰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一龄寞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汤功,春花似錦物邑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹦蠕,卻和暖如春冒签,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钟病。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肠阱。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓票唆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屹徘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子走趋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.ngnix介紹 ngnix www服務(wù)軟件 俄羅斯人開發(fā) 開源 性能很高 本身是一款靜態(tài)WWW軟件 靜態(tài)小文件...
    逗比punk閱讀 2,099評(píng)論 1 6
  • 第一章 Nginx簡(jiǎn)介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧噪伊!Ngi...
    JokerW閱讀 32,687評(píng)論 24 1,002
  • I/O模型Nginx介紹Nginx的安裝和目錄結(jié)構(gòu)Nginx的配置Nginx的編譯安裝 一簿煌、I/O模型 (一)I/...
    哈嘍別樣閱讀 894評(píng)論 0 4
  • 《老男孩Linux運(yùn)維》筆記 隱藏Nginx軟件版本號(hào) 一般來說,軟件的漏洞都和版本有關(guān)鉴吹。因此要盡量隱藏對(duì)訪問用戶...
    Zhang21閱讀 3,644評(píng)論 0 28
  • Nginx簡(jiǎn)介 解決基于進(jìn)程模型產(chǎn)生的C10K問題,請(qǐng)求時(shí)即使無狀態(tài)連接如web服務(wù)都無法達(dá)到并發(fā)響應(yīng)量級(jí)一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,005評(píng)論 0 9