Nginx是一款輕量級的高性能的Web 服務器、反向代理服務器及電子郵件(IMAP/POP3)代理服務器
正向代理,是一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容返回給客戶端??蛻舳瞬拍苁褂谜虼?。
正向代理的典型用途是為在防火墻內的局域網客戶端提供訪問Internet的途徑。正向代理還可以使用緩沖特性(由mod_cache提供)減少網絡使用率。
通過正向代理訪問任意網站并且隱藏客戶端自身
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。
稱是Content Delivery Network,即內容分發網絡。其基本思路是盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。通過在網絡各處放置反向代理節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度
為了讓Nginx支持更多的并發連接數,根據實際情況對工作線程數和每個工作線程支持的最大連接數進行調整。例如設置"worker_processes 10"和"worker_connections 1024",那這臺服務器支持的最大連接數就是10×1024=10240。
worker_processes 10;
events {
use epoll;
worker_connections 10240;
}
涉及模塊:ngx_http_access_module
模塊概述:允許限制某些 IP 地址的客戶端訪問。
location / {
deny192.168.1.1;
allow192.168.1.0/24;
allow10.1.1.0/16;
allow2001:0db8::/32;
deny all;
}
IPv4 的網絡中只有 10.1.1.0/16 和 192.168.1.0/24 允許訪問,但 192.168.1.1 除外;對于 IPv6 的網絡,只有 2001:0db8::/32 允許訪問。
limit_rate_after和 limit_rate配合使用表示在下載的文件大小達到設定數后開啟限速效果(逐漸降速)。
limit_rate
語法: limit_rate rate;
默認值: limit_rate 0;
作用域: http, server, location, if in location
命令概述:限制向客戶端傳送響應的速率限制。參數 rate 的單位是字節/秒,設置為 0 將關閉限速。 nginx 按連接限速,所以如果某個客戶端同時開啟了兩個連接,那么客戶端的整體速率是這條指令設置值的 2 倍。
這個的配置是基于 ngx_http_limit_zone_module 模塊的,要簡單完成并發限制,我們要涉及到 limit_conn_zone 和 limit_conn 這兩個指令:
limit_conn_zone
語法: limit_conn_zone zone_name $variable the_size
作用域: http
本指令定義了一個數據區,里面記錄會話狀態信息。 variable 定義判斷會話的變量;the_size 定義記錄區的總容量。
http {
limit_conn_zone $binary_remote_addr zone=one:10m;
...
server {
...
location /seven/ {
limit_conn one 1;
.....
}
定義一個叫“one”的記錄區,總容量為 10M,以變量 $binary_remote_addr 作為會話的判斷基準(即一個地址一個會話)。 限制 /seven/ 目錄下,一個會話只能進行一個連接。 簡單點,就是限制 /seven/ 目錄下,一個 IP 只能發起一個連接,多過一個,一律 503。
$binary_remote_addr 的長度為 4 bytes,會話信息的長度為 32 bytes。 當 zone 的大小為 1M 的時候,大約可以記錄 32000 個會話信息(一個會話占用 32 bytes)。
http {
limit_rate 500k; #每個連接的速度限制,0表示取消限制
limit_rate_after 800k; #大于500K才進行限速
limit_zone to_vhost $server_name 1m; #每個域名的總帶寬限制
limit_conn to_vhost 30; #每個連接可以開多少個線程
}
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s模塊開啟對單個ip、單個會話在單位時間內請求的限制。這里zone和limit_conn_zone模塊一樣,rate表示限制的速率,1r/s表示一秒之內最多1次請求,也可以用5r/m,表示一分鐘之內最多5次請求。limit_req_zone同樣配置在http配置段。與limit_req指令配合使用才生效。limit_req zone=one burst=5表示該location段使用one定義的limit_req_zone,如果請求數超過 rate=1r/s,剩下的請求將被延遲處理,如果請求數超過burst定義的數量,多余的請求則直接返回503錯誤。
如果開啟nodelay,則超過rate=1r/s的請求直接返回503,不再延遲處理。
詳細的官方規則:
http://wiki.nginx.org/NginxChsHttpLimit_zoneModule
DDOS 的特點是分布式,針對帶寬和服務***,也就是四層流量***和七層應用***,相應的防御瓶頸四層在帶寬,七層的多在架構的吞吐量。對于七層的應用***,我們還是可以做一些配置來防御的,使用 nginx 的 http_limit_conn 和 http_limit_req 模塊通過限制連接數和請求數能相對有效的防御。
ngx_http_limit_conn_module 可以限制單個 IP 的連接數
ngx_http_limit_req_module 可以限制單個 IP 每秒請求數
限制每秒請求數
涉及模塊:ngx_http_limit_req_module
通過漏桶原理來限制單位時間內的請求數,一旦單位時間內請求數超過限制,就會返回 503 錯誤。
配置范例:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
...
server {
...
location ~ .php$ {
limit_req zone=one burst=5 nodelay;
}
}
}
配置說明:
$binary_remote_addr 二進制遠程地址
rate=10r/s; 限制頻率為每秒 10 個請求
burst=5 允許超過頻率限制的請求數不多于 5 個,假設 1、2、3、4 秒請求為每秒 9 個,那么第 5 秒內請求 15 個是允許的;反之,如果第一秒內請求 15 個,會將 5 個請求放到第二秒,第二秒內超過 10 的請求直接 503,類似多秒內平均速率限制。
nodelay 超過的請求不被延遲處理,設置后 5(不延時)+10(延時)個請求在 1 秒內處理。(這只是理論數據,最多的情況)
限制 IP 連接數
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /操作目錄/ {
limit_conn addr 1;
}
}
}
封IP地址
訪問者通過瀏覽器正常訪問網站,與服務器建立的連接一般不會超過20個,我們可以通過腳本禁止連接數過大的IP訪問。以下腳本通過netstat命令列舉所有連接,將連接數最高的一個IP如果連接數超過150,則通過 iptables阻止訪問:
#!/bin/sh
status=`netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' |awk -F ":" -- '{print $1}' |sort -n|uniq -c |sort -n|tail -n 1`
NUM=`echo $status|awk '{print $1}'`
IP=`echo $status|awk '{print $2}'`
result=`echo "$NUM > 150" | bc`
if [ $result = 1 ]
then
echo IP:$IP is over $NUM, BAN IT!
/sbin/iptables -I INPUT -s $IP -j DROP
fi
運行crontab -e,將上述腳本添加到crontab每分鐘自動運行:
* * * * * /root/xxxx.sh
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
用法: keepalive connections;
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
connections 連接到上游服務器的最大并發空閑keepalive長連接數(默認是未設置)當這個數被超過時,使用"最近最少使用算法(LUR)"來淘汰并關閉連接
http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_requests
用法:keepalive_requests number;
設置通過"一個存活長連接"送達的最大請求數(默認是100,建議根據客戶端在"keepalive"存活時間內的總請求數來設置) 當送達的請求數超過該值后,該連接就會被關閉。
keepalive_requests 8192;
http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
用法:keepalive_timeout timeout [header_timeout];
第一個參數設置"keep-alive客戶端長連接"將在"服務器端"繼續打開的超時時間 可選的第二個參數設置“Keep-Alive: timeout=time”響應頭字段的值
http {
keepalive_timeout 20; --長連接timeout
keepalive_requests 8192; --每個連接最大請求數
}
通過在upstream參數中添加的應用服務器IP后添加指定參數即可實現,如:
upstream tomcatserver1 {
server 192.168.72.49:8080 weight=3;
server 192.168.72.49:8081;
}
server {
listen 80;
server_name 8080.max.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcatserver1;
index index.html index.htm;
}
}
通過以上配置,便可以實現,在訪問8080.max.com這個網站時,由于配置了proxy_pass地址,所有請求都會先通過nginx反向代理服務器,在服務器將請求轉發給目的主機時,讀取upstream為 tomcatsever1的地址,讀取分發策略,配置tomcat1權重為3,所以nginx會將大部分請求發送給49服務器上的tomcat1,也就是8080端口;較少部分給tomcat2來實現有條件的負載均衡,當然這個條件就是服務器1、2的硬件指數處理請求能力。
upstream myServer {
server 192.168.72.49:9090 down;
server 192.168.72.49:8080 weight=2;
server 192.168.72.49:6060;
server 192.168.72.49:7070 backup;
}
down 表示單前的server暫時不參與負載
Weight 默認為1.weight越大,負載的權重就越大。
max_fails 允許請求失敗的次數默認為1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
fail_timeout max_fails 次失敗后,暫停的時間。
Backup 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
負載均衡服務器也需要高可用,以防如果負載均衡服務器掛掉了,后面的應用服務器也紊亂無法工作。
實現高可用的方案:添加冗余。添加n臺nginx服務器以避免發生上述單點故障keepalive+nginx實現負載均衡高可用
主備機上都運行高可用(High Availability)監控程序,通過傳送心跳信息來監控對方的運行狀況。當備份機不能在一定的時間內收到對方的正常心跳時,它就接管主服務器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。
1.提供兩個Nginx負載服務器
2.分別在兩臺服務器上安裝keepalived
3、配置keepalived
虛擬IP指向A和B,當A宕機時,虛擬IP漂移到B上,A啟起來后自動成為master
通過對兩臺服務器的keepalive進行配置,區分出主機和備機服務器,state MASTER 為主機,priority 優先級值大于備機,state BACKUP為備機。
nginx的http_proxy模塊,可以實現類似于Squid的緩存功能。Nginx對客戶已經訪問過的內容在Nginx服務器本地建立副本,這樣在一段時間內再次訪問該數據,就不需要通過Nginx服務器再次向后端服務器發出請求,所以能夠減少Nginx服務器與后端服務器之間的網絡流量,減輕網絡擁塞,同時還能減小數據傳輸延遲,提高用戶訪問速度。同時,當后端服務器宕機時,Nginx服務器上的副本資源還能夠回應相關的用戶請求。
直接映射到目錄/home/test
location /home/test {
root /;
autoindex on; #開啟
autoindex_localtime on; #開啟顯示功能
autoindex_exact_size off;
autoindex_format html;
}
映射到目錄/home
location /home {
root /;
rewrite ^/home/(.*)$ /home/$1 break;
autoindex on; #開啟
autoindex_localtime on; #指定目錄列表中時間是本地時區顯示還是 UTC
autoindex_exact_size off;?。utoindex_exact_size :對于 HTML 輸出格式,指定是否準確的輸出文件的大小
autoindex_format html;?。TO置目錄列表的輸出格式 autoindex_format html | xml | json | jsonp;
}
或者
location /home/eyou/Downloads {
alias /home/;
fancyindex on; #開啟fancy索引
fancyindex_exact_size off; # 不使用精確大小,使用四舍五入
fancyindex_default_sort date_desc;
fancyindex_localtime on; # 使用本地時間
}
或者
location / {
root /home/eayou;
fancyindex on; #開啟fancy索引
fancyindex_exact_size off; # 不使用精確大小,使用四舍五入
fancyindex_default_sort date_desc;
}
由于nginx自帶的文件索引服務功能比較單一,所以一般采用Fancy Index插件,Ubuntu下安裝Fancy Index插件的方法是
sudo apt-get install nginx-extras
location /test/ {
root /;
rewrite ^/test/(.*)$ /home/$1 break;
fancyindex on; #開啟fancy索引
fancyindex_exact_size off; # 不使用精確大小,使用四舍五入
fancyindex_default_sort date_desc;
fancyindex_localtime on; # 使用本地時間
fancyindex_footer "myfooter.shtml"; #當前路徑下的myfooter.shtml內容作為底部
}
配置:
location /home/test-redirect {
rewrite ^/home/test-redirect/(.*) https://www.baidu.com$1 redirect;
}
訪問127.0.0.1/home/test-redirect跳轉到https://www.baidu.com, 返回狀態碼是 302 Moved Temporarily
強制將http轉換到https鏈接
rewrite ^(.*)$ https://$host$1 permanent;
不想讓別人調用自己的圖片,一是因為個人版權的問題,再一點就是會增加服務器的負載、還會產生一些沒必要的流量。
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.kenmy.com kenmy.com ;
if ($invalid_referer) {
rewrite ^/ http://www.kenmy.com/retrun.html;
#return 403;
}
}
第一行:gif|jpg|png|swf|flv
表示對gif、jpg、png、swf、flv后綴的文件實行防盜鏈
第二行: 表示對www.kenmy.com、kenmy.com 這2個來路進行判斷
if{}里面內容的意思是,如果來路不是指定來思是,如果來路不是指定來路就跳轉到http://www.kenmy.com/retrun.html頁面,當然直接返回403也是可以的。
location /images/ {
alias /data/images/;
valid_referers none blocked server_names *.xok.la xok.la ;
if ($invalid_referer) {return 403;}
}
http {
upstream myproject {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://myproject;
}
}
}
nginx -t #結果顯示ok和success沒問題便可重啟
nginx -s reload
靈活簡單的配置;
處理靜態文件,索引文件以及自動索引;
反向代理加速,簡單的負載均衡和容錯;
模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。
SSL 和 TLS SNI 支持;
支持 keep-alive 和管道連接;
重新配置和在線升級而無須中斷客戶的工作進程;
可定制的訪問日志,日志寫入緩存,以及快捷的日志回卷;
4xx-5xx 錯誤代碼重定向;
基于 PCRE 的 rewrite 重寫模塊;
帶寬限制
占用CPU內存少,并發能力強
支持負載均衡,支持容錯和健康檢查
提高訪問速度
起到了緩存的作用,尤其對于熱門站點能明顯提高請求速度。
防火墻作用(訪問安全控制)
可在代理服務器上設限,過濾某些不安全信息。防止外網對內網服務器的惡性***
1、轉發功能
按照一定的算法,將客戶端請求轉發到不同應用服務器上,提高系統并發量
分發策略有輪詢、權重、ip_哈希算法
權重:指定輪詢幾率,權重和訪問比率成正比,用于應用服務器性能不均的情況。
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個應用服務器,可以解決session共享的問題。
2、故障移除(通過心跳檢測的方式,判斷應用服務器當前是否可以正常工作,如果服務器期宕掉,自動將請求發送到其他應用服務器)
3、恢復添加(如檢測到發生故障的應用服務器恢復工作,自動將其添加到處理用戶請求隊伍中)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。