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)信息。