nginx
Nginx是一款開(kāi)源代碼的高性能HTTP服務(wù)器和反向代理服務(wù)器,同時(shí)支持IMAP/POP3/SMTP代理服務(wù)
Nginx由內(nèi)核和模塊組成猎唁,完成工作是通過(guò)查找配置文件將客戶端請(qǐng)求映射到一個(gè)locationblock(location是用于URL匹配的命令)椎组,location配置的命令會(huì)啟動(dòng)不同模塊完成工作泣洞。
Nginx模塊分為核心模塊宴抚,基礎(chǔ)模塊和第三方模塊。
核心模塊:HTTP模塊奠蹬、EVENT模塊(事件)、MAIL模塊嗡午。
基礎(chǔ)模塊:HTTP Access模塊囤躁、HTTP FastCGI模塊、HTTP Proxy模塊、HTTP Rewrite模塊狸演。
第三方模塊:HTTP Upstream Request Hash模塊言蛇、Notice模塊、HTTP Access Key模塊宵距。
nginx安裝
#安裝部署nginx所用到的安裝工具和相關(guān)庫(kù)
#默認(rèn)安裝的http_rewrite_module(使用正則對(duì)請(qǐng)求重寫(xiě))需pcre庫(kù)
#默認(rèn)安裝的httP_gzip_module(Gzip壓縮)需zlib庫(kù)
#安裝http_ssl_module(HTTPS/SLL)需openssl庫(kù)
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
#下載nginx源碼包腊尚,并解壓
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar -zxvf nginx-1.10.3.tar.gz
cd nginx-1.10.3
#設(shè)置參數(shù) 參數(shù)具體參考《Nginx編譯參數(shù)》
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module
#編譯并安裝
make && make install
nginx配置文件
配置文件主要由四部分組成:main(全局配置),server(主機(jī)配置)满哪,upstream(負(fù)載均衡服務(wù)器設(shè)置)婿斥,和location(URL匹配特定位置設(shè)置)。
全局變量
#Nginx的worker進(jìn)程運(yùn)行用戶以及用戶組
#user nobody nobody;
#Nginx開(kāi)啟的進(jìn)程數(shù)
worker_processes 1;
#worker_processes auto;
#以下參數(shù)指定了哪個(gè)cpu分配給哪個(gè)進(jìn)程哨鸭,一般來(lái)說(shuō)不用特殊指定受扳。如果一定要設(shè)的話,用0和1指定分配方式.
#這樣設(shè)就是給1-4個(gè)進(jìn)程分配單獨(dú)的核來(lái)運(yùn)行兔跌,出現(xiàn)第5個(gè)進(jìn)程是就是隨機(jī)分配了勘高。
eg:
#worker_processes 4 #4核CPU
#worker_cpu_affinity 0001 0010 0100 1000
#定義全局錯(cuò)誤日志定義類(lèi)型,[debug|info|notice|warn|crit]
#error_log logs/error.log info;
#指定進(jìn)程ID存儲(chǔ)文件位置
#pid logs/nginx.pid;
#一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述符數(shù)目坟桅,理論值應(yīng)該是最多打開(kāi)文件數(shù)(ulimit -n)與nginx進(jìn)程數(shù)相除华望,但是nginx分配請(qǐng)求并不是那么均勻,所以最好與ulimit -n的值保持一致仅乓。
worker_rlimit_nofile 65535;
事件配置
events {
#use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本內(nèi)核中的高性能網(wǎng)絡(luò)I/O模型赖舟,如果跑在FreeBSD上面,就用kqueue模型夸楣。
use epoll;
#每個(gè)進(jìn)程可以處理的最大連接數(shù)宾抓,理論上每臺(tái)nginx服務(wù)器的最大連接數(shù)為worker_processes*worker_connections。理論值:worker_rlimit_nofile/worker_processes
#注意:最大客戶數(shù)也由系統(tǒng)的可用socket連接數(shù)限制(~ 64K)豫喧,所以設(shè)置不切實(shí)際的高沒(méi)什么好處
worker_connections 65535;
#worker工作方式:串行(一定程度降低負(fù)載石洗,但服務(wù)器吞吐量大時(shí),關(guān)閉使用并行方式)
#multi_accept on;
}
http配置
http
{
#文件擴(kuò)展名與文件類(lèi)型映射表
include mime.types;
#默認(rèn)文件類(lèi)型
default_type application/octet-stream;
#日志相關(guān)定義
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#定義日志的格式紧显。后面定義要輸出的內(nèi)容讲衫。
#1.$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的ip地址;
#2.$remote_user :用來(lái)記錄客戶端用戶名稱孵班;
#3.$time_local :用來(lái)記錄訪問(wèn)時(shí)間與時(shí)區(qū)涉兽;
#4.$request :用來(lái)記錄請(qǐng)求的url與http協(xié)議;
#5.$status :用來(lái)記錄請(qǐng)求狀態(tài)篙程;
#6.$body_bytes_sent :記錄發(fā)送給客戶端文件主體內(nèi)容大屑衔贰;
#7.$http_referer :用來(lái)記錄從那個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的虱饿;
#8.$http_user_agent :記錄客戶端瀏覽器的相關(guān)信息
#連接日志的路徑拥诡,指定的日志格式放在最后丹允。
#access_log logs/access.log main;
#只記錄更為嚴(yán)重的錯(cuò)誤日志,減少I(mǎi)O壓力
error_log logs/error.log crit;
#關(guān)閉日志
#access_log off;
#默認(rèn)編碼
#charset utf-8;
#服務(wù)器名字的hash表大小
server_names_hash_bucket_size 128;
#客戶端請(qǐng)求單個(gè)文件的最大字節(jié)數(shù)
client_max_body_size 8m;
#指定來(lái)自客戶端請(qǐng)求頭的hearerbuffer大小
client_header_buffer_size 32k;
#指定客戶端請(qǐng)求中較大的消息頭的緩存最大數(shù)量和大小袋倔。
large_client_header_buffers 4 64k;
#開(kāi)啟高效傳輸模式雕蔽。
sendfile on;
#防止網(wǎng)絡(luò)阻塞
tcp_nopush on;
tcp_nodelay on;
#客戶端連接超時(shí)時(shí)間,單位是秒
keepalive_timeout 60;
#客戶端請(qǐng)求頭讀取超時(shí)時(shí)間
client_header_timeout 10;
#設(shè)置客戶端請(qǐng)求主體讀取超時(shí)時(shí)間
client_body_timeout 10;
#響應(yīng)客戶端超時(shí)時(shí)間
send_timeout 10;
#FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用宾娜,提高訪問(wèn)速度批狐。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模塊設(shè)置
#開(kāi)啟gzip壓縮輸出
gzip on;
#最小壓縮文件大小
gzip_min_length 1k;
#壓縮緩沖區(qū)
gzip_buffers 4 16k;
#壓縮版本(默認(rèn)1.1,前端如果是squid2.5請(qǐng)使用1.0)
gzip_http_version 1.0;
#壓縮等級(jí) 1-9 等級(jí)越高前塔,壓縮效果越好嚣艇,節(jié)約寬帶,但CPU消耗大
gzip_comp_level 2;
#壓縮類(lèi)型华弓,默認(rèn)就已經(jīng)包含text/html食零,所以下面就不用再寫(xiě)了,寫(xiě)上去也不會(huì)有問(wèn)題寂屏,但是會(huì)有一個(gè)warn贰谣。
gzip_types text/plain application/x-javascript text/css application/xml;
#前端緩存服務(wù)器緩存經(jīng)過(guò)壓縮的頁(yè)面
gzip_vary on;
}
虛擬主機(jī)配置
#虛擬主機(jī)的配置
server
{
#監(jiān)聽(tīng)端口
listen 80;
#域名可以有多個(gè),用空格隔開(kāi)
server_name www.jd.com jd.com;
index index.html index.htm index.php;
root /data/www/jd;
#對(duì)******進(jìn)行負(fù)載均衡
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#圖片緩存時(shí)間設(shè)置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS緩存時(shí)間設(shè)置
location ~ .*.(js|css)?$
{
expires 1h;
}
#日志格式設(shè)定
#$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址迁霎;
#$remote_user:用來(lái)記錄客戶端用戶名稱吱抚;
#$time_local: 用來(lái)記錄訪問(wèn)時(shí)間與時(shí)區(qū);
#$request: 用來(lái)記錄請(qǐng)求的url與http協(xié)議考廉;
#$status: 用來(lái)記錄請(qǐng)求狀態(tài)秘豹;成功是200,
#$body_bytes_sent :記錄發(fā)送給客戶端文件主體內(nèi)容大胁痢既绕;
#$http_referer:用來(lái)記錄從那個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的;
#$http_user_agent:記錄客戶瀏覽器的相關(guān)信息涮坐;
#通常web服務(wù)器放在反向代理的后面凄贩,這樣就不能獲取到客戶的IP地址了,通過(guò)$remote_add拿到的IP地址是反向代理服務(wù)器的iP地址膊升。反向代理服務(wù)器在轉(zhuǎn)發(fā)請(qǐng)求的http頭信息中怎炊,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來(lái)客戶端的請(qǐng)求的服務(wù)器地址廓译。
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定義本虛擬主機(jī)的訪問(wèn)日志
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
#對(duì) "/" 啟用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服務(wù)器可以通過(guò)X-Forwarded-For獲取用戶真實(shí)IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可選债查。
proxy_set_header Host $host;
#允許客戶端請(qǐng)求的最大單文件字節(jié)數(shù)
client_max_body_size 10m;
#緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù)非区,
#如果把它設(shè)置為比較大的數(shù)值,例如256k盹廷,那么征绸,無(wú)論使用firefox還是IE瀏覽器,來(lái)提交任意小于256k的圖片,都很正常管怠。如果注釋該指令淆衷,使用默認(rèn)的client_body_buffer_size設(shè)置,也就是操作系統(tǒng)頁(yè)面大小的兩倍渤弛,8k或者16k祝拯,問(wèn)題就出現(xiàn)了。
#無(wú)論使用firefox4.0還是IE8.0她肯,提交一個(gè)比較大佳头,200k左右的圖片,都返回500 Internal Server Error錯(cuò)誤
client_body_buffer_size 128k;
#表示使nginx阻止HTTP應(yīng)答代碼為400或者更高的應(yīng)答晴氨。
proxy_intercept_errors on;
#后端服務(wù)器連接的超時(shí)時(shí)間_發(fā)起握手等候響應(yīng)超時(shí)時(shí)間
#nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
proxy_connect_timeout 90;
#后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí))
#后端服務(wù)器數(shù)據(jù)回傳時(shí)間_就是在規(guī)定時(shí)間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù)
proxy_send_timeout 90;
#連接成功后康嘉,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
#連接成功后_等候后端服務(wù)器響應(yīng)時(shí)間_其實(shí)已經(jīng)進(jìn)入后端的排隊(duì)之中等候處理(也可以說(shuō)是后端服務(wù)器處理請(qǐng)求的時(shí)間)
proxy_read_timeout 90;
#設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
#設(shè)置從被代理服務(wù)器讀取的第一部分應(yīng)答的緩沖區(qū)大小,通常情況下這部分 應(yīng)答中包含一個(gè)小的應(yīng)答頭籽前,默認(rèn)情況下這個(gè)值的大小為指令proxy_buffers中指定的一個(gè)緩沖區(qū)的大小亭珍,不過(guò)可以將其設(shè)置為更小
proxy_buffer_size 4k;
#proxy_buffers緩沖區(qū),網(wǎng)頁(yè)平均在32k以下的設(shè)置
#設(shè)置用于讀取應(yīng)答(來(lái)自被代理服務(wù)器)的緩沖區(qū)數(shù)目和大小枝哄,默認(rèn)情況也為分頁(yè)大小块蚌,根據(jù)操作系統(tǒng)的不同可能是4k或者8k
proxy_buffers 4 32k;
#高負(fù)荷下緩沖大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#設(shè)置在寫(xiě)入proxy_temp_path時(shí)數(shù)據(jù)的大小膘格,預(yù)防一個(gè)工作進(jìn)程在傳遞文件時(shí)阻塞太長(zhǎng)
#設(shè)定緩存文件夾大小峭范,大于這個(gè)值,將從upstream服務(wù)器傳
proxy_temp_file_write_size 64k;
}
nginx狀態(tài)監(jiān)控
#Nginx運(yùn)行狀態(tài)瘪贱,StubStatus模塊獲取Nginx自啟動(dòng)的工作狀態(tài)(編譯時(shí)要開(kāi)啟對(duì)應(yīng)功能)
#location /NginxStatus {
# #啟用StubStatus的工作訪問(wèn)狀態(tài)
# stub_status on;
# #指定StubStaus模塊的訪問(wèn)日志文件
# access_log logs/Nginxstatus.log;
# #Nginx認(rèn)證機(jī)制(需Apache的htpasswd命令生成)
# #auth_basic "NginxStatus";
# #用來(lái)認(rèn)證的密碼文件
# #auth_basic_user_file ../htpasswd;
#}
反向代理
#以下配置追加在HTTP的全局變量中
#nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
proxy_connect_timeout 5;
#后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí))
proxy_send_timeout 5;
#連接成功后纱控,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
proxy_read_timeout 60;
#設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
proxy_buffer_size 16k;
#proxy_buffers緩沖區(qū),網(wǎng)頁(yè)平均在32k以下的話菜秦,這樣設(shè)置
proxy_buffers 4 32k;
#高負(fù)荷下緩沖大刑鸷Α(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#設(shè)定緩存文件夾大小,大于這個(gè)值球昨,將從upstream服務(wù)器傳
proxy_temp_file_write_size 64k;
#反向代理緩存目錄
proxy_cache_path /data/proxy/cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=1g;
#levels=1:2 設(shè)置目錄深度尔店,第一層目錄是1個(gè)字符,第2層是2個(gè)字符
#keys_zone:設(shè)置web緩存名稱和內(nèi)存緩存空間大小
#inactive:自動(dòng)清除緩存文件時(shí)間主慰。
#max_size:硬盤(pán)空間最大可使用值嚣州。
#指定臨時(shí)緩存文件的存儲(chǔ)路徑(路徑需和上面路徑在同一分區(qū))
proxy_temp_path
/data/proxy/temp
#服務(wù)配置
server {
#偵聽(tīng)的80端口
listen 80;
server_name localhost;
location / {
#反向代理緩存設(shè)置命令(proxy_cache zone|off,默認(rèn)關(guān)閉所以要設(shè)置)
proxy_cache cache_one;
#對(duì)不同的狀態(tài)碼緩存不同時(shí)間
proxy_cache_valid 200 304 12h;
#設(shè)置以什么樣參數(shù)獲取緩存文件名
proxy_cache_key $host$uri$is_args$args;
#后7端的Web服務(wù)器可以通過(guò)X-Forwarded-For獲取用戶真實(shí)IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#代理設(shè)置
proxy_pass http://IP;
#文件過(guò)期時(shí)間控制
expires 1d;
}
#配置手動(dòng)清楚緩存(實(shí)現(xiàn)此功能需第三方模塊 ngx_cache_purge)
#http://www.123.com/2017/0316/17.html訪問(wèn)
#http://www.123.com/purge/2017/0316/17.html清楚URL緩存
location ~ /purge(/.*) {
allow 127.0.0.1;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
#設(shè)置擴(kuò)展名以.jsp、.php共螺、.jspx結(jié)尾的動(dòng)態(tài)應(yīng)用程序不做緩存
location ~.*\.(jsp|php|jspx)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http://IP;
}
負(fù)載均衡
#負(fù)載均衡配置
upstream piao.jd.com {
#upstream的負(fù)載均衡该肴,weight是權(quán)重,可以根據(jù)機(jī)器配置定義權(quán)重藐不。weigth參數(shù)表示權(quán)值匀哄,權(quán)值越高被分配到的幾率越大秦效。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
#nginx的upstream目前支持4種方式的分配
#1、輪詢(默認(rèn))
#每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器涎嚼,如果后端服務(wù)器down掉阱州,能自動(dòng)剔除。
#2法梯、weight
#指定輪詢幾率苔货,weight和訪問(wèn)比率成正比,用于后端服務(wù)器性能不均的情況鹊汛。
#例如:
#upstream bakend {
# server 192.168.0.14 weight=10;
# server 192.168.0.15 weight=10;
#}
#2蒲赂、ip_hash
#每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器刁憋,可以解決session的問(wèn)題滥嘴。
#例如:
#upstream bakend {
# ip_hash;
# server 192.168.0.14:88;
# server 192.168.0.15:80;
#}
#3、fair(第三方)
#按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求至耻,響應(yīng)時(shí)間短的優(yōu)先分配若皱。
#upstream backend {
# server server1;
# server server2;
# fair;
#}
#4、url_hash(第三方)
#按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求尘颓,使每個(gè)url定向到同一個(gè)后端服務(wù)器走触,后端服務(wù)器為緩存時(shí)比較有效。
#例:在upstream中加入hash語(yǔ)句疤苹,server語(yǔ)句中不能寫(xiě)入weight等其他的參數(shù)互广,hash_method是使用的hash算法
#upstream backend {
# server squid1:3128;
# server squid2:3128;
# hash $request_uri;
# hash_method crc32;
#}
#tips:
#upstream bakend{#定義負(fù)載均衡設(shè)備的Ip及設(shè)備狀態(tài)}{
# ip_hash;
# server 127.0.0.1:9090 down;
# server 127.0.0.1:8080 weight=2;
# server 127.0.0.1:6060;
# server 127.0.0.1:7070 backup;
#}
#在需要使用負(fù)載均衡的server中增加 proxy_pass http://bakend/;
#每個(gè)設(shè)備的狀態(tài)設(shè)置為:
#1.down表示單前的server暫時(shí)不參與負(fù)載
#2.weight為weight越大,負(fù)載的權(quán)重就越大卧土。
#3.max_fails:允許請(qǐng)求失敗的次數(shù)默認(rèn)為1.當(dāng)超過(guò)最大次數(shù)時(shí)惫皱,返回proxy_next_upstream模塊定義的錯(cuò)誤
#4.fail_timeout:max_fails次失敗后,暫停的時(shí)間尤莺。
#5.backup: 其它所有的非backup機(jī)器down或者忙的時(shí)候旅敷,請(qǐng)求backup機(jī)器。所以這臺(tái)機(jī)器壓力會(huì)最輕颤霎。
#nginx支持同時(shí)設(shè)置多組的負(fù)載均衡媳谁,用來(lái)給不用的server來(lái)使用。
#client_body_in_file_only設(shè)置為On 可以講client post過(guò)來(lái)的數(shù)據(jù)記錄到文件中用來(lái)做debug
#client_body_temp_path設(shè)置記錄文件的目錄 可以設(shè)置最多3層目錄
#location對(duì)URL進(jìn)行匹配.可以進(jìn)行重定向或者進(jìn)行新的代理 負(fù)載均衡
}
URL重寫(xiě)
#根據(jù)不同的瀏覽器URL重寫(xiě)
if($http_user_agent ~ Firefox){
rewrite ^(.*)$ /firefox/$1 break;
}
if($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
#實(shí)現(xiàn)域名跳轉(zhuǎn)
location / {
rewrite ^/(.*)$ https://web8.example.com$1 permanent;
}
IP限制
#限制IP訪問(wèn)
location / {
deny 192.168.0.2友酱;
allow 192.168.0.0/24;
allow 192.168.1.1;
deny all;
}
Nginx相關(guān)命令
#啟動(dòng)nginx
nginx
#關(guān)閉nginx
nginx -s stop
#平滑重啟
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
nginx配置優(yōu)化
基本安全優(yōu)化
隱藏版本信息
一般來(lái)說(shuō)晴音,軟件的漏洞都和版本相關(guān),所以我們要隱藏或消除web服務(wù)對(duì)訪問(wèn)用戶顯示的各種敏感信息粹污。
[root@db01 rpm]# curl -I 10.0.0.8
HTTP/1.1 401 Unauthorized
Server: nginx #隱藏版本號(hào)
Date: Thu, 21 Jul 2016 03:23:38 GMT
Content-Type: text/html
Content-Length: 188
Connection: keep-alive
WWW-Authenticate: Basic realm="oldboy training"
過(guò)程:
vim /application/nginx/conf/nginx.conf
在http模塊下加入:
server_tokens off;
/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload
隱藏nginx要修改源代碼
要修改內(nèi)容的路徑:
第一路徑:
/home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14段多,16行
#define NGINX_VERSION "1.6.2" 修改為想要的版本號(hào)如2.4.3
#define NGINX_VER "nginx/" NGINX_VERSION 將nginx修改為想要修改的軟件名稱,如Apache壮吩。
第二路徑
/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行
grep 'Server:nginx' ngx_http_header_filter_module.cstatic
sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c
第三路徑
/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行
"<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF
"<hr><center>OWS</center>" CRLF
然后重新編譯
更改nginx服務(wù)的默認(rèn)用戶
第一種方法:
直接更改配置文件nginx.conf.default參數(shù)进苍,將默認(rèn)的#user nobody;改為user nginx.nginx;
第二種方法:
直接在編譯nginx的時(shí)候指定用戶和用戶組命令如下:
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
降權(quán)啟動(dòng)nginx
useradd inca
cd /home/inca/
mkdir conf logs www
echo inca >www/index.html
chown -R inca.inca *
ln -s /application/nginx/conf/mime.types conf/mime.types #mime.types媒體類(lèi)型文件
egrep -v "#|^$" /application/nginx/conf/nginx.conf.default >conf/nginx.conf
nginx.conf配置文件
worker_processes 1;
error_log /home/inca/logs/error.log;
pid /home/inca/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
location / {
root /home/inca/www;
index index.html index.htm;
}
access_log /home/inca/logs/access.log main;
}
}
su - inca -c "/application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf" #啟動(dòng)nginx服務(wù)
重點(diǎn)強(qiáng)調(diào):
1.nginx.conf里面的相關(guān)路徑都要更改
2.普通用戶的端口問(wèn)題
根據(jù)參數(shù)優(yōu)化nginx服務(wù)性能
優(yōu)化nginx進(jìn)程個(gè)數(shù)的策略
在高并發(fā)、高訪問(wèn)量的web服務(wù)場(chǎng)景鸭叙,需要事先啟動(dòng)好更多的nginx進(jìn)程觉啊,以保證快速響應(yīng)并處理大量并發(fā)用戶的請(qǐng)求。
worker_processes 1; #一般調(diào)整到與CPU的顆數(shù)相同
查看LInux可查看CPU個(gè)數(shù)及總核數(shù)
grep processor /proc/cpuinfo|wc -l
查看CPU總顆數(shù)
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
通過(guò)執(zhí)行top命令沈贝,然后按數(shù)字1杠人,即可顯示所有的CPU核數(shù)
top #按1鍵就會(huì)顯示第一個(gè)的信息
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0
優(yōu)化綁定不同的nginx進(jìn)程到不同的CPU上
默認(rèn)情況下,nginx的進(jìn)程跑在某一個(gè)CPU或CPU的某一個(gè)核上宋下,導(dǎo)致nginx進(jìn)程使用硬件的資源不均嗡善,本節(jié)的優(yōu)化是不同的nginx進(jìn)程給不同的CPU處理,充分有效的利用有效的硬件資源
四核cpu配置
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
雙核配置
worker_processes 2;
worker_cpu_affinity 0101 1010;
還有一個(gè)命令taskset -c用來(lái)分配服務(wù)給CPU
nginx事件處理模型優(yōu)化
nginx的連接處理機(jī)制在于不同的操作系統(tǒng)會(huì)采用不同的IO模型学歧,Linux下罩引,nginx使用epoll的I/O多路復(fù)用模型,在freebsd使用kqueue的IO多路復(fù)用模型枝笨,在solaris使用/dev/pool方式的IO多路復(fù)用模型袁铐,在windows使用的icop等等。
要根據(jù)系統(tǒng)類(lèi)型不同選擇不同的事務(wù)處理模型横浑,選擇有“use [ kqueue | rtsig | epool |dev/pool | select | pllo ];”我們使用的是Centos6.5的linux剔桨,因此將nginx的事件處理模型調(diào)整為epool模型。
events {
worker_connections 1024;
use epoll;
}
官方說(shuō)明:在不指定事件處理模型時(shí)徙融,nginx默認(rèn)會(huì)自動(dòng)的選擇最佳的事件處理模型服務(wù)
調(diào)整nginx單個(gè)進(jìn)程允許的客戶端最大連接數(shù)
參數(shù)語(yǔ)法:worker_connections number
默認(rèn)配置:worker_connections 512
放置位置:events 標(biāo)簽
events {
worker_connections 1024; #一個(gè)worker進(jìn)程的并發(fā)
}
總并發(fā)= worker_processes* worker_connections
配置nginx worker進(jìn)程最大打開(kāi)文件數(shù)
參數(shù)語(yǔ)法:worker_rlimit_nofile number
放置位置:主標(biāo)簽段
說(shuō)明:作用是改變worker processes能打開(kāi)的最大文件數(shù)
worker_rlimit_nofile 65535;
這各參數(shù)受系統(tǒng)文件的最大打開(kāi)數(shù)限制洒缀,解決方法:
[root@admin nginx]# cat /proc/sys/fs/file-max
8192
文件系統(tǒng)最大可打開(kāi)文件數(shù)
[root@admin nginx]# ulimit -n
1024
程序限制只能打開(kāi)1024個(gè)文件
使用# ulimit -n 8192調(diào)整一下
或者永久調(diào)整打開(kāi)文件數(shù) 可在啟動(dòng)文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx無(wú)效)
開(kāi)啟高效文件傳輸模式
設(shè)置參數(shù) sendfile on;
sendfile參數(shù)用于開(kāi)啟文件的高效傳輸模式。同時(shí)將tcp_nopush和tcp_nodelay兩個(gè)指令設(shè)置為on欺冀,可防止網(wǎng)絡(luò)及磁盤(pán)i/o阻塞树绩,提升nginx工作效率。
http {
sendfile on; #放在http脚猾,server葱峡,location都可以
}
設(shè)置參數(shù)tcp_nopush;
激活tcp_nopush參數(shù)可以允許把httpresponse header和文件的開(kāi)始放在一個(gè)文件里發(fā)布龙助,積極的作用是減少網(wǎng)絡(luò)報(bào)文段的數(shù)量(只有sendfile on開(kāi)啟才生效)
復(fù)制代碼
例:
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
server_names_hash_bucket_size 128;
server_names_hash_max_size 512;
keepalive_timeout 65;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 60s;
FastCGI相關(guān)參數(shù)調(diào)優(yōu)
fastcgi參數(shù)是配合nginx向后請(qǐng)求PHP動(dòng)態(tài)引擎服務(wù)的相關(guān)參數(shù)砰奕。
fastcgi_connect_timeout 240;
fastcgi_send_timeout 240;
fastcgi_read_timeout 240;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
配置nginx gzip壓縮實(shí)現(xiàn)性能優(yōu)化
nginx壓縮功能的介紹:
nginx gzip壓縮模塊提供了壓縮文件內(nèi)容的功能,用戶請(qǐng)求的內(nèi)容在發(fā)送給客戶端之前提鸟,nginx服務(wù)器會(huì)根據(jù)一些具體的策略實(shí)施壓縮军援,以節(jié)省網(wǎng)站出口帶寬,同時(shí)加快了數(shù)據(jù)傳輸效率称勋,提升了用戶的訪問(wèn)體驗(yàn)胸哥。
壓縮的優(yōu)點(diǎn):
提升網(wǎng)站用戶體驗(yàn):由于發(fā)給用戶的內(nèi)容小了,所以用戶訪問(wèn)單位大小的頁(yè)面就快了赡鲜,用戶體驗(yàn)就提升了
節(jié)約網(wǎng)站帶寬成本:由于數(shù)據(jù)時(shí)壓縮傳輸?shù)目昭幔虼寺瑫?huì)消耗一些cpu資源
壓縮的對(duì)象:
純文本內(nèi)容壓縮比很高,因此嘲更,純文本的內(nèi)容最好要壓縮
被壓縮的純文本文件必須要大于1KB筐钟,由于壓縮算法的特殊原因,極小的文件壓縮反而變大
圖片赋朦、視頻(流媒體)等文件盡量不要壓縮篓冲,因?yàn)檫@些文件大多都是經(jīng)過(guò)壓縮的,如果再壓縮很可能不會(huì)減小或減小很少宠哄,或者有可能增大壹将,而在壓縮時(shí)還會(huì)消耗大量的CPU、內(nèi)存資源
參數(shù)介紹及配置說(shuō)明:
gzip on; #表示開(kāi)啟壓縮功能
gzip_min_length 1k; #表示允許壓縮的頁(yè)面最小字節(jié)數(shù)毛嫉,頁(yè)面字節(jié)數(shù)從header頭的Content-Length中獲取诽俯。默認(rèn)值是0,表示不管頁(yè)面多大都進(jìn)行壓縮狱庇,建議設(shè)置成大于1K惊畏。如果小于1K可能會(huì)越壓越大
gzip_buffers 4 32k; #壓縮緩存區(qū)大小
gzip_http_version 1.1; #壓縮版本
gzip_comp_level 9; #壓縮比率
gzip_types text/css text/xml application/javascript; #指定壓縮的類(lèi)型
gzip_vary on; #vary header支持
完美配置:
nginx.conf http模塊
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
nginx expires功能
為用戶訪問(wèn)網(wǎng)站的內(nèi)容設(shè)定一個(gè)過(guò)期時(shí)間,當(dāng)用戶第一次訪問(wèn)到這些內(nèi)容時(shí)密任,會(huì)把這些內(nèi)容存儲(chǔ)在用戶瀏覽器本地颜启,這樣用戶第二次及之后繼續(xù)訪問(wèn)該網(wǎng)站,瀏覽器就會(huì)檢查已經(jīng)緩存在用戶瀏覽器本地的內(nèi)容浪讳,就不會(huì)去瀏覽器下載了缰盏,直到緩存的內(nèi)容過(guò)期或者被清除為止。
expires作用和優(yōu)點(diǎn):
expires可以降低網(wǎng)站的帶寬淹遵,節(jié)約成本
加快用戶訪問(wèn)網(wǎng)站的速度口猜,提升了用戶訪問(wèn)體驗(yàn)
服務(wù)器訪問(wèn)量降低,服務(wù)器壓力就減輕了透揣,服務(wù)器的成本也會(huì)降低济炎,甚至可以節(jié)約人力成本
幾乎對(duì)于所有web服務(wù)來(lái)說(shuō),這是非常重要的功能之一辐真,apache服務(wù)也有此功能须尚。
nginx expires 配置詳解:
## Add expires header according to URI(path or dir).
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
expire缺點(diǎn)及解決辦法:
當(dāng)網(wǎng)站被緩存的頁(yè)面或數(shù)據(jù)更新了,此時(shí)用戶端看到的可能還是舊的已經(jīng)緩存的內(nèi)容侍咱,這樣就會(huì)影響用戶體驗(yàn)耐床,那么如何解決這個(gè)問(wèn)題呢?
第一:對(duì)于經(jīng)常需要的變動(dòng)圖片等文件,可以縮短對(duì)象緩存時(shí)間楔脯,例如撩轰,百度、谷歌等網(wǎng)站的首頁(yè)圖片經(jīng)常會(huì)換成一些節(jié)日的圖,這里可以將緩存期修改為1天
第二:當(dāng)網(wǎng)站改版或更新內(nèi)容時(shí)堪嫂,可以在服務(wù)器將緩存的對(duì)象改名(網(wǎng)站代碼程序)
對(duì)于網(wǎng)站的圖片偎箫、附件,一般不會(huì)被用戶直接修改溉苛,用戶層面上的修改圖片镜廉,實(shí)際上是重新傳到服務(wù)器弄诲,雖然內(nèi)容一樣但是一個(gè)新的圖片名了
網(wǎng)站改版升級(jí)會(huì)修改JS愚战、CSS元素,若改版的時(shí)候?qū)@些元素改了名齐遵,會(huì)使得前端的CDN以及用戶端需要重新緩存內(nèi)容
nginx日志的優(yōu)化
編寫(xiě)腳本實(shí)現(xiàn)日志輪詢
編寫(xiě)腳本實(shí)現(xiàn)nginx access日志輪詢
用戶咋請(qǐng)求一個(gè)軟件時(shí)寂玲,絕大多數(shù)軟件都會(huì)記錄用戶的訪問(wèn)情況,nginx軟件目前沒(méi)有類(lèi)似apache通過(guò)cronolog或者rotatelog對(duì)日志分隔處理的功能梗摇,但是拓哟,運(yùn)維人員可以通過(guò)利用腳本開(kāi)發(fā)、nginx的信號(hào)控制功能或reload重新加載伶授,來(lái)實(shí)現(xiàn)日志的自動(dòng)切割断序、輪詢。
操作步驟:
#寫(xiě)一個(gè)定時(shí)任務(wù)
mv www_access.log www_access_$(date +F -d -1day).log
/applocation/nginx/sbin/nginx -s reload
不記錄不需要的日志
在實(shí)際工作中糜烹,對(duì)于負(fù)載均衡器健康檢查節(jié)點(diǎn)或某些特定的文件(圖片违诗、JS、CSS)的日志疮蹦,一般不需要記錄下來(lái)诸迟,因?yàn)樵诮y(tǒng)計(jì)PV時(shí)是按照頁(yè)面計(jì)算的,而且日志寫(xiě)入的太頻繁會(huì)消耗磁盤(pán)i/o愕乎,降低服務(wù)的性能
具體配制方法:
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
訪問(wèn)日志的權(quán)限設(shè)置
假如日志目錄為/app/logs阵苇,則授權(quán)方法為:
chown -R root.root /app/logs
chmod -R 600 /app/logs
不需要在日志目錄上給nginx用戶讀寫(xiě)或者讀寫(xiě)許可,很多人都沒(méi)有注意這個(gè)問(wèn)題感论,這就稱為了安全隱患绅项。
nginx站點(diǎn)目錄及文件URL訪問(wèn)控制
根據(jù)擴(kuò)展名限制程序和文件訪問(wèn)
web2.0時(shí)代,絕大多數(shù)網(wǎng)站都是以用戶為中心的比肄,這些產(chǎn)品有一些共同點(diǎn)快耿,就是不允許用戶發(fā)布內(nèi)容到服務(wù)器,還允許用戶發(fā)圖片甚至附件上傳到服務(wù)器上薪前,給用戶開(kāi)啟了上傳的功能润努。帶來(lái)了很大的安全隱患。
下面將利用nginx配置禁止訪問(wèn)上傳資源目錄下的PHP,SHELL,PERL,PYTHON程序文件示括,這樣就算是用戶上傳了木馬文件也沒(méi)辦法執(zhí)行
location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$
{
deny all;
}
location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$
{
deny all;
}
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
{
deny all;
}
對(duì)于上述目錄的限制必須寫(xiě)在nginx處理PHP服務(wù)配置的前面
禁止訪問(wèn)指定目錄下的所有文件和目錄
配置禁止訪問(wèn)指定的單個(gè)或多個(gè)目錄
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
禁止訪問(wèn)目錄并且返回代碼404
server {
listen 80;
server_name www.etiantian.org etiantian.org;
root /data0/www/www;
index index.html index.htm;
access_log /app/logs/www_access.log commonlog;
location /admin/ { return 404; }
location /templates/ { return 403; }
}
限制網(wǎng)站來(lái)源的IP訪問(wèn)
使用ngx_http_access_module限制網(wǎng)站來(lái)源IP訪問(wèn)铺浇。
范例1:禁止外界訪問(wèn),但允許某個(gè)IP訪問(wèn)該目錄
location ~ ^/oldboy/ {
allow 202.111.12.211;
deny all;
}
范例2:限制及指定IP或IP段訪問(wèn)垛膝。
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
配置nginx禁止非法域名解析訪問(wèn)企業(yè)網(wǎng)站
問(wèn)題:nginx如何防止用戶IP訪問(wèn)網(wǎng)站(惡意域名解析鳍侣,相當(dāng)于直接使用IP訪問(wèn)網(wǎng)站)
方法1:直接報(bào)錯(cuò)丁稀,用戶體驗(yàn)不好
server {
listen 80 default_server;
server_name _;
return 501;
}
方法2:通過(guò)301跳轉(zhuǎn)到主頁(yè)
server {
listen 80 default_server;
server_name _;
rewrite ^(.*) http//:blog.etiantian.org/$1 permanent;
}
nginx圖片防盜鏈解決方案。
簡(jiǎn)單的說(shuō)倚聚,沒(méi)有經(jīng)過(guò)你的允許在自己網(wǎng)站嵌入你的圖片线衫。
常見(jiàn)的防盜鏈解決方案的基本原理
根據(jù)HTTP referer實(shí)現(xiàn)防盜鏈
根據(jù)cookie防盜鏈
防盜鏈實(shí)戰(zhàn)
被盜鏈的網(wǎng)站配置
#Preventing hot linking of images and other file types
location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {
valid_referers none blocked *.etiantian.org etiantian.org;
if ($invalid_referer) {
rewrite ^/ http://bbs.etiantian.org/img/nolink.gif;
}
root html/www;
15 }
nginx錯(cuò)誤頁(yè)面的優(yōu)雅顯示
范例:當(dāng)出現(xiàn)403錯(cuò)誤會(huì)跳轉(zhuǎn)到403.html頁(yè)面
error_page 403 /403.html;
部署網(wǎng)站程序權(quán)限設(shè)置
wordpress站點(diǎn)目錄權(quán)限設(shè)置
方案1:推薦方案
目錄:755
文件:644
所有者:root
圖片及上傳目錄設(shè)置所有者為www
cd /application/apache/html/
chown -R root.root blog
find ./blog/ -type f|xargs chmod 644
find ./blog/ -type d|xargs chmod 755
nginx防爬蟲(chóng)優(yōu)化
配置
if ($http_user_agent ~* LWP:Simple|BBBike|wget) {
return 403 ;
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}
利用nginx限制HTTP的請(qǐng)求方法
配置:
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
}
配置上傳服務(wù)器限制HTTP的GET的配置
#Only allow these request methods ##
if ($request_method ~*(GET)$ ) {
return 501;
}
使用CDN做網(wǎng)站內(nèi)容加速
cdn特點(diǎn)
本地Cache加速 提高了企業(yè)站點(diǎn)(尤其含有大量圖片和靜態(tài)頁(yè)面站點(diǎn))的訪問(wèn)速度,并大大提高以上性質(zhì)站點(diǎn)的穩(wěn)定性
鏡像服務(wù) 消除了不同運(yùn)營(yíng)商之間互聯(lián)的瓶頸造成的影響惑折,實(shí)現(xiàn)了跨運(yùn)營(yíng)商的網(wǎng)絡(luò)加速授账,保證不同網(wǎng)絡(luò)中的用戶都能得到良好的訪問(wèn)質(zhì)量。
遠(yuǎn)程加速 遠(yuǎn)程訪問(wèn)用戶根據(jù)DNS負(fù)載均衡技術(shù)智能自動(dòng)選擇Cache服務(wù)器惨驶,選擇最快的Cache服務(wù)器白热,加快遠(yuǎn)程訪問(wèn)的速度
帶寬優(yōu)化 自動(dòng)生成服務(wù)器的遠(yuǎn)程Mirror(鏡像)cache服務(wù)器,遠(yuǎn)程用戶訪問(wèn)時(shí)從cache服務(wù)器上讀取數(shù)據(jù)粗卜,減少遠(yuǎn)程訪問(wèn)的帶寬屋确、分擔(dān)網(wǎng)絡(luò)流量、減輕原站點(diǎn)WEB服務(wù)器負(fù)載等功能续扔。
集群抗攻擊 廣泛分布的CDN節(jié)點(diǎn)加上節(jié)點(diǎn)之間的智能冗余機(jī)制攻臀,可以有效地預(yù)防黑客入侵以及降低各種D.D.o.S攻擊對(duì)網(wǎng)站的影響,同時(shí)保證較好的服務(wù)質(zhì)量 纱昧。
使用普通用戶啟動(dòng)Nginx(監(jiān)牢模式)
解決方案
給Nginx服務(wù)降權(quán),用普通用戶跑Nginx服務(wù)刨啸,給開(kāi)發(fā)及運(yùn)維設(shè)置普通賬號(hào)
開(kāi)發(fā)人員使用普通賬號(hào)即可管理nginx服務(wù)及站點(diǎn)下的程序和日志
責(zé)任劃分:網(wǎng)絡(luò)問(wèn)題:運(yùn)維責(zé)任,網(wǎng)站打不開(kāi)開(kāi)發(fā)責(zé)任砌些。(共同承擔(dān))
實(shí)戰(zhàn)配置:
useradd inca
cd /home/inca
mkdir conf www log
echo inca >www/index.html
修改配置文件
error_log /home/inca/log/error.log
pid /home/inca/log/nginx.pid
控制Nginx并發(fā)連接數(shù)量
ngx_http_limit_conn_module這個(gè)模塊用于限制每個(gè)定義key值得連接數(shù)呜投,特別是單個(gè)TP的連接數(shù)。
不是所有的連接數(shù)都會(huì)被計(jì)算存璃。一個(gè)符合計(jì)數(shù)要求的連接是整個(gè)請(qǐng)求頭已經(jīng)被讀取的連接仑荐。
控制Nginx并發(fā)連接數(shù)量參數(shù)的說(shuō)明
limit_conn_zone參數(shù):
語(yǔ)法:limit_conn_zone key zone=name:size;
上下文:http
用于設(shè)置共享內(nèi)存區(qū)域,key可以是字符串纵东、Nginx自帶變量或前兩個(gè)組合粘招。name為內(nèi)存區(qū)域的名稱,size為內(nèi)存區(qū)域的大小偎球。
limit_conn參數(shù)
語(yǔ)法:limit_conn zone number;
上下文:http洒扎、server、location
用于指定key設(shè)置最大連接數(shù)衰絮。當(dāng)超時(shí)最大連接數(shù)時(shí)袍冷,服務(wù)器會(huì)返回503報(bào)錯(cuò)。
控制客戶端請(qǐng)求Nginx的速率
ngx_http_limit_req_module模塊用于限制每個(gè)IP訪問(wèn)每個(gè)定義key的請(qǐng)求速率猫牡。
limit_req_zone參數(shù)說(shuō)明如下胡诗。
語(yǔ)法:limit_req_zone key zone=name:size rate=rate;
上下文:http
用于設(shè)置共享內(nèi)存區(qū)域,key可以是字符串,Nginx自帶變量或前兩個(gè)組合煌恢。name為內(nèi)存區(qū)域的名稱骇陈,size為內(nèi)存區(qū)域的大小,rate為速率瑰抵,單位為r/s,每秒一個(gè)請(qǐng)求你雌。
limit_req參數(shù)說(shuō)明如下:
語(yǔ)法:limit_req zone=name [burst-number] [nobelay]
上下文:http、server二汛、location
這里運(yùn)用了令牌桶原理婿崭,burst=num,一個(gè)有num快令牌习贫,令牌發(fā)完后逛球,多出來(lái)的那些請(qǐng)求就會(huì)返回503。
nodelay默認(rèn)在不超過(guò)burst值得前提下會(huì)排隊(duì)等待處理苫昌,如果使用此參數(shù),就會(huì)處理完num+1次請(qǐng)求幸海,剩余的請(qǐng)求為超時(shí)祟身,返回503。
一個(gè)完整的配置
user www-data;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 100000;
events
{
worker_connections 2048;
multi_accept on;
use epoll;
}
http
{
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
access_log off;
error_log /var/log/nginx/error.log crit;
keepalive_timeout 10;
client_header_timeout 10;
client_body_timeout 10;
reset_timedout_connection on;
send_timeout 10;
limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 100;
include /etc/nginx/mime.types;
default_type text/html;
charset UTF-8;
gzip on;
gzip_disable "msie6";
gzip_proxied any;
gzip_min_length 1000;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}